返回列表 上一主題 發帖

[發問] 雙迴圈或多迴圈 寫法

本帖最後由 Andy2483 於 2023-10-6 11:15 編輯

回復 1# fantersy


    謝謝前輩發表此主題與範例
後學藉此帖練習陣列與字典,學習方案如下,請前輩參考

以字典記住計算必要資料,再倒出做計算:

Option Explicit
Sub TEST()
Dim Brr, Crr, Drr, Z, i&, T$
Crr = Range([axmr450!R1], [axmr450!A65536].End(3))
Drr = Range([庫存!G1], [庫存!A65536].End(3))
Brr = Range([訂單未交!B3], [訂單未交!B65536].End(3))
Set Z = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(Drr)
   T = Trim(Drr(i, 5)) & "|" & Trim(Drr(i, 1))
   Z(T) = Z(T) + Val(Drr(i, 6))
Next
For i = 2 To UBound(Crr)
   T = Trim(Crr(i, 7))
   Z(T & "|數量") = Z(T & "|數量") + Val(Crr(i, 10))
   Z(T & "|總出") = Z(T & "|總出") + Val(Crr(i, 18))
Next
For i = 1 To UBound(Brr)
   T = Brr(i, 1)
   Brr(i, 1) = Z(T & "|數量") - Z(T & "|總出") - Z("JMZ1" & "|" & T)
Next
[訂單未交!G3].Resize(UBound(Brr), 1) = Brr
Set Z = Nothing: Erase Brr, Drr, Crr
End Sub
==============================
補充:
範例中有1萬多個不可見的 文字框或圖片....
Sub 刪除物件()
With ActiveSheet.DrawingObjects     
   If .Count > 0 Then MsgBox .Count: .Delete
End With
End Sub

============================
補充另一解法: (以字典記住料號所在的陣列索引列號)

Option Explicit
Sub TEST_1()
Dim Brr, Crr, Drr, Z, i&, T$
Crr = Range([axmr450!R1], [axmr450!A65536].End(3))
Drr = Range([庫存!G1], [庫存!A65536].End(3))
Brr = Range([訂單未交!B3], [訂單未交!B65536].End(3))
Set Z = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Brr): Z(Brr(i, 1)) = i: Brr(i, 1) = 0: Next
For i = 2 To UBound(Crr)
   T = Trim(Crr(i, 7))
   If Z(T) <> "" Then Brr(Z(T), 1) = Brr(Z(T), 1) + Val(Crr(i, 10)) - Val(Crr(i, 18))
Next
For i = 2 To UBound(Drr)
   T = Trim(Drr(i, 1))
   If Trim(Drr(i, 5)) = "JMZ1" And Z(T) <> "" Then Brr(Z(T), 1) = Brr(Z(T), 1) - Val(Drr(i, 6))
Next
[訂單未交!G3].Resize(UBound(Brr), 1) = Brr
Set Z = Nothing: Erase Brr, Drr, Crr
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 3# fantersy


    謝謝前輩回復
以下是複習心得註解,請前輩參考

Sub TEST_1()
Dim Brr, Crr, Drr, Z, i&, T$
'↑宣告變數:(Brr, Crr, Drr, Z)是通用型變數,i是長整數,T是字串變數
Crr = Range([axmr450!R1], [axmr450!A65536].End(3))
'↑令Crr變數是二維陣列,以"axmr450"工作表[R1]到A欄最後有內容儲存格值帶入
Drr = Range([庫存!G1], [庫存!A65536].End(3))
'↑令Drr變數是二維陣列,以 "庫存"工作表[G1]到A欄最後有內容儲存格值帶入
Brr = Range([訂單未交!B3], [訂單未交!B65536].End(3))
'↑令Brr變數是二維陣列,以 "訂單未交"工作表[B3]到B欄最後有內容儲存格值帶入
Set Z = CreateObject("Scripting.Dictionary")
'↑令Z變數是字典
For i = 1 To UBound(Brr): Z(Brr(i, 1)) = i: Brr(i, 1) = 0: Next
'↑設順迴圈!從1到Brr陣列縱向最大索引列號
'令i迴圈列第1欄Brr陣列值當key,item是i變數,納入Z字典中
'令i迴圈列第1欄Brr陣列值=0

For i = 2 To UBound(Crr)
'↑設順迴圈!從1到Crr陣列縱向最大索引列號
   T = Trim(Crr(i, 7))
   '↑令T變數是 去除頭尾空白字元(i迴圈列第7欄Crr陣列值)的字串
   If Z(T) <> "" Then Brr(Z(T), 1) = Brr(Z(T), 1) + Val(Crr(i, 10)) - Val(Crr(i, 18))
   '↑如果以T變數查Z字典回傳item值不是空字元!
   '就令T變數查Z字典回傳item(原T變數在Brr陣列所在的列號)
   '令該列號第1欄Brr陣列值+Val函數值(i迴圈列10欄Crr陣列值)-Val函數值(i迴圈列18欄Crr陣列值)

