返回列表 上一主題 發帖

[發問] VBA計算箱子號碼

回復 10# john2006168

請再測試看看,感謝。

Sub test2()
Dim Arr, xD, TT, T, T2, T3, N%, i&
Set xD = CreateObject("Scripting.Dictionary")
Arr = [A1].CurrentRegion   '資料放入數組
For i = 2 To UBound(Arr)
    'T:E欄資料、T2:B欄、T3:C欄
    T = Arr(i, 5): T2 = Arr(i, 2): T3 = Arr(i, 3)
    If xD.Exists(T & "") Then '字典有無E欄資料
        If N = 0 Then
            N = 1: TT = Arr(i - 1, 3) + 1 '重複出現的第1次依規則編號(第2碼)
        Else
            TT = xD(T & "")(1) + 1  '重複出現的第2次以上依規則編號(第2碼)
        End If
        Arr(i, 1) = Arr(i, 5) & TT & "-" & T & T3 + xD(T & "")(1)  '依規則編號
        xD(T & "") = Array(T2, T3 + xD(T & "")(1)) 'C欄(kg)累加裝入字典
    Else
        Arr(i, 1) = Arr(i, 5) & "1" & "-" & T & T3  '第1次出現,依規則編號放入Arr
        xD(T & "") = Array(T2, T3): N = 0  'B,C欄資料放入字典,N=0歸零(P-C)
    End If
Next
Arr(1, 1) = "Carton"
Range("D1").Resize(UBound(Arr), 1) = Arr
End Sub

TOP

回復 10# john2006168
試試看
Sub ex()
Dim d As Object, a As Variant
Set d = CreateObject("Scripting.dictionary")
For Each a In Range([E2], [E65535].End(3))   '在E欄位置找尋資料
   If Not d.exists(a.Value) Then   '字典中找不到資料
      d(a.Value) = a.Offset(, -2)  '將資料存入字典
      a.Offset(, -1) = a.Value & "1-" & a.Value & a.Offset(, -2) '將範圍資料填入儲存格
   Else   '字典中找到資料
      a.Offset(, -1) = a.Value & d(a.Value) + 1 & "-" & a.Value & a.Offset(, -2) + d(a.Value) '將範圍資料填入儲存格
      d(a.Value) = a.Offset(, -2) + d(a.Value)   '更新字典資料
   End If
Next
Set d = Nothing
End Sub

TOP

回復 11# samwang

謝謝您再三回覆,程式可以操作.

TOP

回復 12# jcchiang

謝謝回覆,可以學習不同寫法.

TOP

上次寫得不好,簡化一下如下,謝謝。

Sub test3()
Dim Arr, xD, T, T2, T3, i&
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([A1], [E65536].End(3))  '資料放入數組
For i = 2 To UBound(Arr)
    'T:E欄資料、T2:B欄、T3:C欄
    T = Arr(i, 5): T2 = Arr(i, 2): T3 = Arr(i, 3)
    If xD.exists(T & "") Then '字典有無E欄資料
        Arr(i, 4) = T & xD(T & "") + 1 & "-" & T & xD(T & "") + T3 '第2次以上,依規則編號放入Arr
        xD(T & "") = xD(T & "") + T3 'C欄(kg)累加裝入字典
    Else
        Arr(i, 4) = T & "1-" & T & T3  '第1次出現,依規則編號放入Arr
        xD(T & "") = T3 'C欄(kg)裝入字典
    End If
Next
Range("A1").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub

TOP

回復 15# samwang

看到.,辛苦了.

TOP

本帖最後由 Andy2483 於 2023-3-16 16:23 編輯

回復 10# john2006168


    謝謝前輩發表此主題與範例
後學藉此帖練習陣列與字典,請前輩參考,請各位前輩指教

執行前:


執行結果:


Option Explicit
Sub Test4()
Dim Brr, Y, N&, i&, xR As Range, T$
'↑宣告變數:(Brr,Y)是通用型變數,(N,i)是長整數變數,
'xR是儲存格變數,T是字串變數

Set Y = CreateObject("Scripting.Dictionary")
'↑令Y這通用型變數是 字典
Set xR = Range([E1], [A65536].End(3))
'↑令xR這儲存格變數是 [E1]到A欄最後有內容儲存格
Brr = xR
'↑令Brr這通用型變數是二維陣列,以xR變數值帶入
For i = 2 To UBound(Brr)
'↑設順迴圈!i從2到 Brr縱向最大索引列號
   T = Brr(i, 5): N = Y(T) + 1
   '↑令這字串變數是 i迴圈列第5欄Brr陣列值,
   '令N這長整數變數是 T變數查Y字典回傳的item值+1

   Y(T) = Y(T) + Brr(i, 3)
   '↑令Y字典中以T變數為key的item值,累加i迴圈列第3欄Brr陣列值
   Brr(i, 4) = T & N & "-" & T & Y(T)
   '↑令i迴圈列第4欄Brr陣列值是 T變數連接N變數,
   '再連接"-",續連接T變數,最後連接(T變數在Y字典的item值),
   '這是字串

Next
xR = Brr
'↑令xR變數(原儲存格)值是 Brr陣列值
Set Y = Nothing: Erase Brr
'↑令釋放變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 是非當教育,讚美作警惕。
返回列表 上一主題