Excel VBA-比较两个数组并返回在一个数组中但不在另一个数组的字符串



我有两个大小不同(行数不同(的二维字符串数组,分别命名为NewAssigneesArray和AssigneesDatabase。只使用两个数组的第一列,我想比较这两个数组,并提取出现在AssignmentsDatabase中但不在NewAssignmentsArray中的字符串。我已经在这个问题上纠结了很长一段时间,似乎没有破解它。因为在我的嵌套循环中,我比较每个似乎不起作用的元素。

附言:两个arrray中有重叠的字符串。这意味着,如果字符串同时在这两个字符串中,则应该忽略它。

这就是我目前所掌握的:

For a = LBound(NewAssigneesArray, 1) To UBound(NewAssigneesArray, 1)
For b = LBound(AssigneesDatabase, 1) To UBound(AssigneesDatabase, 1)
If NewAssigneesArray(a, 1) <> AssigneesDatabase(b, 1) Then
lastrow = DBSheet.Cells(Rows.count, 1).End(xlUp).Row
DBSheet.Cells(lastrow + 1, 1) = AssigneesDatabase(b, 1)
DBSheet.Cells(lastrow + 1, 2) = AssigneesDatabase(b, 2)
DBSheet.Cells(lastrow + 1, 3) = "New Entry"
Exit For
End If
Next b
Next a

如果将NewAssignees数组的第一列转换为脚本字典,则可以用单个Exists语句替换For b循环

Const ArrayRows As Long = 1
Const Column1 As Long = 0
Dim myAssignees As Scripting.Dictionary
Set myAssigness = New Scripting.Dictionary
Dim myRow As Long
For myRow = LBound(NewAssigneesArray, ArrayRows) To UBound(NewAssigneesArray, ArrayRows)
myAssignees.Add LCase$(Trim(NewAssigneesArray(myRow, Column1))), myRow
Next

然后,我会将for b循环的逻辑转移到一个单独的子循环,例如

Sub UpdateDatabase(ByVal myRow As Long)
If NewAssigneesArray.Exists(Trim(LCase$(AssigneeDatabase(Column1, myRow)))) Then Exit Sub
lastrow = DBSheet.Cells(ArrayRows.Count, 1).End(xlUp).Row
DBSheet.Cells(lastrow + 1, 1) = assigneesDatabase(myRow, 1)
DBSheet.Cells(lastrow + 1, 2) = assigneesDatabase(myRow, 2)
DBSheet.Cells(lastrow + 1, 3) = "New Entry"
End Sub

这允许For a循环减少为

For myRow = LBound(assigneesDatabase, ArrayRows) To UBound(assigneesDatabase, ArrayRows)
UpdateDatabase myRow
Next

您也在比较字符串,因此安全的操作方法是将字符串转换为一致的大小写,修剪以删除任何无意的空白,并在必要时替换字符串中的任何vbcrlf或vbtab

最新更新