返回列表 上一主題 發帖

[發問] 以字典方式製作餘額明細表

本帖最後由 Andy2483 於 2023-3-21 14:03 編輯

回復 3# shuo1125


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

Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Dim Brr, A, Y, Z, Yk, T$, T2$, T3$, T9$, T10$, S1$, S2$
Dim x%, C%, N&, i&, P&, B(3), Crr(1 To 1000, 1 To 20)
Set Y = CreateObject("Scripting.Dictionary")
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
Brr = Sheets("資料區").UsedRange
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   A = Y(S1)
   If Not IsArray(A) Then A = Crr
   T9 = Brr(i, 9)
   B(1) = Mid(T9, 1, 3): B(2) = Mid(T9, 4, 2): B(3) = Mid(T9, 6, 2)
   B(0) = B(1) & "." & B(2) & "." & B(3) & "#" & Val(Mid(T9, 8))
   T10 = Brr(i, 10)
   If T10 Like "沖*" = False Then
      N = Y(S1 & "|r")
      N = N + 1
      Y(S1 & "|r") = N
      S2 = B(0) & "-" & T10:  Y(S2) = N
      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      For x = 5 To 6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         A(N, x + 14) = A(N, x)
      Next
      Y(S1) = A
      GoTo i01
      ElseIf T10 Like "*月帳款" Then
         B(0) = Mid(Split(T10, "月")(0), 2)
         B(0) = B(0) & Replace(T10, "沖", ".#0-")
         B(0) = Replace(B(0), "月帳款", "應付帳款總額")
      ElseIf T10 Like "沖###/*#/*#*" Then
         B(1) = Mid(T10, 2, 4)
         B(2) = Format(Split(Mid(T10, 6), "#")(0), "MM/DD")
         B(3) = "#" & Split(T10, "#")(1)
         B(0) = Replace(B(1) & B(2) & B(3), "/", ".")
      ElseIf T10 Like "沖?????*  ###/*#/*#" Then
         B(0) = Split(Mid(T10, 3), "  ")
         B(1) = Mid(Brr(i, 11), 1, 3)
         B(2) = "." & Mid(Brr(i, 11), 4) & ".#0-"
         B(3) = B(0)(0) & "  " & B(0)(1)
         B(0) = B(1) & B(2) & B(3)
   End If
   C = Format(Brr(i, 4), "M") + 6
   A(Y(B(0)), C) = Brr(i, 16) + Brr(i, 17)
   A(Y(B(0)), 20) = A(Y(B(0)), 20) - A(Y(B(0)), C)
   P = Brr(i, 14) + Brr(i, 15)
   A(Y(B(0)), 19) = A(Y(B(0)), 19) - P
   Y(S1) = A
   
i01:
Next
'====================================
For Each Yk In Y.keys
   If IsArray(Y(Yk)) Then
      On Error Resume Next
      Sheets(Val(Yk) & "").Delete
      On Error GoTo 0
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      With Sheets(1)
         .Name = Val(Yk)
         .UsedRange.Offset(5, 0).Delete
         With .[A5].Resize(Y(Yk & "|r"), 20)
            .Value = Y(Yk)
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
         End With
         .[C3] = Y(Yk & "/c")
         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         N = .Cells(Rows.Count, "F").End(3).Row
         With .Cells(N + 1, "F").Resize(1, 15)
            .Value = "=SUM(F5:F" & N & ")"
         End With
      End With
   End If
Next
Set Y = Nothing: Erase Brr, Crr, Z, A, B
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 7# shuo1125


    謝謝前輩回復
1.正所謂當局者迷,解範例才知範例問題在哪裡
2.前輩多慮了,並沒有浪費時間,後學在論壇上在此帖上學習到很多知識

3.就後學的認知與經驗,備註欄屬於雜項欄位,做為關鍵字欄有很多疑慮,
請前輩查證一下K欄備註欄是否都只放 傳票編號-序(沖銷號碼)
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 08:26 編輯

回復 7# shuo1125


    以K欄備註欄都只放 傳票編號-序(沖銷號碼)的情境下做字典對照解決方案如下,
請前輩參考

