Board logo

標題: 資料比對 [打印本頁]

作者: sillykin    時間: 2021-8-23 18:45     標題: 資料比對

各位大大你好,資料比對如何篩選排序出二張(重複及單選)項目
作者: sillykin    時間: 2021-8-26 09:48

請問這有辦法處理嗎?
作者: samwang    時間: 2021-8-26 10:25

回復 2# sillykin


不好意思,看不太懂您的需求,可否請再說明詳細一點嗎? 謝謝
作者: sillykin    時間: 2021-8-26 11:31

本帖最後由 sillykin 於 2021-8-26 11:37 編輯

此檔案有三張工作表(人工名冊(筆數約千筆)、會計名冊(筆數約百筆等)、比對區)
比對區工作表單說明如下
A~D欄位是將二張工作表(人工名冊及會計名冊)依『戶名』排序
將A~D欄位排序結果,在挑出『查詢日』(D欄)跟『日期』(A欄)--(  相符的值  )複制到H~K欄位
將A~D欄位排序結果,在挑出『查詢日』(D欄)跟『日期』(A欄)--(不相符的值)複制到O~R欄位
作者: samwang    時間: 2021-8-26 13:42

回復 4# sillykin


請問如圖片紅色那筆有需要列嗎?
作者: samwang    時間: 2021-8-26 16:23

本帖最後由 samwang 於 2021-8-26 16:32 編輯

回復 4# sillykin

請測試看看,謝謝
另外,您提供資料不相符合的結果和我的結果不一樣,請再確認,謝謝

Sub test()
Dim Arr, xD, Brr(), Crr(), T$, T1$, n%, n1%, i&, j%
Arr = Range([比對!a1], [比對!d65536].End(3))
Set xD = CreateObject("Scripting.Dictionary")
ReDim Brr(1 To UBound(Arr), 1 To 4)
ReDim Crr(1 To UBound(Arr), 1 To 4)
n = 1
For i = 2 To UBound(Arr)
    If i = UBound(Arr) Then GoTo 99
    If Arr(i, 1) <> "" And Arr(i + 1, 1) = "" Then
        T = Arr(i, 1) & "_" & Arr(i, 3)
        For i2 = i + 1 To UBound(Arr)
            If Arr(i2, 4) <> "" Then
                T1 = Arr(i2, 4) & "_" & Arr(i, 3)
                If T = T1 Then
                    Brr(n, 1) = Arr(i, 1)
                    Brr(n, 3) = Arr(i, 3)
                    Brr(n + 1, 2) = Arr(i2, 2)
                    Brr(n + 1, 3) = Arr(i2, 3)
                    Brr(n + 1, 4) = Arr(i2, 4)
                    n = n + 2: xD(T1) = 1: Exit For
                End If
            Else
                Exit For
            End If
        Next i2
    End If
99: Next i

For i = 2 To UBound(Arr)
    If Arr(i, 1) <> "" Then
        T = Arr(i, 1) & "_" & Arr(i, 3)
    Else
        T = Arr(i, 4) & "_" & Arr(i, 3)
    End If
    If xD(T) <> 1 Then
        n1 = n1 + 1
        For j = 1 To 4: Crr(n1, j) = Arr(i, j): Next
    End If
Next
Sheets("比對").[h2].Resize(n, 4) = Brr
Sheets("比對").[o2].Resize(n1, 4) = Crr
End Sub
作者: sillykin    時間: 2021-8-26 21:31

感謝samwang的回覆,小弟在此謝謝協助
samwang程式試過答案正確。
是否能利用人工名冊、會計名冊先抓取到(比對區)A~D欄位在依『戶名』排序後,在執行後續程序呢??
作者: samwang    時間: 2021-8-27 06:58

回復 7# sillykin


是否能利用人工名冊、會計名冊先抓取到(比對區)A~D欄位在依『戶名』排序後,在執行後續程序呢??
>>不好意思,看不懂您的需求,請解釋詳細一點,謝謝
作者: sillykin    時間: 2021-8-27 09:41

把『人工名冊』、『會計名冊』資料抓到比對區A~D欄位中,在依『戶名』排序,む在依(重覆值)、(不重覆值)挑選出來(這塊依大大所提供程式可完成)め。
目前只差人工名冊、會計名冊為資料庫む名冊都會放在這二個名冊中め
把『人工名冊』、『會計名冊』資料抓到比對區A~D欄位中,在依『戶名』排序
因為,名冊還要復製到比對區,在依『戶名』排序,才能挑選(重覆值)、(不重覆值)
作者: samwang    時間: 2021-8-27 10:19

