返回列表 上一主題 發帖

[發問] 讀取及歸類資料

[發問] 讀取及歸類資料

左邊是資料檔,右邊是結果
根據左邊的每個櫃的排列表,在右邊分別顯示出每個櫃的明細SR號碼

1.jpg
2023-12-20 11:53

test1.rar (8.85 KB)

回復 1# 198188


    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

TOP

回復 2# singo1232001


        非常感謝!能不能有注釋一下,這樣我可以更好理解每句用意,如果格式或者表格有變動,也可以自己做出修改。:handshake

TOP

回復 3# 198188

GPT4
Sub test()
    ' 定義變量並初始化變量r為第一列最後一個非空行的行號
    r = Cells(Rows.Count, 1).End(xlUp).Row
    ' 初始化輸出起始的列號c為第7列(即G列)
    c = 7

    ' 清除從H2到J1000的內容,為新的輸出做準備
    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
                ' 遍歷合併區域中的每個單元格,排除第一個單元格(因此使用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”編號根據第一列指定的任務整理到不同的列中。它會先清除指定範圍的內容,接著處理資料並分割字串,最後將整理好的輸出轉置至工作表中。這些註解應該能幫助你理解這個宏的邏輯和流程。

TOP

使用陣列處理//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

TOP

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

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教
執行前:
20231225_1.jpg
2023-12-25 14:59


執行結果:
20231225_2.jpg
2023-12-25 15:00


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

回復 5# 准提部林

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

test1.rar (16.79 KB)

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

排架表.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

回復 7# 198188


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

TOP

        靜思自在 : 為自己找藉口的人永遠不會進步。
返回列表 上一主題