Sub test()
r = Cells(Rows.Count, 1).End(3).Row
c = 7
Range("H2:J1000").ClearContents
For i = 3 To r
If Cells(i, 1).Value <> "" Then
tx = Split(Cells(i, 1).Value, " ")(0)
mr = Cells(i, 1).MergeArea.Count
If mr > 0 Then
For Each Z In Cells(i, 2).Resize(mr - 1, 5)
If UCase(Z.Value) Like "*SR*" Then
sp = Split(Z.Value, "(")(0)
sp = Replace(sp, "上架", "")
sp = Replace(sp, "下架", "")
sp = Replace(sp, " ", "")
tx = tx & "▲" & sp
End If
Next
c = c + 1
sp0 = Split(tx, "▲")
Cells(2, c).Resize(UBound(sp0) + 1, 1) = Application.Transpose(sp0)
End If
End If
Next
End Sub作者: 198188 時間: 2023-12-22 09:15
' 從第三行開始迴圈,直到最後一個非空行
For i = 3 To r
' 檢查當前行第一列的單元格是否不為空
If Cells(i, 1).Value <> "" Then
' 通過分割單元格值並取第一個元素來提取任務代碼
tx = Split(Cells(i, 1).Value, " ")(0)
' 確定當前單元格合併區域的數量
mr = Cells(i, 1).MergeArea.Count
' 如果存在合併的單元格
If mr > 0 Then
' 遍歷合併區域中的每個單元格,排除第一個單元格(因此使用mr - 1)
For Each Z In Cells(i, 2).Resize(mr - 1, 5)
' 如果單元格包含"SR"字樣
If UCase(Z.Value) Like "*SR*" Then
' 分割值以獲取SR編號,去除括號
sp = Split(Z.Value, "(")(0)
' 從SR編號中移除"上架"、"下架"和空格
sp = Replace(sp, "上架", "")
sp = Replace(sp, "下架", "")
sp = Replace(sp, " ", "")
' 用"▲"作為分隔符,將SR編號附加到任務代碼後面
tx = tx & "▲" & sp
End If
Next
' 移動到下一列輸出位置
c = c + 1
' 通過分隔符"▲"分割編譯後的任務代碼和SR編號
sp0 = Split(tx, "▲")
' 將SR編號數組轉置並從當前列開始寫入工作表
Cells(2, c).Resize(UBound(sp0) + 1, 1) = Application.Transpose(sp0)
End If
End If
Next
End Sub
這段VBA宏的目的是將任務列表中的“SR”編號根據第一列指定的任務整理到不同的列中。它會先清除指定範圍的內容,接著處理資料並分割字串,最後將整理好的輸出轉置至工作表中。這些註解應該能幫助你理解這個宏的邏輯和流程。作者: 准提部林 時間: 2023-12-23 14:45
使用陣列處理//A欄不合併也可以..只認非空
Sub Test_A1()
Dim Arr, Brr, i&, j%, R&, Rx&, C%, X%, T$
Arr = Range([f1], [a65536].End(3).MergeArea)
ReDim Brr(1 To UBound(Arr) * 5, 1 To 99)
For i = 3 To UBound(Arr)
T = Split(Arr(i, 1) & " ", " ")(0)
If T Like "BF工程[#]###" Then C = C + 1: R = 1: Brr(R, C) = T
For j = 2 To UBound(Arr, 2)
T = Split(Arr(i, j) & " ", " ")(1)
If T Like "SR####(*" Then R = R + 1: Brr(R, C) = Split(T, "(")(0)
Next j
If R > Rx Then Rx = R
Next i
With Range("H2")
.CurrentRegion.Clear
.Resize(Rx, C) = Brr
End With
End Sub作者: Andy2483 時間: 2023-12-25 15:03
因爲繁簡體問題,導致亂碼,導致無法運行。 因爲沒有原文,我無法修正亂碼部分。可否發一下原文給我修正。
Sub 戈()
Dim Arr, Xrr, Yrr, i&, j%, V, T$, T1$, TR, x&, y&
Call 睲埃戈
Arr = Range([L1], [A65536].End(xlUp).MergeArea)
ReDim Xrr(1 To UBound(Arr), 1 To 7)
ReDim Yrr(1 To UBound(Arr), 1 To 4)
For i = 15 To UBound(Arr)
T = Arr(i, 1): V = Val(Arr(i, 10))
If T Like "*L *W *H *" Then
TR = Split(T, Chr(10)): T1 = Trim(TR(0))
x = x + 1
Xrr(x, 1) = T 'A 逆Τデ计沮
Xrr(x, 2) = T1 '砯琜腹
Xrr(x, 3) = Arr(i, 2) 'N.W.(瞓)
Xrr(x, 4) = Arr(i, 3) 'G.W.(メ)
Xrr(x, 5) = Val(Mid(TR(3), 2)) 'W
Xrr(x, 6) = Val(Mid(TR(2), 2)) 'L
Xrr(x, 7) = Val(Mid(TR(4), 2)) 'H
End If
'----------------------------------
If T1 <> "" And Arr(i, 6) <> "" And V <> 0 Then
y = y + 1
Yrr(y, 1) = T1 '砯琜腹
Yrr(y, 2) = Arr(i, 7) '竚
Yrr(y, 3) = Arr(i, 6) 'ォ甧
Yrr(y, 4) = V '计秖
End If
i01: Next i
If x = 0 Then Exit Sub
With [N3].Resize(x, 7)
.Value = Xrr
.Borders.LineStyle = 1
.WrapText = False
End With
With [v3].Resize(y, 4)
.Value = Yrr
.Borders.LineStyle = 1
End With
End Sub
Sub 睲埃?)
Range([T3], [N65536].End(xlUp)(3)).Delete Shift:=xlUp
Range([Y3], [V65536].End(xlUp)(3)).Delete Shift:=xlUp
End Sub作者: 198188 時間: 2024-1-2 10:09
Sub ╊ク()
Attribute ╊ク.VB_Description = "矗场狶 2024/1/1 魁籹リ栋"
Attribute ╊ク.VB_ProcData.VB_Invoke_Func = " \n14"
Dim Arr, Brr, Drr, Xrr, Yrr, xD, xS As Worksheet, vS As Worksheet, R&, S$, T$, i&, j&, k%, x&, y%, N&
Call 埃
Set xD = CreateObject("Scripting.Dictionary")
Set vS = Sheets("逼琜"): Xrr = vS.[a8:f8]
Arr = Range(vS.[b1], vS.[d65536].End(xlUp))
For i = 9 To UBound(Arr)
T = Arr(i, 2)
If T Like "SR####" Then xD(T) = vS.Cells(i, 2).MergeArea.Resize(, 5).Value
Next i
'-----------------------------
Set xS = Sheets("BF")
Arr = Range(xS.[f1], xS.[a65536].End(xlUp).MergeArea)
For i = 2 To UBound(Arr)
If Arr(i, 1) Like "BF祘[#]###*" Then
S = Mid(Arr(i, 1), 5, 4): N = 0
Brr = xS.Cells(i, 1).MergeArea.Resize(, 5).Value
ReDim Yrr(1 To 2000, 1 To 6)
N = N + 1
For y = 1 To 6: Yrr(N, y) = Xrr(1, Mid(123645, y, 1)): Next
For j = 1 To UBound(Brr)
For k = 2 To UBound(Brr, 2)
If Brr(j, k) Like "*琜*SR####*" Then
T = Mid(Brr(j, k), 4, 6)
Drr = xD(T)
If IsArray(Drr) Then
For x = 1 To UBound(Drr)
N = N + 1
Yrr(N, 1) = "=row()-1"
Yrr(N, 2) = Drr(1, 1)
Yrr(N, 3) = Drr(1, 2)
Yrr(N, 4) = Drr(1, 5)
Yrr(N, 5) = Drr(1, 3)
Yrr(N, 6) = Drr(1, 4)
Next x
End If
End If
Next k
Next j
'-----------------------------------
If N <= 1 Then GoTo i01
Set vS = Sheets.Add(after:=vS): vS.Name = S
With vS.[a1].Resize(N, 6)
.Value = Yrr
.Borders.LineStyle = 1
.Sort Key1:=.Item(3), Order1:=xlAscending, _
Key2:=.Item(4), Order2:=xlAscending, _
Key3:=.Item(2), Order3:=xlAscending, Header:=xlYes
T = "'" & S & "'!" & .Address
End With
'-----------------------------------
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=T).CreatePivotTable TableDestination:=vS.Range("i1"), TableName:="Pvt_1"
vS.PivotTables("Pvt_1").AddFields RowFields:=vS.Range("C1"), ColumnFields:=vS.Range("d1")
vS.PivotTables("Pvt_1").PivotFields(vS.Range("F1").Text).Orientation = xlDataField
End If
Application.CommandBars("PivotTable").Visible = False
i01: Next i
End Sub
Sub 埃()
Dim xS As Worksheet
Application.DisplayAlerts = False
For Each xS In Sheets
If xS.Name Like "[#]###" Then xS.Delete
Next
End Sub
Sub ttt()
MsgBox Val("11 22")
End Sub
Sub Macro2()
'
' Macro2 リ栋
' 矗场狶 2024/1/1 魁籹リ栋
'
Sub 取出資料()
Dim Arr, Xrr, Yrr, i&, j%, V, T$, T1$, TR, x&, y&
Call 清除資料
Arr = Range([L1], [A65536].End(xlUp).MergeArea)
ReDim Xrr(1 To UBound(Arr), 1 To 7)
ReDim Yrr(1 To UBound(Arr), 1 To 4)
For i = 15 To UBound(Arr)
T = Arr(i, 1): V = Val(Arr(i, 10))
If T Like "*L *W *H *" Then
TR = Split(T, Chr(10)): T1 = Trim(TR(0))
x = x + 1
Xrr(x, 1) = T 'A 欄有尺寸的數據
Xrr(x, 2) = T1 '貨架號
Xrr(x, 3) = Arr(i, 2) 'N.W.(淨重)
Xrr(x, 4) = Arr(i, 3) 'G.W.(毛重)
Xrr(x, 5) = Val(Mid(TR(3), 2)) 'W
Xrr(x, 6) = Val(Mid(TR(2), 2)) 'L
Xrr(x, 7) = Val(Mid(TR(4), 2)) 'H
End If
'----------------------------------
If T1 <> "" And Arr(i, 6) <> "" And V <> 0 Then
y = y + 1
Yrr(y, 1) = T1 '貨架號
Yrr(y, 2) = Arr(i, 7) '位置
Yrr(y, 3) = Arr(i, 6) '內容
Yrr(y, 4) = V '數量
End If
i01: Next i
If x = 0 Then Exit Sub
With [N3].Resize(x, 7)
.Value = Xrr
.Borders.LineStyle = 1
.WrapText = False
End With
With [v3].Resize(y, 4)
.Value = Yrr
.Borders.LineStyle = 1
End With
End Sub
Sub 清除資料()
Range([T3], [N65536].End(xlUp)(3)).Delete Shift:=xlUp
Range([Y3], [V65536].End(xlUp)(3)).Delete Shift:=xlUp
End Sub作者: 准提部林 時間: 2024-1-2 14:17
<排架表>
Sub 拆分工作表()
Dim Arr, Brr, Drr, Xrr, Yrr, xD, xS As Worksheet, vS As Worksheet, R&, S$, T$, i&, j&, k%, x&, y%, N&
Call 刪除工作表
Set xD = CreateObject("Scripting.Dictionary")
Set vS = Sheets("排架表"): Xrr = vS.[a8:f8]
Arr = Range(vS.[b1], vS.[d65536].End(xlUp))
For i = 9 To UBound(Arr)
T = Arr(i, 2)
If T Like "SR####" Then xD(T) = vS.Cells(i, 2).MergeArea.Resize(, 5).Value
Next i
'-----------------------------
Set xS = Sheets("BF")
Arr = Range(xS.[f1], xS.[a65536].End(xlUp).MergeArea)
For i = 2 To UBound(Arr)
If Arr(i, 1) Like "BF工程[#]###*" Then
S = Mid(Arr(i, 1), 5, 4): N = 0
Brr = xS.Cells(i, 1).MergeArea.Resize(, 5).Value
ReDim Yrr(1 To 2000, 1 To 6)
N = N + 1
For y = 1 To 6: Yrr(N, y) = Xrr(1, Mid(123645, y, 1)): Next
For j = 1 To UBound(Brr)
For k = 2 To UBound(Brr, 2)
If Brr(j, k) Like "*架*SR####*" Then
T = Mid(Brr(j, k), 4, 6)
Drr = xD(T)
If IsArray(Drr) Then
For x = 1 To UBound(Drr)
N = N + 1
Yrr(N, 1) = "=row()-1"
Yrr(N, 2) = Drr(1, 1)
Yrr(N, 3) = Drr(1, 2)
Yrr(N, 4) = Drr(1, 5)
Yrr(N, 5) = Drr(1, 3)
Yrr(N, 6) = Drr(1, 4)
Next x
End If
End If
Next k
Next j
'-----------------------------------
If N <= 1 Then GoTo i01
Set vS = Sheets.Add(after:=vS): vS.Name = S
With vS.[a1].Resize(N, 6)
.Value = Yrr
.Borders.LineStyle = 1
.Sort Key1:=.Item(3), Order1:=xlAscending, _
Key2:=.Item(4), Order2:=xlAscending, _
Key3:=.Item(2), Order3:=xlAscending, Header:=xlYes
T = "'" & S & "'!" & .Address
End With
'-----------------------------------
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=T).CreatePivotTable TableDestination:=vS.Range("i1"), TableName:="Pvt_1"
vS.PivotTables("Pvt_1").AddFields RowFields:=vS.Range("C1"), ColumnFields:=vS.Range("d1")
vS.PivotTables("Pvt_1").PivotFields(vS.Range("F1").Text).Orientation = xlDataField
End If
Application.CommandBars("PivotTable").Visible = False
i01: Next i
End Sub
Sub 刪除工作表()
Dim xS As Worksheet
Application.DisplayAlerts = False
For Each xS In Sheets
If xS.Name Like "[#]###" Then xS.Delete
Next
End Sub作者: 198188 時間: 2024-1-2 16:16