Board logo

標題: 不同工作表找對比資料,工作表名稱不固定 [打印本頁]

作者: 198188    時間: 2024-2-23 17:31     標題: 不同工作表找對比資料,工作表名稱不固定

本帖最後由 198188 於 2024-2-23 17:34 編輯

工作表“A" 這個是固定的工作表名稱
其他工作表的名稱不固定,而且不固定工作表數量,但是會排在工作表“A"之後
想要的功能是
根據工作表 "A" �堛瘧� C - H,尋找其他所有工作表的欄 B - G 是否有完全一致的數據,按照下面的對比尋找資料。如果找到全部一致的,在欄 I 注明 "Y", 如果沒有相同資料的,在欄 I 注明 "N"
工作表"A" 欄 C   對比  其他工作表 欄B
工作表"A" 欄 D   對比  其他工作表 欄C
工作表"A" 欄 E   對比   其他工作表 欄D
工作表"A" 欄 F   對比   其他工作表 欄E
工作表"A" 欄 G  對比   其他工作表 欄F
工作表"A" 欄 H  對比   其他工作表 欄G
作者: 198188    時間: 2024-2-26 08:38

回復 1# 198188


    這個主要是卡在工作表的不固定數量及名稱問題上。
作者: Andy2483    時間: 2024-2-26 10:09

回復 1# 198188

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

Option Explicit
Sub TEST()
Dim Arr, Brr, Crr, Z, i&, j%, R&, s%, T$, T2$, T3$
Set Z = CreateObject("Scripting.Dictionary")
Brr = Range(Sheets(1).[H12], Sheets(1).[A65536].End(3))
ReDim Crr(1 To UBound(Brr), 1 To 2)
For i = 1 To UBound(Brr)
   T3 = Trim(Brr(i, 3))
   If T3 = "" Then GoTo i01
   For j = 4 To 8
      T = T & "/" & Val(Brr(i, j))
   Next
   Z(T3 & T) = i
   T = ""
   Crr(i, 1) = "N"
i01: Next
For s = 2 To Sheets.Count
   Arr = Range(Sheets(s).[G13], Sheets(s).[A65536].End(3))
   For i = 1 To UBound(Arr)
      T2 = Trim(Arr(i, 2))
      If T2 = "" Then GoTo i02
      For j = 3 To 7
         T = T & "/" & Val(Arr(i, j))
      Next
      R = Z(T2 & T)
      If R <> 0 Then Crr(R, 1) = "Y": Crr(R, 2) = Sheets(s).Name & "/ " & i + 12 & "列"
      T = ""
i02: Next
Next
Sheets(1).[I12].Resize(UBound(Crr), 2) = Crr
End Sub
作者: 198188    時間: 2024-2-26 13:01

回復 3# Andy2483


    大致可以,不過有個部分有問題,AM-JO58-01-1, AM-JO58-01-2, AM-JO58-02 的欄B 因爲不是數字,是文字,所以導致前面1-16列大部分都有,但是結果卻寫無。
作者: Andy2483    時間: 2024-2-26 13:17

回復 4# 198188


    題意看起來是5欄全同才標"Y",
範例盡量是有手動處理好想要的結果附在範例裡
作者: 198188    時間: 2024-2-26 14:16

[attach]37500[/attach]


    �堶�5個資料都是一樣的,不過客戶提供的版本有儲存格格式問題,所以導致對不上。
我意思是問前輩,有沒有一句程式,可以在核對資料的時候,跳過這種格式問題?
作者: Andy2483    時間: 2024-2-26 14:44

本帖最後由 Andy2483 於 2024-2-26 14:59 編輯

回復 6# 198188


    AM-JO58-01-1, AM-JO58-01-2, AM-JO58-02
這幾個表的E欄是隱藏起來的,你的手動比對有誤
[attach]37502[/attach]
作者: 198188    時間: 2024-2-26 15:02

回復 7# Andy2483


    原來隱藏了,我沒留意呢,謝謝解答。