K欄備註欄(傳票編號-序)沖銷H欄(傳票編號-序),一對多對沖銷是什麼規則??



Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Dim Brr, A, Y, Z, Yk, T2$, T3$, T8$, T11$, S1$
Dim x%, C%, N&, i&, P&, Crr(1 To 1000, 1 To 20)
Set Y = CreateObject("Scripting.Dictionary")
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
Brr = Sheets("資料區").UsedRange
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   A = Y(S1)
   If Not IsArray(A) Then A = Crr
   T8 = Brr(i, 8): T11 = Brr(i, 11)
   If T11 Like "#####*" = False Then
      N = Y(S1 & "|r")
      N = N + 1
      Y(S1 & "|r") = N
      Y(T8) = N
      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      For x = 5 To 6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         A(N, x + 14) = A(N, x)
      Next
      Y(S1) = A
      GoTo i01
   End If
   C = Format(Brr(i, 4), "M") + 6
   A(Y(T11), C) = Brr(i, 16) + Brr(i, 17)
   A(Y(T11), 20) = A(Y(T11), 20) - A(Y(T11), C)
   P = Brr(i, 14) + Brr(i, 15)
   A(Y(T11), 19) = A(Y(T11), 19) - P
   Y(S1) = A
   
i01:
Next
'====================================
For Each Yk In Y.keys
   If IsArray(Y(Yk)) Then
      On Error Resume Next
      Sheets(Val(Yk) & "").Delete
      On Error GoTo 0
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      With Sheets(1)
         .Name = Val(Yk)
         .UsedRange.Offset(5, 0).Delete
         With .[A5].Resize(Y(Yk & "|r"), 20)
            .Value = Y(Yk)
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
         End With
         .[C3] = Y(Yk & "/c")
         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         N = .Cells(Rows.Count, "F").End(3).Row
         With .Cells(N + 1, "F").Resize(1, 15)
            .Value = "=SUM(F5:F" & N & ")"
         End With
      End With
   End If
Next
Set Y = Nothing: Erase Brr, Crr, Z, A
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 09:05 編輯

回復 7# shuo1125

1.是以(幣別 + 傳票編號-序)美金沖銷美金,台幣沖銷台幣嗎?

2.結果表的S欄原幣餘額 總合計有意義嗎? 保留合計或取消合計?
PS:原幣餘額可能有多種幣別的餘額,相加被引用堪慮

Option Explicit
Sub TEST_幣別_傳票編號序()
Application.DisplayAlerts = False
Dim Brr, A, Y, Z, Yk, T2$, T3$, T8$, T11$, T12$, S1$, S2$
Dim x%, C%, N&, i&, P&, Crr(1 To 1000, 1 To 20)
Set Y = CreateObject("Scripting.Dictionary")
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
Brr = Sheets("資料區").UsedRange
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   A = Y(S1)
   If Not IsArray(A) Then A = Crr
   T8 = Brr(i, 8): T11 = Brr(i, 11): T12 = Brr(i, 12)
   If T11 Like "#####*" = False Then
      N = Y(S1 & "|r"): N = N + 1: Y(S1 & "|r") = N
      S2 = T8 & "|" & T12: Y(S2) = N
      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      For x = 5 To 6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         A(N, x + 14) = A(N, x)
      Next
      Y(S1) = A: GoTo i01
   End If
   C = Format(Brr(i, 4), "M") + 6
   S2 = T11 & "|" & T12
   A(Y(S2), C) = Brr(i, 16) + Brr(i, 17)
   A(Y(S2), 20) = A(Y(S2), 20) - A(Y(S2), C)
   P = Brr(i, 14) + Brr(i, 15)
   A(Y(S2), 19) = A(Y(S2), 19) - P
   Y(S1) = A
   
i01:
Next
'====================================
For Each Yk In Y.keys
   If IsArray(Y(Yk)) Then
      On Error Resume Next
      Sheets(Val(Yk) & "").Delete
      On Error GoTo 0
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      With Sheets(1)
         .Name = Val(Yk)
         .UsedRange.Offset(5, 0).Delete
         With .[A5].Resize(Y(Yk & "|r"), 20)
            .Value = Y(Yk)
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
         End With
         .[C3] = Y(Yk & "/c")
         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         N = .Cells(Rows.Count, "F").End(3).Row
         With .Cells(N + 1, "F").Resize(1, 15)
            .Value = "=SUM(F5:F" & N & ")"
            If .Item(14) <> .Item(15) Then .Item(14) = "NA"
         End With
      End With
   End If
