返回列表 上一主題 發帖

[發問] 列出先進先出訊息

本帖最後由 n7822123 於 2020-4-4 05:19 編輯

回復 4# n7822123


看了準大寫的程式,我發現,我寫的還真是冗長.......

我也要學學只用字典紀錄列號,而不是把資料一股腦的塞進字典XD

不過準大用了不少小技巧,要讀懂可能比較難一點點

(如回讀第一列資料,用 val 函數把純字串變成數字0)

程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 11# n7822123


因對excel公式有些經驗, 所以程式碼中摻入了公式技巧,
雖然看起來短, 但效率及易讀性不一定就比較好!
其實程式碼最好是效率兼顧易讀性, 利于以後的修改。

因將變數定義為整數, 所以用val(???) 來避錯,
也可少一次IF的判斷~~ IF ISNUMERIC(ARR(I,3)) THEN

TOP

本帖最後由 hcm19522 於 2024-1-31 17:10 編輯

(輸入編號10769-1) google網址:https://draft.blogger.com/blog/posts/9094075214774179359
google"EXCEL迷"  blog  或google網址:https://hcm19522.blogspot.com/

TOP

回復 8# 准提部林


    謝謝論壇,謝謝前輩指導
後學藉此帖練習陣列與字典,學習方案如下,請前輩再指導

Option Explicit
Sub TEST()
Dim Arr, Brr, Crr, 需求&, Z, i&, j%, C%, T$, 庫存&, D As Date, W&, V&, R&
Set Z = CreateObject("Scripting.Dictionary")
Brr = Range([庫存!C1], [庫存!A65536].End(3))
For i = 2 To UBound(Brr)
   T = Trim(Brr(i, 1)): If T = "" Then GoTo i01
   If Not IsObject(Z(T)) Then Set Z(T) = CreateObject("Scripting.Dictionary")
   Z(T)(i) = 0: Z(T & "Tot") = Z(T & "Tot") + Val(Brr(i, 3))
i01: Next
Crr = Range([原始!C1], [原始!A65536].End(3))
ReDim Arr(2 To UBound(Crr), 1 To 100)
For i = 2 To UBound(Crr)
   T = Trim(Crr(i, 2)): 需求 = Val(Crr(i, 3)): C = 0: If Z(T & "Tot") = 0 Then GoTo i02
   For j = Z(T & "No") To Z(T).Count - 1
      W = W + 1: R = Z(Trim(Crr(i, 2))).keys()(j)
      庫存 = Val(Brr(R, 3))
      D = CDate(Brr(Z(Trim(Crr(i, 2))).keys()(j), 2))
      V = IIf(庫存 < 需求, 庫存, 需求)
      Arr(i, C + 1) = D: Arr(i, C + 2) = V: C = C + 2
      Z(T & "Tot") = Z(T & "Tot") - V
      需求 = 需求 - V: 庫存 = 庫存 - V
      If 庫存 = 0 Then Z(T & "No") = Z(T & "No") + 1 Else Brr(R, 3) = 庫存
      If 需求 = 0 Then Exit For
   Next
i02: If Z(T & "Tot") = 0 And 需求 > 0 Then Arr(i, C + 1) = "沒有資料": Arr(i, C + 2) = "數量不足"
Next
[原始!D2].Resize(UBound(Arr) - 1, UBound(Arr, 2)) = Arr
MsgBox "迴圈數:" & W
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 人的眼睛長在前面,只看到別人的缺點,絲毫看不到自己的缺點。
返回列表 上一主題