Dim OUT1
Private Sub Worksheet_Change(ByVal Target As Range)
If OUT1 = True Then Exit Sub
If Target.Height > 10000 Then Exit Sub
If Target.Width > 10000 Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Target.Row > 1 Then Exit Sub
If Target.Column = 11 Then
ElseIf Target.Column = 14 Then
ElseIf Target.Column = 17 Then
ElseIf Target.Column = 20 Then
Else
Exit Sub
End If
OUT1 = True
Target.Offset(1, 0).Resize(100000, 2).ClearContents
OUT1 = False
r = Cells(Rows.Count, 1).End(3).Row
For i = 2 To r
If UCase(Target.Value) = UCase(Cells(i, 3).Value) Then
OUT1 = True
For j = i To Cells(i, 3).MergeArea.Count + i - 1
w = w + 1
Target.Offset(w, 0).Resize(1, 2).Value = Cells(j, 4).Resize(1, 2).Value
sumx = sumx + Cells(j, 5)
Next
End If
Next
If w <> 0 Then Target.Offset(w + 1, 0).Resize(1, 2) = Array("Total", sumx)
OUT1 = False
End Sub作者: 198188 時間: 2023-12-21 09:21
若想要打完再手動執行用如下代碼
Sub test()
r = Cells(Rows.Count, 1).End(3).Row
Range("k2:u1000").ClearContents
For Each Z In Range("K1,N1,Q1,T1")
t5 = 0: t4 = 0
If Z.Value <> "" Then
For i = 2 To r
If UCase(Z.Value) = UCase(Cells(i, 3).Value) Then
For j = i To Cells(i, 3).MergeArea.Count + i - 1
t4 = t4 & "▲" & Cells(j, 4)
t5 = t5 & "▲" & Cells(j, 5)
tsum = tsum + Cells(j, 5)
Next
End If
Next
If UBound(a4) > 0 Then
Z.Offset(1, 0).Resize(UBound(a4) + 1, 1) = Application.Transpose(a4)
Z.Offset(1, 1).Resize(UBound(a4) + 1, 1) = Application.Transpose(a5)
End If
End If
Next
vb
Copy code
Sub test()
' 獲取最後一行的行號
r = Cells(Rows.Count, 1).End(xlUp).Row
' 清除K2到U1000範圍內的所有內容
Range("k2:u1000").ClearContents
' 遍歷K1, N1, Q1, T1這四列的單元格
For Each Z In Range("K1,N1,Q1,T1")
t5 = 0: t4 = 0 ' 初始化變量
' 如果當前單元格有值
If Z.Value <> "" Then
' 遍歷2到最後一行
For i = 2 To r
' 如果當前列的值與C列的值相同(不區分大小寫)
If UCase(Z.Value) = UCase(Cells(i, 3).Value) Then
' 遍歷合併區域的每一行
For j = i To Cells(i, 3).MergeArea.Count + i - 1
t4 = t4 & "▲" & Cells(j, 4)
t5 = t5 & "▲" & Cells(j, 5)
tsum = tsum + Cells(j, 5)
Next
End If
Next
' 如果數組有資料
If UBound(a4) > 0 Then
' 將數據填充到指定的單元格區域
Z.Offset(1, 0).Resize(UBound(a4) + 1, 1) = Application.Transpose(a4)
Z.Offset(1, 1).Resize(UBound(a4) + 1, 1) = Application.Transpose(a5)
End If
End If
Next
End Sub
請注意,這段代碼是基於假定貨架序號列(C列)的合併區域可以通過 .MergeArea.Count 正確獲得。另外,這段代碼使用了 UCase 函數來進行不區分大小寫的比較。如果您的貨架序號區分大小寫,則不應使用 UCase 函數。作者: Andy2483 時間: 2023-12-26 10:26
我想了一個規則:
首先BF sheet 是讀取的資料,Demo 是一個固定的模板。
1. 根據BF 的 A 欄的數據,�堶捲{在有#001 - #009 ,那麽就複製9個Demo, Sheet Name 按照#001-#009 來命名。 如 “ Result BF 工程#001”,“ Result BF 工程#002”,“ Result BF 工程#003”如此類推。
2. 讀取BF �堶惇衈釭爾禤い魽A“ Result BF 工程#001”,“ Result BF 工程#002”,“ Result BF 工程#003”等sheet
貨櫃號:BF工程#001, BF工程#002, BF工程#003, BF工程#004 。。。
貨櫃尺寸:45HC, 40HC, 20GP 根據A欄資料來讀取
出貨日期:根據A欄資料來讀取
制表日:執行VBA當天
欄C - 欄D 抽取欄B �堶悸爾禤�
欄E - 欄F 抽取欄C �堶悸爾禤�
欄G - 欄H 抽取欄D �堶悸爾禤�
欄 I - 欄 J 抽取欄E �堶悸爾禤�
欄K - 欄L 抽取欄F �堶悸爾禤�作者: Andy2483 時間: 2023-12-30 14:51
本帖最後由 Andy2483 於 2023-12-30 14:53 編輯
回復 20#198188
謝謝前輩再回復新範例,以下是學習的方案,請前輩參考
Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Brr, Crr, Ar, Arr, V, Z, A, i&, R&, C%, j%, T$, K$, Qs$, Qd$, No$, Mk$, Q$
For i = Worksheets.Count To 3 Step -1: Worksheets(i).Delete: Next
Set Z = CreateObject("Scripting.Dictionary")
Brr = Union(Sheets(1).UsedRange, Sheets(1).UsedRange.Offset(1))
Crr = Range(Sheets(2).[A1], Sheets(2).UsedRange): K = [B1]
For i = 1 To UBound(Brr) - 1
If InStr(Brr(i, 1), Left(K, 4)) = 0 Then GoTo i01
A = Split(Replace(Brr(i, 1), " ", " "), " "): Q = Left(A(0), 8): Qd = A(1)
If UBound(A) > 1 Then Qs = A(UBound(A)) Else Qs = ""
A = Z(Q): R = Z(Q & "/r"): C = 1
If Not IsArray(A) Then A = Crr: A(3, 2) = Q: A(3, 6) = Qs: A(3, 9) = Qd: A(4, 13) = Date: R = 5
R = R + 1: V = A(R, 2)
If InStr(Brr(i, 2), V) = 0 Or R = 10 Then GoTo i01
For j = 2 To UBound(Brr, 2)
C = C + 2: T = Trim(Brr(i, j)): If T = "" Then GoTo j01
If InStr(T, V) Then
A(R, C) = Mid(T, 4, 6): A(R, C + 1) = Replace(Mid(T, 11), ")", "")
Else
Ar = Split(T, Chr(10))
For Each Arr In Ar
If Not Split(Arr & " ", " ")(1) Like "[A-z][A-z]" Then GoTo j01
No = No & Chr(10) & Split(Arr, " ")(0)
Mk = Mk & Chr(10) & Mid(Arr, InStr(Arr, Split(Arr, " ")(1)))
Next
A(R, C) = Mid(No, 2): A(R, C + 1) = Mid(Mk, 2): No = "": Mk = ""
End If
j01: Next
Z(Q) = A: Z(Q & "/r") = R
i01: Brr(i + 1, 1) = IIf(Brr(i + 1, 1) = "", Brr(i, 1), Brr(i + 1, 1))
Next
If Z.Count = 0 Then Exit Sub
For Each A In Z.KEYS
If Not IsArray(Z(A)) Then GoTo A01
With Sheets(2).Copy(after:=Worksheets(Sheets.Count))
ActiveSheet.Name = "Result " & A
[A1].Resize(UBound(Z(A)), UBound(Z(A), 2)) = Z(A)
End With
A01: Next
Application.Goto Sheets(1).[A1]
End Sub作者: 198188 時間: 2024-1-2 13:53
Option Explicit
Sub Map()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Brr, Crr, Ar, Arr, V, Z, A, i&, R&, C%, j%, T$, K$, Qs$, Qd$, No$, Mk$, Q$, S%
For i = Worksheets.Count To 4 Step -1: Worksheets(i).Delete: Next
Set Z = CreateObject("Scripting.Dictionary")
Brr = Sheets(3).UsedRange
For i = 1 To UBound(Brr): Z(Trim(Brr(i, 1))) = Trim(Brr(i, 2)): Next: S = Z.Count
Brr = Union(Sheets(1).UsedRange, Sheets(1).UsedRange.Offset(1))
Crr = Range(Sheets(2).[A1], Sheets(2).UsedRange): K = [B1]
For i = 1 To UBound(Brr) - 1
If InStr(Brr(i, 1), Left(K, 4)) = 0 Then GoTo i01
A = Split(Replace(Brr(i, 1), " ", " "), " "): Q = Mid(A(0), 5, 4): Qd = A(1)
If UBound(A) > 1 Then Qs = A(UBound(A)) Else Qs = ""
A = Z(Q): R = Z(Q & "/r"): C = 1
If Not IsArray(A) Then A = Crr: A(3, 2) = Q: A(3, 6) = Qs: A(3, 9) = Qd: A(4, 13) = Date: R = 5
R = R + 1: V = A(R, 2)
If InStr(Brr(i, 2), V) = 0 Or R = 10 Then GoTo i01
For j = 2 To UBound(Brr, 2)
C = C + 2: T = Trim(Brr(i, j)): If T = "" Then GoTo j01
If InStr(T, V) Then
A(R, C) = Mid(T, 4, 6): A(R, C + 1) = Replace(Mid(T, 11), ")", "")
Else
Ar = Split(T, Chr(10))
For Each Arr In Ar
If Not Split(Arr & " ", " ")(1) Like "[A-z][A-z]" Then GoTo j01
No = No & Chr(10) & Split(Arr, " ")(0): Mk = Mk & Chr(10) & Mid(Arr, InStr(Arr, Split(Arr, " ")(1)))
Next
A(R, C) = Mid(No, 2): A(R, C + 1) = Mid(Mk, 2): No = "": Mk = ""
End If
j01: Next
Z(Q) = A: Z(Q & "/r") = R
i01: Brr(i + 1, 1) = IIf(Brr(i + 1, 1) = "", Brr(i, 1), Brr(i + 1, 1))
Next
If Z.Count = 0 Then Exit Sub
For Each A In Z.KEYS
If Not IsArray(Z(A)) Then GoTo A01 Else Sheets(2).Copy After:=Worksheets(Sheets.Count)
ActiveSheet.Name = A '"Result " & A
[A1].Resize(UBound(Z(A)), UBound(Z(A), 2)) = Z(A)
For i = 0 To S - 1: ActiveSheet.UsedRange.Replace Z.KEYS()(i), Z.ITEMS()(i), Lookat:=xlPart: Next
A01: Next
Application.Goto Sheets(1).[A1]
End Sub作者: 198188 時間: 2024-1-3 14:33