Next
For i = 2 To UBound(Drr)
   T = Trim(Drr(i, 1))
   '↑令T變數是 去除頭尾空白字元(i迴圈列第1欄Drr陣列值)的字串
   If Trim(Drr(i, 5)) = "JMZ1" And Z(T) <> "" Then Brr(Z(T), 1) = Brr(Z(T), 1) - Val(Drr(i, 6))
   '↑如果i迴圈列第5欄Drr陣列值經去除頭尾空白字元後的字串="JMZ1"!
   '而且以T變數查Z字典回傳值不是空字元!
   '就令T變數查Z字典回傳item(原T變數在Brr陣列所在的列號)
   '令該列號第1欄Brr陣列值-Val函數值(i迴圈列6欄Drr陣列值)

Next
[訂單未交!G3].Resize(UBound(Brr), 1) = Brr
'↑令"訂單未交"工作表[G3]向下擴展 Brr陣列縱向最大索引號列的範圍儲存格值以Brr陣列帶入
Set Z = Nothing: Erase Brr, Drr, Crr
'↑釋放變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 1# fantersy


    以下是複習 以字典記住計算必要資料,再倒出做計算的心得註解,請前輩參考

Option Explicit
Sub TEST()
Dim Brr, Crr, Drr, Z, i&, T$
'↑宣告變數:(Brr, Crr, Drr, Z)是通用型變數,i是長整數,T是字串變數
Crr = Range([axmr450!R1], [axmr450!A65536].End(3))
'↑令Crr變數是二維陣列,以"axmr450"工作表[R1]到A欄最後有內容儲存格值帶入
Drr = Range([庫存!G1], [庫存!A65536].End(3))
'↑令Drr變數是二維陣列,以 "庫存"工作表[G1]到A欄最後有內容儲存格值帶入
Brr = Range([訂單未交!B3], [訂單未交!B65536].End(3))
'↑令Brr變數是二維陣列,以 "訂單未交"工作表[B3]到B欄最後有內容儲存格值帶入
Set Z = CreateObject("Scripting.Dictionary")
'↑令Z這通用型變數是字典
For i = 2 To UBound(Drr)
'↑設順迴圈!i變數從2 到Drr陣列最大索引列號
   T = Trim(Drr(i, 5)) & "|" & Trim(Drr(i, 1))
   '↑令T這字串變數是
   '以"|"符號連接迴圈列5/1攔Drr陣列值去頭尾空白字元的新字串

   Z(T) = Z(T) + Val(Drr(i, 6))
   '↑令以T變數為key,item是累加i迴圈列第6攔Drr陣列值轉化的數值
   '納入Z字典裡

Next
For i = 2 To UBound(Crr)
'↑設順迴圈!i變數從2 到Crr陣列最大索引列號
   T = Trim(Crr(i, 7))
   '↑令T變數是 i迴圈列第7攔Crr陣列值去頭尾空字元的新字串
   Z(T & "|數量") = Z(T & "|數量") + Val(Crr(i, 10))
   '↑令T變數連接 "|數量" 組成的新字串為key,
   'item是累加i迴圈列第10攔Crr陣列值轉化的數值
   '納入Z字典裡

   Z(T & "|總出") = Z(T & "|總出") + Val(Crr(i, 18))
   '↑令T變數連接 "|總出" 組成的新字串為key,
   'item是累加i迴圈列第18攔Crr陣列值轉化的數值
   '納入Z字典裡

Next
For i = 1 To UBound(Brr)
'↑設順迴圈!i變數從1 到Brr陣列最大索引列號
   T = Trim(Brr(i, 1))
   '↑令T變數是 i迴圈列第1攔Brr陣列值去頭尾空字元的新字串
   Brr(i, 1) = Z(T & "|數量") - Z(T & "|總出") - Z("JMZ1" & "|" & T)
   '↑令i迴圈列1欄Brr陣列值是 T關鍵字組合字串查Z字典經所需規則計算後的值
Next
[訂單未交!G3].Resize(UBound(Brr), 1) = Brr
'↑令"訂單未交"工作表[G3]向下擴展Brr陣列縱向最大索引列號列,
'此擴展範圍儲存格值以Brr陣列值帶入

Set Z = Nothing: Erase Brr, Drr, Crr
'↑令釋放變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 忘功不忘過,忘怨不忘恩。
返回列表 上一主題