Next
Set Y = Nothing: Erase Brr, Crr, Z, A
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 10:36 編輯

回復 12# shuo1125


    T欄 沖帳 對應K欄(備註)是空格,而不是 號碼(傳票編號-序)代表什麼意思?



請前輩查證一下K欄備註欄是否都只放 傳票編號-序(沖銷號碼)
  >沖銷時放的K欄必定為傳票編號-序。
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 10:50 編輯

回復 14# shuo1125


    因為K欄做對應可能不牢靠,需要更多驗證檢查
以下這問題也是手誤?還是系統撈資料就錯?
立帳 K欄有號碼
還是其他因素?

用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 11:18 編輯

回復 16# shuo1125


    謝謝前輩,請試試看

Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Dim Brr, A, Y, Z, Yk, T2$, T3$, T8$, T11$, T12$, T20$, S1$, S2$
Dim x%, C%, N&, i&, P&, Crr(1 To 1000, 1 To 20)
Set Y = CreateObject("Scripting.Dictionary")
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
Brr = Sheets("資料區").UsedRange
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   A = Y(S1)
   If Not IsArray(A) Then A = Crr
   T8 = Brr(i, 8): T11 = Brr(i, 11)
   T12 = Brr(i, 12): T20 = Brr(i, 20)
   If T20 = "沖帳" Then
      If T11 Like "#####*" = False Then
         Application.Goto Sheets("資料區").Rows(i)
         MsgBox "沖帳備註欄異常": Exit Sub
      End If
      If Y.Exists(T11 & "|" & T12) = Empty Then
         Application.Goto Sheets("資料區").Rows(i)
         MsgBox "無法沖帳": Exit Sub
      End If
   End If
   If T20 = "立帳" Then
      N = Y(S1 & "|r"): N = N + 1: Y(S1 & "|r") = N
      S2 = T8 & "|" & T12: Y(S2) = N
      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      For x = 5 To 6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         A(N, x + 14) = A(N, x)
      Next
      Y(S1) = A: GoTo i01
   End If
   C = Format(Brr(i, 4), "M") + 6
   S2 = T11 & "|" & T12
   A(Y(S2), C) = Brr(i, 16) + Brr(i, 17)
   A(Y(S2), 20) = A(Y(S2), 20) - A(Y(S2), C)
   P = Brr(i, 14) + Brr(i, 15)
   A(Y(S2), 19) = A(Y(S2), 19) - P
   Y(S1) = A
   
i01:
Next
'====================================
For Each Yk In Y.keys
   If IsArray(Y(Yk)) Then
      On Error Resume Next
      Sheets(Val(Yk) & "").Delete
      On Error GoTo 0
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      With Sheets(1)
         .Name = Val(Yk)
         .UsedRange.Offset(5, 0).Delete
         With .[A5].Resize(Y(Yk & "|r"), 20)
            .Value = Y(Yk)
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
         End With
         .[C3] = Y(Yk & "/c")
         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         N = .Cells(Rows.Count, "F").End(3).Row
         With .Cells(N + 1, "F").Resize(1, 15)
            .Value = "=SUM(F5:F" & N & ")"
            If .Item(14) <> .Item(15) Then .Item(14) = "NA"
            '↑結果表總餘額合計 如果S欄<>T欄!就讓S欄顯示 "NA"
            '否則S欄同T欄

         End With
      End With
   End If
Next
Set Y = Nothing: Erase Brr, Crr, Z, A
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-22 13:54 編輯

回復 18# shuo1125


    謝謝前輩再回復
後學藉此主題學習到很多知識,學習心得註解如下,請前輩參考,請各位前輩指教
如果還有後學可以學習的!請前輩繼續提出

Option Explicit
Sub TEST()
Application.DisplayAlerts = False
'↑令程序遇到是否真的要刪除的疑問時,就不要再問了!刪了他!
Dim Brr, A, Y, Z, Yk, T2$, T3$, T8$, T11$, T12$, T20$, S1$, S2$
Dim x%, C%, N&, i&, P&, Crr(1 To 1000, 1 To 20)
'↑宣告變數:(Brr,A,Y,Z,Yk)是通用型變數,
'(T2,T3,T8,T11,T20,T12,S1,S2)是字串變數,(x,C)是短整數變數,
'(N,i,P)是長整數變數,Crr是陣列變數(縱向1到1000,橫向1到20)