回復 9# sillykin


把『人工名冊』、『會計名冊』資料抓到比對區A~D欄位中,在依『戶名』排序
>> 我不了解,在依『戶名』排序,為什麼甲1、甲10、甲11...甲2,規則是什麼?
資料排列,會計名冊*2筆、人工名冊*1筆、會計名冊*1、人工名冊*1筆.... ,規則是什麼?
可否描述詳細一點?謝謝

作者: sillykin    時間: 2021-8-27 12:59

謝謝老師的回覆
沒關係,我在用人工複製二表單在排序,不影響結果,感謝老師耐心指導
作者: samwang    時間: 2021-8-27 14:24

回復 11# sillykin


H~K的結果是由A~D欄(人工複製二表單在排序)產出(原先您的需求),  
V~Y的結果是由"人工名冊"和"會計名冊"產出依據條件一樣(戶名+查詢日)
就如先前在詢問您A~D欄的資料規則,所以一直不知如何下手,
請問您有需求V~Y的程式需求嗎?
作者: sillykin    時間: 2021-8-27 15:42

H~K的結果是由A~D欄(人工複製二表單在排序)產出(原先您的需求),  
V~Y的結果是由"人工名冊"和"會計名冊"產出依據條件一樣(戶名+查詢日)
就如先前在詢問您A~D欄的資料規則,所以一直不知如何下手,
請問您有需求V~Y的程式需求嗎?
有需求V~Y的程式
但也需要A-D欄位的複製及排序
作者: samwang    時間: 2021-8-27 16:16

本帖最後由 samwang 於 2021-8-27 16:18 編輯

回復 13# sillykin

相同: V~Y的結果是由"人工名冊"和"會計名冊"產出依據條件一樣(戶名+查詢日)
不相同: 條件如上,結果AA~AD欄


但也需要A-D欄位的複製及排序 >> 這無法寫,因為沒有規則

Sub test()
Dim Arr, Brr(), Crr(), xD, xD1, T$, i&, n%, n1%
Set xD = CreateObject("Scripting.Dictionary")
Set xD1 = CreateObject("Scripting.Dictionary")
Arr = Range([人工名冊!a1], [人工名冊!c65536].End(3))
ReDim Brr(1 To UBound(Arr), 1 To 4) '相同
ReDim Crr(1 To UBound(Arr), 1 To 4) '不相同
For i = 2 To UBound(Arr)
    T = Arr(i, 3) & "_" & Arr(i, 1)
    xD(T) = Array(Arr(i, 1), Arr(i, 3))
Next
Arr = Range([會計名冊!a1], [會計名冊!c65536].End(3))
For i = 2 To UBound(Arr)
    T = Arr(i, 2) & "_" & Arr(i, 3)
    xD1(T) = Array(Arr(i, 1), Arr(i, 2), Arr(i, 3))
Next
For Each ky In xD
    If xD1.Exists(ky) Then
        n = n + 1: Brr(n, 1) = xD(ky)(0): Brr(n, 3) = xD(ky)(1)
        n = n + 1: For j = 2 To 4: Brr(n, j) = xD1(ky)(j - 2): Next
    Else
        n1 = n1 + 1: Crr(n1, 1) = xD(ky)(0): Crr(n1, 3) = xD(ky)(1)
    End If
Next
For Each ky In xD1
    If Not xD.Exists(ky) Then
        n1 = n1 + 1: For j = 2 To 4: Crr(n1, j) = xD1(ky)(j - 2): Next
    End If
Next
With Sheets("比對")
    If n > 0 Then   '相同
        .[v1:y1] = Array("日期", "統一編號", "戶名", "查詢日")
        .[v2].Resize(n, 4) = Brr
    End If
    If n1 > 0 Then  '不相同
        .[aa1:ad1] = Array("日期", "統一編號", "戶名", "查詢日")
        .[aa2].Resize(n1, 4) = Crr
    End If
End With
End Sub
作者: sillykin    時間: 2021-8-27 16:31

謝謝你,我在試一下,感謝
作者: 軒云熊    時間: 2021-8-31 15:14

本帖最後由 軒云熊 於 2021-8-31 15:16 編輯

回復 15# sillykin

但也需要A-D欄位的複製及排序
這是之前準大寫的 改了一下 試試看是不是你要的 感謝




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