VBA 代码在一致的数据上给出不一致的结果
VBA code giving inconsistent results on consistent Data
我已经用尽了我的 knowledge/resources 试图解决这个问题。我正在比较 2 列 A 和 B。如果 A 中的值包含在 B 中,那么我的代码应该只从 A 中删除该值。
A是完整的唯一列表,B是过滤后的唯一列表。 B 中的每个值都应该存在于 A 中。在我当前的数据中,A 中值的最终计数始终为 2390,而 B 的最终计数始终为 2218。计算一下,我预计 A 列中还有 178 行。
当我 运行 以下代码时,我每次都会得到不同的最终计数。 253、242、249、246。我似乎无法理解问题出在哪里。我哪里错了?
Sub RemoveDuplicateFromOneColumnComparingWithAnother()
Worksheets(2).Range("B:B").RemoveDuplicates Columns:=1
Application.ScreenUpdating = False
Dim rngCell As Range
Dim rngCheck As Range
For Each rngCell In Range("A1").CurrentRegion.Columns(2).Cells
If Not IsEmpty(rngCell) Then
Do
Set rngCheck = Nothing
On Error Resume Next
Set rngCheck = Worksheets(2).Range("A1").CurrentRegion.Columns(1).Find("*" & rngCell.Value & "*")
rngCheck.ClearContents
Err.Clear: On Error GoTo -1: On Error GoTo 0
Loop Until rngCheck Is Nothing
End If
Next rngCell
Set rngCell = Nothing
Set rngCheck = Nothing
End Sub
此代码将 A 列中的每个值写入数组 a()
,并将 B 列中的每个值写入数组 b()
。然后循环遍历 a()
中的每个值。对于 a()
中的每个值,它循环遍历 b()
中的每个值。如果找到该值,它会将 flg
设置为 TRUE
并且不会将其写入我们的数组 c()
。如果 flg
仍然是 FALSE
,它会将值写入数组 c()
。然后我们返回并将 c()
中的值写入 C 列。您可以调整它以将唯一值 (c()
) 输出到您选择的任何位置。
已编辑:
Option Explicit
Sub test_array()
Dim a() As String, b() As String, c() As String
Dim flg As Boolean
Dim i As Long, j As Long, k As Long
Dim rng As Range
i = Range("a" & Rows.Count).End(xlUp).Row 'Edited to pull the row, not the cell
j = Range("b" & Rows.Count).End(xlUp).Row 'Edited to pull the row, not the cell
ReDim a(0 To i - 1)
ReDim b(0 To j - 1)
ReDim c(0 To i - 1)
For k = 0 To i - 1
a(k) = Cells(k + 1, "a")
Next k
For k = 0 To j - 1
b(k) = Cells(k + 1, "b")
Next k
k = 0
For i = 0 To UBound(a())
flg = False
For j = 0 To UBound(b())
If a(i) = b(j) Then
flg = True
Exit For
End If
Next j
If flg = False Then
k = k + 1
c(k - 1) = a(i)
End If
Next i
For k = LBound(c()) To UBound(c())
Cells(k + 1, "c") = c(k)
Next k
End Sub
我已经用尽了我的 knowledge/resources 试图解决这个问题。我正在比较 2 列 A 和 B。如果 A 中的值包含在 B 中,那么我的代码应该只从 A 中删除该值。
A是完整的唯一列表,B是过滤后的唯一列表。 B 中的每个值都应该存在于 A 中。在我当前的数据中,A 中值的最终计数始终为 2390,而 B 的最终计数始终为 2218。计算一下,我预计 A 列中还有 178 行。
当我 运行 以下代码时,我每次都会得到不同的最终计数。 253、242、249、246。我似乎无法理解问题出在哪里。我哪里错了?
Sub RemoveDuplicateFromOneColumnComparingWithAnother()
Worksheets(2).Range("B:B").RemoveDuplicates Columns:=1
Application.ScreenUpdating = False
Dim rngCell As Range
Dim rngCheck As Range
For Each rngCell In Range("A1").CurrentRegion.Columns(2).Cells
If Not IsEmpty(rngCell) Then
Do
Set rngCheck = Nothing
On Error Resume Next
Set rngCheck = Worksheets(2).Range("A1").CurrentRegion.Columns(1).Find("*" & rngCell.Value & "*")
rngCheck.ClearContents
Err.Clear: On Error GoTo -1: On Error GoTo 0
Loop Until rngCheck Is Nothing
End If
Next rngCell
Set rngCell = Nothing
Set rngCheck = Nothing
End Sub
此代码将 A 列中的每个值写入数组 a()
,并将 B 列中的每个值写入数组 b()
。然后循环遍历 a()
中的每个值。对于 a()
中的每个值,它循环遍历 b()
中的每个值。如果找到该值,它会将 flg
设置为 TRUE
并且不会将其写入我们的数组 c()
。如果 flg
仍然是 FALSE
,它会将值写入数组 c()
。然后我们返回并将 c()
中的值写入 C 列。您可以调整它以将唯一值 (c()
) 输出到您选择的任何位置。
已编辑:
Option Explicit
Sub test_array()
Dim a() As String, b() As String, c() As String
Dim flg As Boolean
Dim i As Long, j As Long, k As Long
Dim rng As Range
i = Range("a" & Rows.Count).End(xlUp).Row 'Edited to pull the row, not the cell
j = Range("b" & Rows.Count).End(xlUp).Row 'Edited to pull the row, not the cell
ReDim a(0 To i - 1)
ReDim b(0 To j - 1)
ReDim c(0 To i - 1)
For k = 0 To i - 1
a(k) = Cells(k + 1, "a")
Next k
For k = 0 To j - 1
b(k) = Cells(k + 1, "b")
Next k
k = 0
For i = 0 To UBound(a())
flg = False
For j = 0 To UBound(b())
If a(i) = b(j) Then
flg = True
Exit For
End If
Next j
If flg = False Then
k = k + 1
c(k - 1) = a(i)
End If
Next i
For k = LBound(c()) To UBound(c())
Cells(k + 1, "c") = c(k)
Next k
End Sub