Set Y = CreateObject("Scripting.Dictionary")
'↑令Y這通用型變數是 字典
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
'↑令Z這通用型變數是一維陣列(共9個陣列值,索引號0到8)
Brr = Sheets("資料區").UsedRange
'↑令Brr這通用型變數是二維陣列,以資料區表有使用儲存格值帶入
For i = 2 To UBound(Brr)
'↑設順迴圈!i從2到Brr陣列縱向最大索引列號
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   '↑令T2這字串變數是 i迴圈列第2欄Brr陣列值,
   '令T3這字串變數是 i迴圈列第3欄Brr陣列值

   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   '↑令S1這字串變數是 T2變數 連接"|" 再連接T3變數的新字串,
   '令以S1變數 連接"/b"成的新字串當key,item是T2變數,納入Y字典
   '令以S1變數 連接"/c"成的新字串當key,item是T3變數,納入Y字典

   A = Y(S1)
   '↑令A這通用型變數是 以S1變數查Y字典得到的item值
   If Not IsArray(A) Then A = Crr
  '↑如果A變數經判斷:不是陣列!就令A變數是Crr變數
   T8 = Brr(i, 8): T11 = Brr(i, 11)
   T12 = Brr(i, 12): T20 = Brr(i, 20)
   '↑令T8這字串變數是 i迴圈列第8欄Brr陣列值,
   '令T11這字串變數是 i迴圈列第11欄Brr陣列值,
   '令T12這字串變數是 i迴圈列第12欄Brr陣列值
   '令T20這字串變數是 i迴圈列第20欄Brr陣列值

   If InStr("/沖帳/立帳/", "/" & T20 & "/") = 0 Then
   '↑如果T20變數不是 沖帳 ,也不是 立帳??
      Application.GoTo Sheets("資料區").Rows(i)
      '↑令儲存格游標跳到i變數列
      MsgBox "T欄不明 立沖帳類別": Exit Sub
      '↑跳出提示窗~~~:結束程式執行
   End If
   If T20 = "沖帳" Then
   '↑如果T20變數是 "沖帳"字串 ?
      If T11 Like "#####*" = False Then
      '↑如果T11變數不是以5個連續數字開頭的字串?
         Application.GoTo Sheets("資料區").Rows(i)
         '↑令儲存格游標跳到i變數列
         MsgBox "沖帳備註欄異常": Exit Sub
         '↑跳出提示窗~~~:結束程式執行
      End If
      If Y.Exists(T11 & "|" & T12) = Empty Then
      '↑如果以T11變數 連接"|" 再連接T12變數的新字串,
      '查Y字典裡沒有這key??

         Application.GoTo Sheets("資料區").Rows(i)
         '↑令儲存格游標跳到i變數列
         MsgBox "無法沖帳": Exit Sub
         '↑跳出提示窗~~~:結束程式執行
      End If
   End If
   If T20 = "立帳" Then
   '↑如果T20變數 "立帳"字串
      N = Y(S1 & "|r"): N = N + 1: Y(S1 & "|r") = N
      '↑令N這長整數變數是 (S1變數連接"|r"成的新字串)查Y字典的item值
      '令N變數累加1,
      '令(S1變數連接"|r"成的新字串)的item值是 N變數

      S2 = T8 & "|" & T12: Y(S2) = N
      '↑令S2這字串變數是 T8變數 連接"|" 再連接T12變數的新字串,
      '↑令以S2變數當key,item是N變數,納入Y字典裡

      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      '↑設順迴圈!x從1到4,令N變數列第x變數欄A陣列值是,
      '是i迴圈列第(Z陣列第x變數索引號值)欄Brr陣列值

      For x = 5 To 6
      '↑設順迴圈!x從5到6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         '↑令N變數列第x變數欄A陣列值是,
         '是i迴圈列第(Z陣列第x變數索引號值)欄Brr陣列值+
         'i迴圈列第(Z陣列(第x變數+2)索引號值)欄Brr陣列值

         A(N, x + 14) = A(N, x)
         '↑令N變數列第(x變數+14)欄A陣列值是 N變數列第x變數欄A陣列值
      Next
      Y(S1) = A: GoTo i01
      '↑令以S1變數為key,item是A陣列,納入Y字典(重複key則取代其item),
      '跳到 i01標示位置繼續執行

   End If
   C = Format(Brr(i, 4), "M") + 6
   '↑令C這短整數變數是 i迴圈列第4欄Brr陣列值取其日期月份後轉數字+6
   S2 = T11 & "|" & T12
   '↑令S2變數是 T11變數 連接"|" 再連接T12變數的新字串
   A(Y(S2), C) = Brr(i, 16) + Brr(i, 17)
   '↑令(S2變數當key查Y字典item值)列第C變數欄A陣列值是,
   '是i迴圈列第16欄Brr陣列值 + i迴圈列第17欄Brr陣列值欄Brr陣列值

   A(Y(S2), 20) = A(Y(S2), 20) - A(Y(S2), C)
   '↑令(S2變數當key查Y字典item值)列第20欄A陣列值是,
   '是自身陣列值 - (S2變數當key查Y字典item值)列第C變數欄A陣列值

   P = Brr(i, 14) + Brr(i, 15)
   '↑令P這長整數是 i迴圈列14欄Brr陣列值 + i迴圈列15欄Brr陣列值
   A(Y(S2), 19) = A(Y(S2), 19) - P
   '↑令(S2變數當key查Y字典item值)列第19欄A陣列值是,
   '是自身陣列值 - P變數

   Y(S1) = A
   '↑令以S1變數為key,item是A陣列,納入Y字典(重複key則取代其item)
   
