返回列表 上一主題 發帖

[發問] 讀取及歸類資料

<送貨單>

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

TOP

回復 12# 准提部林
因爲繁簡體問題,導致亂碼,導致無法運行。 因爲沒有原文,我無法修正亂碼部分。可否發一下原文給我修正。

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 魁籹リ栋
'

'
'   Columns("B:F").Select
  ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:="'#001'!C1:f86").CreatePivotTable TableDestination:=Range("i1"), TableName:="枷ク猂1"
    'ActiveSheet.PivotTables("枷ク猂1").SmallGrid = False
    ActiveSheet.PivotTables("枷ク猂1").AddFields RowFields:=Range("C1"), ColumnFields:=Range("d1")
    ActiveSheet.PivotTables("枷ク猂1").PivotFields(Range("F1").Text).Orientation = xlDataField
End Sub

TOP

回復 11# 准提部林

因爲繁簡體問題,導致亂碼,導致無法運行。 因爲沒有原文,我無法修正亂碼部分。可否發一下原文給我修正。
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

TOP

回復 9# 198188

排架表..迴圈多層, 自行研究//
Xl0000114-排架表.rar (83.4 KB)

TOP

回復 9# 198188

先給"送貨單"//
程式碼沒什特別~~
Xl0000113-送貨單.rar (157.61 KB)

TOP

回復 7# 198188


執行沒問題!!!
split 用來分割文字, "(" 是分割符

TOP

排架表.rar (571.34 KB) 送貨單.rar (177.03 KB) 回復 5# 准提部林

送貨單
根據每個sheet  從左邊送貨單資料抽取資料,複製到右邊。
根據A欄的資料複製有尺寸的資料到N欄,同時複製欄B到欄P & 欄C到欄Q然後把這欄的資料分割開到欄O, R, S, T,
之後複製欄O到欄V , 然後根據欄O的貨架號讀取欄G 到欄W, 欄F 到欄X, 欄J到欄Y

排架表
根據BF �媊澉的資料,有#001 - #009 (這個不固定有多少個)複雜新的SHEET 以#001 - #009 分別命名
BF �媊澉 的#001 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #001 �堶情A然後做一個樞紐分析表
BF �媊澉 的#002 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #002�堶情A然後做一個樞紐分析表
BF �媊澉 的#003 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #003�堶情A然後做一個樞紐分析表
BF �媊澉 的#004 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #004�堶情A然後做一個樞紐分析表
如此類推

TOP

排架表.rar (571.34 KB) 送貨單.rar (177.03 KB) 回復 2# singo1232001


送貨單
根據每個sheet  從左邊送貨單資料抽取資料,複製到右邊。
根據A欄的資料複製有尺寸的資料到N欄,同時複製欄B到欄P & 欄C到欄Q然後把這欄的資料分割開到欄O, R, S, T,
之後複製欄O到欄V , 然後根據欄O的貨架號讀取欄G 到欄W, 欄F 到欄X, 欄J到欄Y

排架表
根據BF �媊澉的資料,有#001 - #009 (這個不固定有多少個)複雜新的SHEET 以#001 - #009 分別命名
BF �媊澉 的#001 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #001 �堶情A然後做一個樞紐分析表
BF �媊澉 的#002 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #002�堶情A然後做一個樞紐分析表
BF �媊澉 的#003 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #003�堶情A然後做一個樞紐分析表
BF �媊澉 的#004 ,�堶惘酗@些SR****,根據這些SR**** 讀取排架表�堶悸爾禤すしs到SHEET #004�堶情A然後做一個樞紐分析表
如此類推

TOP

回復 5# 准提部林

執行時,到    Brr(R, C) = Split(T, "(")(0)這�堨X錯。
能不能注釋一下程式的意思,方便我可以學習,謝謝!

test1.rar (16.79 KB)

TOP

本帖最後由 Andy2483 於 2023-12-26 08:36 編輯

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教
執行前:


執行結果:


Option Explicit
Sub TEST()
Dim 資料陣列, 空陣列, 字典, 代號$, i&, j%, 結果列號&, 結果欄號%, 結果欄數%, 最大列數%, 工程別$, 關鍵字$
Set 字典 = CreateObject("Scripting.Dictionary")
關鍵字 = Left([B2], 4)
資料陣列 = Range([F3], [B65536].End(3)(2, 0))
ReDim 空陣列(1 To 1000, 1 To 100)
For i = 1 To UBound(資料陣列) - 1
   If InStr(資料陣列(i, 1), 關鍵字) = 0 Then GoTo i01
   結果欄號 = IIf(工程別 <> 資料陣列(i, 1), 結果欄號 + 1, 結果欄號)
   字典(i) = 結果欄號
   工程別 = 資料陣列(i, 1)
   字典(結果欄號 & "/r") = 1
   空陣列(1, 結果欄號) = Split(資料陣列(i, 1), " ")(0)
   資料陣列(i + 1, 1) = IIf(資料陣列(i + 1, 1) = "", 資料陣列(i, 1), 資料陣列(i + 1, 1))
i01: Next
結果欄數 = 結果欄號
For j = 2 To UBound(資料陣列, 2)
   For i = 1 To UBound(資料陣列)
      代號 = Split(資料陣列(i, j) & " ", " ")(1)
      If Not 代號 Like "[A-Z][A-Z]####*" Or 字典(i) = 0 Then GoTo i02
      結果欄號 = 字典(i)
      結果列號 = 字典(結果欄號 & "/r")
      結果列號 = 結果列號 + 1: 字典(結果欄號 & "/r") = 結果列號
      空陣列(結果列號, 字典(i)) = Left(代號, 6)
      If 最大列數 < 結果列號 Then 最大列數 = 結果列號
i02: Next
Next
With [H2]
     .CurrentRegion.ClearContents
     .Resize(最大列數, 結果欄數) = 空陣列
End With
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 並非有錢魷是快樂,問心無愧心最安。
返回列表 上一主題