返回列表 上一主題 發帖

[發問] vlookup合并的資料

GPT4
在您提供的圖片中,左側是一個資料列表,右側是一個匯總結果。這個列表似乎是用於追踪庫存或貨架上的物品。貨架序號在某些行是合併的,且合併的行數不固定。您希望能夠像右邊展示的那樣,通過輸入貨架序號,直接將相關資料轉移到右側。

提供的代碼是一個 Excel 宏,用於處理這種類型的資料轉移。代碼進行了如下操作:

確定數據範圍。
清除目標範圍(K2:U1000)的內容。
遍歷特定的列(K1, N1, Q1, T1),這些列似乎是用來指定不同的貨架序號。
對於每個指定的貨架序號,代碼尋找左側列表中所有匹配的行。
將匹配行中的資料複製到右側的相應位置。
計算並添加總數到最後。
注釋您的代碼,以便於理解每一部分的功能:

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
            
            ' 切割字符串獲取資料數組
            a4 = Split(Mid(t4 & "▲Total", 3, 9999), "▲")
            a5 = Split(Mid(t5 & "▲" & tsum, 3, 9999), "▲")
            
            ' 如果數組有資料
            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 函數。

TOP

本帖最後由 Andy2483 於 2023-12-26 13:50 編輯

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


執行結果:


Option Explicit
Sub TEST_A()
Dim 資料陣列, 空陣列(1 To 1000, 1 To 2), 字典關鍵字, 字典, 貨架序號, i&, 結果陣列
Dim 結果起始格 As Range, 結果陣列列號&
Set 字典 = CreateObject("Scripting.Dictionary")
ActiveSheet.UsedRange.Offset(, 10).EntireColumn.Delete
Set 結果起始格 = [K1]
資料陣列 = Range([E2], [D65536].End(xlUp)(2, 0))
For i = 1 To UBound(資料陣列) - 1
   If 貨架序號 <> 資料陣列(i, 1) Then 貨架序號 = 資料陣列(i, 1)
   If 資料陣列(i + 1, 1) = "" Then 資料陣列(i + 1, 1) = 貨架序號
   貨架序號 = 資料陣列(i, 1): 結果陣列 = 字典(貨架序號): 結果陣列列號 = 字典(貨架序號 & "/r")
   If Not IsArray(結果陣列) Then 結果陣列 = 空陣列
   結果陣列列號 = 結果陣列列號 + 1
   結果陣列(結果陣列列號, 1) = 資料陣列(i, 2): 結果陣列(結果陣列列號, 2) = 資料陣列(i, 3)
   字典(貨架序號 & "/r") = 結果陣列列號: 字典(貨架序號) = 結果陣列
Next
For Each 字典關鍵字 In 字典.keys
   If Not IsArray(字典(字典關鍵字)) Then GoTo V01
   結果起始格 = 字典關鍵字
   With 結果起始格(2, 1).Resize(字典(字典關鍵字 & "/r"), 2)
      .Value = 字典(字典關鍵字)
      .Borders.LineStyle = 1
      .Cells(.Count + 1) = "Total"
      .Cells(.Count + 2) = "=SUM(" & .Columns(2).Address & ")"
   End With
   Set 結果起始格 = 結果起始格(, 4)
V01: Next
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 11# singo1232001
感謝注釋,請問    ▲是什麽用途?我每次輸入變成亂碼,是否可以更改其他?

TOP

回復 13# 198188


    切割區隔用而已
可能是big5 轉utf-8異常
把三角型 改成兩個;;好了

TOP

回復 14# singo1232001


   謝謝。
如果想直接抽取該儲存格内含有SR字眼,然後抽出SR及後面四個數值,例如SR2003 及 SR2002 ,這句如何用程式表達?
上架 SR2003(02F单元)
下架 SR2002(02F单元)

TOP

回復 12# Andy2483

其實我主要的目的是將附件,根據 BF 裏的排櫃表,製造成BF#001-009的排櫃表。
如果我想根據下面條件讀取資料。
如果儲存格内有”SR“, 一欄就抽取SR+后4個數值 ,另一欄就抽取()括號内的内容
如果儲存格内沒有“SR”, 一欄就抽取第一個空格前的數值 ,另一欄就抽取第一個空格后的數字。

舉例
上架 SR2005(02F单元)
上架 SR2023(03F单元)
2310100528 BF GL3A-001 LAMINATED GLASS UNIT =3PCS
2311160356 AA REPLACEMENT INSULATED GLASS=1pc
2311181293 AA REPLACEMENT INSULATED GLASS=1pc

第一欄                                第二欄
SR2005                              02F单元
SR2023                              03F单元
2310100528                     BF GL3A-001 LAMINATED GLASS UNIT =3PCS
2311160356                     AA REPLACEMENT INSULATED GLASS=1pc
2311181293                     AA REPLACEMENT INSULATED GLASS=1pc

活頁簿1.rar (26.45 KB)

TOP

回復 9# singo1232001

因爲要的數據數量不固定。如果是想直接把C欄的貨架序號,全部自動讀取,不是自己輸入貨架序號呢?
舉例1
SR2000                         SR2000     SR2001     SR2002      SR2003
SR2001
SR2002
SR2003

舉例2
SR2000                         SR2000     SR2001     SR2002    SR2003     SR2004    SR2005
SR2001
SR2002
SR2003
SR2004
SR2005

TOP

回復 16# 198188

1.45HQ = 45'高櫃, 沒有 45HQ的櫃 也標 45'高櫃 這樣沒有規則

2.[E31],[E45],[E59]=4.8m 在結果表消失了,規則不明
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 198188 於 2023-12-29 16:43 編輯

[attach]37201[/attach]
回復  198188

1.45HQ = 45'高櫃, 沒有 45HQ的櫃 也標 45'高櫃 這樣沒有規則

2.[E31],[E45],[E59]=4 ...
Andy2483 發表於 2023-12-29 16:16


上面的資料不需要,只是想圖一裏的資料傳入圖二裏的表格内

1.jpg (59.75 KB)

1.jpg

2.jpg (75.88 KB)

2.jpg

TOP

本帖最後由 198188 於 2023-12-30 09:07 編輯

更新版.rar (50.59 KB) 回復 18# Andy2483

我想了一個規則:
首先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 裏面相應的資料到,“ 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 裏面的資料

TOP

        靜思自在 : 犯錯出懺悔心,才能清淨無煩惱。
返回列表 上一主題