i01:
Next
'====================================
For Each Yk In Y.keys
'↑設逐項迴圈!令Yk這通用型變數是Y字典裡key之一
   If IsArray(Y(Yk)) Then
   '↑如果以 Yk變數查Y字典的item值是 陣列?
      On Error Resume Next
      '↑令程序遇錯跳過!並繼續執行
      Sheets(Val(Yk) & "").Delete
      '↑令以Yk變數轉成數值再連接空字元的新字串的名字,
      '以此字串名字的工作表刪除

      On Error GoTo 0
      '↑令程序恢復正常偵錯
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      '↑令科目餘額表另外複製一個同樣表放在最前面
      With Sheets(1)
      '↑以下是關於 最前面這工作表的程序
         .Name = Val(Yk)
         '↑令名字改為Yk變數轉化為數字的字串
         .UsedRange.Offset(5, 0).Delete
         '↑令有使用的儲存格範圍向下偏移5列的範圍刪除
         With .[A5].Resize(Y(Yk & "|r"), 20)
         '↑以下是關於表裡[A5]擴展向下Y(Yk & "|r")列,向右20欄範圍
         '關於這範圍儲存格的程序

         'Y(Yk & "|r"):是以Yk變數 連接"|r"的新字串查Y字典的item值
            .Value = Y(Yk)
            '↑令儲存格值是 以Yk變數查Y字典得到的陣列值
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
           '↑令[E:T]與此範圍儲存格交集的範圍儲存格格式是"~~~~~"
         End With
         .[C3] = Y(Yk & "/c")
         '↑令表裡[C3]儲存格值是 以Yk 連接"/c"字串成的新字串,
         '此字串查Y字典得到的 item值

         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         '↑令表裡[C3]儲存格值是 自身字串 連接"《",
         '再連接 以Yk 連接"/c"字串成的新字串,最後連接"》" 成的新字串

         N = .Cells(Rows.Count, "F").End(3).Row
         '↑令N變數是F欄最後有內容儲存格列號
         With .Cells(N + 1, "F").Resize(1, 15)
         '↑以下是 關於表裡(N變數+1)列F欄儲存格擴展向右15欄的程序
            .Value = "=SUM(F5:F" & N & ")"
            '↑令這些儲存格值是 "=SUM(F5:F" 連接N變數 再連接")",
            '此連接成的新字串放入各儲存格後會因為最前面的"="符號,
            '裡面的欄位符號會隨各不同欄位做變化

            If .Item(14) <> .Item(15) Then .Item(14) = "NA"
            '↑如果結果表總餘額合計 S欄<>T欄!就讓S欄顯示 "NA"
            '否則S欄同T欄

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

TOP

回復 18# shuo1125