作者: mdr0465    時間: 2024-3-5 23:24

本帖最後由 mdr0465 於 2024-3-5 23:26 編輯

回復 3# Andy2483

  Andy 學兄,你好
又是我這一名愚蠢的學弟

Sub TEST()
Dim Arr, Brr, Crr, V, Z, Q, i&, j%, R&, c%, Y&, X%, T$, T1$, T2$, T3$
Dim xR As Range, Ra As Range, Sh As Worksheet, xBook As Workbook
Set Z = CreateObject("Scripting.Dictionary")
Brr = Range([Data!E2], [Data!A65536].End(3))
For i = 1 To UBound(Brr)
   T = Trim(Brr(i, 1)) & "/" & Val(Brr(i, 2)) & "/" & Val(Brr(i, 3))
   If Z.EXISTS(T) Then
      MsgBox T & "重複":  Exit Sub
      Else
      Z(T) = Val(Brr(i, 5))
      Z(T & "/n") = 1
   End If
Next
Arr = Range([Invoice!H12], [Invoice!C65536].End(3))
ReDim Crr(1 To UBound(Arr), 1 To 6)
For i = 1 To UBound(Arr)
   If Trim(Arr(i, 1)) = "" Then GoTo i01
   T = Trim(Arr(i, 1)) & "/" & Val(Arr(i, 2)) & "/" & Val(Arr(i, 3))
   Z(T & "/n") = Z(T & "/n") + 1
   If Z(T & "/n") > 2 Then MsgBox T & "重複":  Exit Sub Else V = Z(T)
   If V = "" Then GoTo i01
   Crr(i, 1) = V
   Crr(i, 2) = V - Val(Arr(i, 4))
   Crr(i, 3) = Application.Round(Val(Arr(i, 2)) * Val(Arr(i, 3)) / 10 ^ 6, 3)
   Crr(i, 4) = Crr(i, 3) - Val(Arr(i, 5))
   Crr(i, 5) = Application.Round(Crr(i, 3) * Val(Arr(i, 4)), 3)
   Crr(i, 6) = Crr(i, 5) - Val(Arr(i, 6))
i01: Next
[Invoice!J12].Resize(UBound(Crr), 6) = Crr <<  在網上找到好多這類型的編碼, resize(ubound(Crr).6) 我都理解, 但=Crr我始終都不明白這個原理, 麻煩你可不可以指點學弟迷津, 怎樣應用這種方法的編碼呢 , 謝謝
End Sub
作者: Andy2483    時間: 2024-3-6 08:05

回復 9# mdr0465

謝謝論壇,謝謝前輩一起學習
請試執行以下代碼:
[attach]37558[/attach]

Option Explicit
Sub 儲存格與陣列() '注意! 先開一個新工作表再執行,以免誤刪重要資料
Dim Arr(1 To 3, 1 To 5), Brr, Crr, Drr, i%, j%, A, N%
ActiveSheet.UsedRange.ClearContents
For i = 1 To UBound(Arr)
   For j = 1 To UBound(Arr, 2)
      N = N + 1
      Arr(i, j) = N
   Next
Next
[A1].Resize(UBound(Arr), UBound(Arr, 2)) = Arr
[A1].Resize(UBound(Arr), UBound(Arr, 2)).Select
MsgBox "全部Arr陣列值從儲存格[A1]開始貼入值"

[A6].Resize(1, UBound(Arr, 2)) = Arr
[A6].Resize(1, UBound(Arr, 2)).Select
MsgBox "第1列Arr陣列值從儲存格[A6]開始貼入值"

[A8].Resize(UBound(Arr), 1) = Arr
[A8].Resize(UBound(Arr), 1).Select
MsgBox "第1欄Arr陣列值從儲存格[A8]開始貼入值"

[A12].Resize(2, 2) = Arr
[A12].Resize(2, 2).Select
MsgBox "最左上角2欄2列Arr陣列值從儲存格[A12]開始貼入值"

