返回列表 上一主題 發帖

匯出_但不重覆匯出的資料

謝謝論壇,謝謝各位前輩
後學今天藉此帖練習陣列與字典,請各位前輩指教
匯出_但不重覆_20230316_4.zip (15.37 KB)

資料表:


原結果表:


執行結果:


Option Explicit
Sub TEST_1()
Dim A, B, V, Y, Z, C%, R&, i&, N&, T$, xR
Set Y = CreateObject("Scripting.Dictionary")
[Data!F:F].ClearContents
Set xR = Range([Data!F5], [Data!B65536].End(3))
A = xR: B = Range([輸入!H5], [輸入!B65536].End(3))
ReDim V(UBound(B), 4): Z = Array(1, 2, 6, 7)
For i = 1 To UBound(A)
   T = Join(Array(A(i, 1), A(i, 2), A(i, 3)), "|")
   Y(T) = i: Y(T & "/c4") = A(i, 4)
Next
For i = 1 To UBound(B)
   T = Join(Array(B(i, 1), B(i, 2), B(i, 6)), "|")
   If Y.Exists(T) Then
      N = Y(T)
      If B(i, 7) <> Y(T & "/c4") And N <= UBound(A) Then
         A(N, 5) = Date & "_" & A(N, 4) & "_修改為_" & B(i, 7)
         A(N, 4) = B(i, 7)
      End If
      Else
         For C = 0 To 3: V(R, C) = B(i, Z(C)): Next
         V(R, 4) = "新增"
         R = R + 1: Y(T) = i: Y(T & "/c4") = B(i, 7)
   End If
Next
xR.Value = A
If R > 0 Then xR.Item(xR.Count + 1).Resize(R, 5) = V
Application.Goto [Data!A1]
Set Y = Nothing: Erase A, B, V
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-3-17 09:26 編輯

回復 21# Andy2483


    謝謝論壇,謝謝各位前輩
今天複習此帖發現很多缺漏,修正後心得註解如下,請各前輩指教

Option Explicit
Sub TEST_1()
If [輸入!B65536].End(3).Row <= 5 Then Exit Sub
'↑如果輸入表B欄最後一個有內容儲存格列號<=5!就結束程式執行
Dim A, B, V, Y, Z, C%, R&, i&, N&, T$, xR As Range
'↑宣告變數:(A,B,V,Y,Z)是通用型變數,C是短整數變數,
'(R,i,N)是長整數變數,T是字串變數,xR是儲存格變數

Set Y = CreateObject("Scripting.Dictionary")
'↑令Y這通用型變數是 字典
[Data!F:F].ClearContents
'↑令Data表F欄清除內容
Set xR = Range([Data!F4], [Data!B65536].End(3))
'↑令xR這儲存格變數是 Data表[F4]到B欄最後一個有內容儲存格
A = xR: B = Range([輸入!H5], [輸入!B65536].End(3))
'↑令A這通用型變數是 二維陣列,以xR變數值(儲存格值)帶入,
'令B這通用型變數是 二維陣列,以輸入表[H5]到B欄最後有內容儲存格,
'這範圍儲存格值帶入B陣列中

ReDim V(UBound(B), 4): Z = Array(1, 2, 6, 7)
'↑宣告V這通用型變數是 二維陣列,縱向範圍從0到 B陣列縱向最大列號,
'橫向範圍從0到 4

'令Z這通用型變數是 一維陣列,以數字(1,2,6,7)為其陣列值
For i = 2 To UBound(A)
'↑設順迴圈!i從2到 A陣列縱向最大索引列號
   T = Join(Array(A(i, 1), A(i, 2), A(i, 3)), "|")
   '↑令T這字串變數是 以"|"連結A陣列值的新字串,
   'A陣列值:i迴圈列(1,2,3)欄A陣列值

   Y(T) = i: Y(T & "/c4") = A(i, 4)
   '↑令以T變數為key,item是 i迴圈數,納入Y字典裡
   '令以T變數連結"/c4"後的新字串為key,item是 i迴圈列第4欄A陣列值,
   '納入Y字典裡

Next
For i = 1 To UBound(B)
'↑設順迴圈!i從2到 B陣列縱向最大索引列號
   T = Join(Array(B(i, 1), B(i, 2), B(i, 6)), "|")
   '↑令T這字串變數是 以"|"連結B陣列值的新字串,
   'B陣列值:i迴圈列(1,2,6)欄B陣列值

   If Y.Exists(T) Then
   '↑如果Y字典裡有 T變數這key?
      N = Y(T)
      '↑令N這長整數變數是 以T變數查Y字典回傳的item值
      If B(i, 7) <> Y(T & "/c4") And N <= UBound(A) Then
      '↑如果i迴圈列第7欄陣列值不等於 以T變數連結"/c4"的Y item值
      '而且N變數<= A陣列縱向最大索引列號(目的:隔離新增)

         A(N, 5) = Date & "_" & A(N, 4) & "_修改為_" & B(i, 7)
         '↑令N變數列第5欄A陣列值是 今天日期連接"_",
         '再連接N變數列第4欄A陣列值,續連接"_修改為_",
         '最後連接i迴圈列第7欄B陣列值

         A(N, 4) = B(i, 7)
         '↑令N變數列第4欄A陣列值是 i迴圈列第7欄B陣列值
      End If
      Else
         For C = 0 To 3: V(R, C) = B(i, Z(C)): Next
         '↑設順迴圈C從0到 3
         '令R這長整數變數列第C變數欄V陣列值是
         'i迴圈列第(C變數索引號Z陣列值)欄的B陣列值
         'R變數的初始值是0,V縱向索引號起始值也是0,要搭配才對得準

         V(R, 4) = "新增"
         '↑令R變數列第4欄V陣列值是 "新增"字串
         R = R + 1: Y(T) = i: Y(T & "/c4") = B(i, 7)
         '↑令R變數累加1:令以T變數當key,item是 i迴圈數,納入Y字典裡,
         '令以T變數連結"/c4"後的新字串為key,item是 i迴圈列第7欄B陣列值,
         '納入Y字典裡

   End If
Next
xR = A
'↑令xR變數(儲存格)值 以A陣列值帶入
If R > 0 Then xR.Item(xR.Count + 1).Resize(R, 5) = V
'↑如果R變數>0 !
'就令xR變數(儲存格)的下一個儲存格 擴展向下R變數列,向右擴展5欄,
'這範圍儲存格值以V陣列值帶入

Application.Goto [Data!A1]
'↑令儲存格游標跳到 [Data!A1]位置
Set Y = Nothing: Erase A, B, V, Z
'↑令釋放變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 人要知福、惜福、再造福。
返回列表 上一主題