我將嘗試將其濃縮為一般意義。我有一個 Excel 作業表,其中包含需要用戶輸入的兩組不同的單元格。第一組有 8 個輸入,第二組有 5 個。
假設資料集一和二有用戶輸入的字母,如下所示:
DataSetOne(0) = A
DataSetOne(1) = B
DataSetOne(2) = C
DataSetOne(3) = D
DataSetOne(4) = E
DataSetOne(5) = F
DataSetOne(6) = G
DataSetOne(7) = H
DataSetTwo(0) = A
DataSetTwo(1) = B
DataSetTwo(2) = H
DataSetTwo(3) = D
DataSetTwo(4) = C
我需要檢查兩組復制資料。但是,我只關心是否有任何兩個并排的值重復,而不僅僅是單個值。
例如,資料集一包含七個連續的“對”輸入資料:
Pair 1 = A, B
Pair 2 = B, C
Pair 3 = C, D
Pair 4 = D, E
Pair 5 = E, F
Pair 6 = F, G
Pair 7 = G, H
同樣,資料集二還有四對額外的資料:
Pair 8 = A, B
Pair 9 = B, H
Pair 10 = H, D
Pair 12 = D, C
我需要看看這些對中是否有任何匹配。順序無關緊要 - 只要兩對具有相同的兩個單獨輸入,我就需要以一種方式做出決定。如果這些對不包含兩個匹配值,那么我的決定會以不同的方式進行。
所以在上面的例子中,我需要我的代碼來識別以下之間的匹配:
- 對 1 和對 8
- 對 3 和對 12
基于此,我的代碼會做一件事。同時,所有其他對,因為它們不包含兩個匹配/相同的值,會做不同的事情。我覺得這應該相對簡單,但我不知道該怎么做。任何幫助表示贊賞。謝謝你。
uj5u.com熱心網友回復:
要找到重復項,即兩個串列中都存在的值,最簡單的實作方法是簡單地對兩個串列進行暴力搜索迭代。根據您的應用程式,這可能已經足夠了。
例如:
Public Sub SO70184805_find_duplicates()
Dim DataSetOne(0 To 7) As String
Dim DataSetTwo(0 To 4) As String
Const Delimiter As String = ", "
DataSetOne(0) = "A"
DataSetOne(1) = "B"
DataSetOne(2) = "C"
DataSetOne(3) = "D"
DataSetOne(4) = "E"
DataSetOne(5) = "F"
DataSetOne(6) = "G"
DataSetOne(7) = "H"
DataSetTwo(0) = "A"
DataSetTwo(1) = "B"
DataSetTwo(2) = "H"
DataSetTwo(3) = "D"
DataSetTwo(4) = "C"
Dim PairsOne(0 To 6) As String
Dim PairsTwo(0 To 3) As String
Dim I As Integer
Dim S1 As Variant
Dim S2 As Variant
'Make the lists of pairs
Debug.Print "Pairs from the first list:"
For I = 0 To 6
If (DataSetOne(I) < DataSetOne(I 1)) Then
PairsOne(I) = DataSetOne(I) & Delimiter & DataSetOne(I 1)
Else
PairsOne(I) = DataSetOne(I 1) & Delimiter & DataSetOne(I)
End If
Debug.Print (PairsOne(I))
Next I
Debug.Print
Debug.Print "Pairs from the second list:"
For I = 0 To 3
If (DataSetTwo(I) < DataSetTwo(I 1)) Then
PairsTwo(I) = DataSetTwo(I) & Delimiter & DataSetTwo(I 1)
Else
PairsTwo(I) = DataSetTwo(I 1) & Delimiter & DataSetTwo(I)
End If
Debug.Print (PairsTwo(I))
Next I
Debug.Print
Debug.Print ("Duplicates:"):
Dim NumberOfDuplicates As Integer
NumberOfDuplicates = 0
For Each S1 In PairsOne
For Each S2 In PairsTwo
If (S1 = S2) Then
Debug.Print (S1)
NumberOfDuplicates = NumberOfDuplicates 1
End If
Next
Next
End Sub
這是輸出:
Pairs from the first list:
A, B
B, C
C, D
D, E
E, F
F, G
G, H
Pairs from the second list:
A, B
B, H
D, H
C, D
Duplicates:
A, B
C, D
uj5u.com熱心網友回復:
沿著這些思路,我現在要回家了,所以不能做更多了。如果可能的話,我稍后會重溫。您需要添加腳本運行時參考才能使用字典。
Sub datasets()
Dim datasetone(7) As String
Dim datasettwo(4) As String
Dim dicPairsOne As New Scripting.Dictionary
Dim dicPairsTwo As New Scripting.Dictionary
Dim l As Long
Dim strPair As String
datasetone(0) = "A"
datasetone(1) = "B"
datasetone(2) = "C"
datasetone(3) = "D"
datasetone(4) = "E"
datasetone(5) = "F"
datasetone(6) = "G"
datasetone(7) = "H"
datasettwo(0) = "A"
datasettwo(1) = "B"
datasettwo(2) = "H"
datasettwo(3) = "D"
datasettwo(4) = "C"
For l = 0 To UBound(datasetone) - 1
strPair = datasetone(l) & "," & datasetone(l 1)
If Not dicPairsOne.Exists(strPair) Then
dicPairsOne.Add strPair, 1
Else
dicPairsOne(strPair) = dicPairsOne(strPair) 1
End If
If Not dicPairsOne.Exists(StrReverse(strPair)) Then
dicPairsOne.Add StrReverse(strPair), 1
Else
dicPairsOne(StrReverse(strPair)) = dicPairsOne(StrReverse(strPair)) 1
End If
Next l
For l = 0 To UBound(datasettwo) - 1
strPair = datasettwo(l) & "," & datasettwo(l 1)
If Not dicPairsTwo.Exists(strPair) Then
dicPairsTwo.Add strPair, 1
Else
dicPairsTwo(strPair) = dicPairsTwo(strPair) 1
End If
Next l
For l = 0 To dicPairsOne.Count - 1
If dicPairsTwo.Exists(dicPairsOne.Keys()(l)) Then
Debug.Print dicPairsOne.Keys()(l)
End If
Next l
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372350.html
上一篇:從稀疏但規則的資料創建動態陣列
下一篇:陣列中的3個嵌套回圈-VBA