1.添加驗證 資料區總餘額與 科目餘額明細合計餘額,方案如下
2.資料區7407492改為7407491做驗證結果如下圖



Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Dim Brr, A, Y, Z, Yk, T2$, T3$, T8$, T11$, T12$, T20$, S1$, S2$
Dim x%, C%, N&, i&, P&, Crr(1 To 1000, 1 To 20)
Set Y = CreateObject("Scripting.Dictionary")
Z = Array(, 4, 8, 10, 12, 14, 16, 15, 17)
Brr = Sheets("資料區").UsedRange
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3)
   S1 = T2 & "|" & T3: Y(S1 & "/b") = T2: Y(S1 & "/c") = T3
   A = Y(S1): Y(S1 & "/餘額") = Brr(i, 18)
   If Not IsArray(A) Then A = Crr
   T8 = Brr(i, 8): T11 = Brr(i, 11)
   T12 = Brr(i, 12): T20 = Brr(i, 20)
   If InStr("/沖帳/立帳/", "/" & T20 & "/") = 0 Then
      Application.GoTo Sheets("資料區").Rows(i)
      MsgBox "T欄不明 立沖帳類別": Exit Sub
   End If
   If T20 = "沖帳" Then
      If T11 Like "#####*" = False Then
         Application.GoTo Sheets("資料區").Rows(i)
         MsgBox "沖帳備註欄異常": Exit Sub
      End If
      If Y.Exists(T11 & "|" & T12) = Empty Then
         Application.GoTo Sheets("資料區").Rows(i)
         MsgBox "無法沖帳": Exit Sub
      End If
   End If
   If T20 = "立帳" Then
      N = Y(S1 & "|r"): N = N + 1: Y(S1 & "|r") = N
      S2 = T8 & "|" & T12: Y(S2) = N
      For x = 1 To 4: A(N, x) = Brr(i, Z(x)): Next
      For x = 5 To 6
         A(N, x) = Brr(i, Z(x)) + Brr(i, Z(x + 2))
         A(N, x + 14) = A(N, x)
      Next
      Y(S1) = A: GoTo i01
   End If
   C = Format(Brr(i, 4), "M") + 6
   S2 = T11 & "|" & T12
   A(Y(S2), C) = Brr(i, 16) + Brr(i, 17)
   A(Y(S2), 20) = A(Y(S2), 20) - A(Y(S2), C)
   P = Brr(i, 14) + Brr(i, 15)
   A(Y(S2), 19) = A(Y(S2), 19) - P
   Y(S1) = A
   
i01:
Next
'====================================
For Each Yk In Y.keys
   If IsArray(Y(Yk)) Then
      On Error Resume Next
      Sheets(Val(Yk) & "").Delete
      On Error GoTo 0
      Sheets("科目餘額表").Copy Before:=Sheets(1)
      With Sheets(1)
         .Name = Val(Yk)
         .UsedRange.Offset(5, 0).Delete
         With .[A5].Resize(Y(Yk & "|r"), 20)
            .Value = Y(Yk)
            Intersect([E:T], .Cells).NumberFormatLocal = _
            "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
         End With
         .[C3] = Y(Yk & "/c")
         .[C3] = .[C3] & "《" & Y(Yk & "/b") & "》"
         N = .Cells(Rows.Count, "F").End(3).Row
         With .Cells(N + 1, "F").Resize(1, 15)
            .Value = "=SUM(F5:F" & N & ")"
            If .Item(14) <> .Item(15) Then .Item(14) = "NA"
            If Y(Yk & "/餘額") <> .Item(15) Then
               .Item(15)(2) = "↑嚴重錯誤!餘額合計" & _
               "不等於資料區餘額: " & vbLf & Y(Yk & "/餘額")
               .Interior.ColorIndex = 3
               MsgBox "嚴重錯誤"
               Exit Sub
            End If

         End With
      End With
   End If
Next
Set Y = Nothing: Erase Brr, Crr, Z, A
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 22# shuo1125


    前輩早安,謝謝發表主題與範例給後學學習,謝謝論壇
1.提醒前輩 資料區表的資料在 系統裡排序好才撈出,就不必在excel排序
2.若有後續問題,請不吝再提出,如果偏離此主題,請另開新主題
3.請前輩常上論壇一起學習
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 並非有錢魷是快樂,問心無愧心最安。
返回列表 上一主題