[A15].Resize(4, 6) = Arr
[A15].Resize(4, 6).Select
MsgBox "Arr陣列值比所指定儲存格範圍小情況,從儲存格[A15]開始貼入值超出部分會出現錯誤值"
End Sub
作者: Andy2483    時間: 2024-3-6 08:28

回復 9# mdr0465

進一步運用,請試執行以下代碼:
[attach]37559[/attach]

Option Explicit
Sub 儲存格與陣列_1() '注意! 先開一個新工作表再執行,以免誤刪重要資料
Dim Arr(1 To 3, 1 To 5), Brr, Crr, Drr, i%, j%, A, N%
ActiveSheet.UsedRange.ClearContents
For i = 1 To UBound(Arr)
   For j = 1 To UBound(Arr, 2)
      N = N + 1
      Arr(i, j) = N
   Next
Next
[A1].Resize(UBound(Arr), UBound(Arr, 2)) = Arr
[A1].Resize(UBound(Arr), UBound(Arr, 2)).Select
MsgBox "全部Arr陣列值從儲存格[A1]開始貼入值"

Brr = Range([F1], [A65536].End(xlUp))
For i = 1 To UBound(Brr)
   For j = 2 To UBound(Brr, 2)
      Brr(i, 1) = Brr(i, 1) + Brr(i, j)
   Next
Next
[A6].Resize(UBound(Brr)) = Brr
[A6].Resize(UBound(Brr)).Select
MsgBox "在Brr陣列第1欄裡加總當列值後,從儲存格[A6]開始貼入Brr部分陣列值" & vbLf & _
       "1+2+3+4+5=15" & vbLf & "6+7+8+9+10=40" & vbLf & "11+12+13+14+15=65"
End Sub
作者: mdr0465    時間: 2024-3-6 12:50

回復 11# Andy2483

Andy 師兄,
謝謝你耐心指導和提供有用教材給我了解當中的運作,
現在`後輩了解當中的運作了,萬分感謝你:handshake
作者: Andy2483    時間: 2024-3-6 13:56

本帖最後由 Andy2483 於 2024-3-6 13:57 編輯

回復 12# mdr0465

索引號從 0開始:
[attach]37563[/attach]

Option Explicit
Sub 儲存格與陣列_2() '注意! 先開一個新工作表再執行,以免誤刪重要資料
Dim Arr(3, 5), i%, j%, N%
ActiveSheet.UsedRange.ClearContents
For i = 1 To UBound(Arr)
   Arr(i, 0) = "標題欄項 " & i
   For j = 1 To UBound(Arr, 2)
      If i = 1 Then Arr(0, j) = "標題列項 " & j
      N = N + 1
      Arr(i, j) = N
   Next
Next
Arr(0, 0) = "欄 \ 列"
[A1].Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1) = Arr
[A1].Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1).Select
MsgBox "全部Arr陣列值從儲存格[A1]開始貼入值"
End Sub
作者: mdr0465    時間: 2024-3-7 12:56

回復 13# Andy2483
Andy 師兄,

謝謝你悉心提供有用的教材令我茅塞頓開, 從而更深入理解這編碼的運用,
但學弟有一個疑問再想向Andy 請教, 我明白同一個問題可以用不同方式去編寫同樣都可以做出同樣的結果
但請問Andy學兄,以你個人的見解,你會在什麼時間才會決定使用"Scripting Dictionary" (字典)
什麼時間就不用而用其他方式去編寫程式呢?

謝謝
作者: Andy2483    時間: 2024-3-7 13:38

回復 14# mdr0465

在什麼時間才會決定使用"Scripting Dictionary" (字典)
1.處理重複.不重複資料
2.變動變數太多時,以字典KEY當變數
3.記憶列號時
4.為了練習字典時,任何情況都想要用字典
5.其他
作者: mdr0465    時間: 2024-3-7 21:52

回復 15# Andy2483
Andy 師兄,
明白了,謝謝你每一次都很詳細的解釋,
謝謝




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)