比较长度不等的两列的记录
Comparing records from two columns with unequal lengths
我正在验证 excel 的两个不同 sheet 上存在的两列(长度不等)。
第一个 sheet 名字是 'Task'。 'Task' sheet 的第 'A' 列有大约 200 个城市名称。
第二个sheet是'Cities'。 'Cities' sheet 的第 'A' 列有大约 8000 多个城市名称。
现在我需要进行验证,使 'Task' sheet 的 A 列中的城市名称应为
sheet 'Cities'
的第 'A' 列指定的城市名称中的任意一个
或者可以有多个条目,用分号隔开;根据分号分隔所有城市后,每个城市名称应与 'Cities' sheet.
的 D 列中的城市名称匹配
如果不是以上两种情况,那么应该是'All'
'Task' Sheet 中城市名称不匹配的单元格将变为红色背景
我的代码如下:(我只给出了需要的部分代码)
Dim CityString As String
Dim CityArray() As String
'Get the last row
'Dim lastRow As Integer
LastRow = ActiveSheet.UsedRange.Rows.Count
Dim c As Range
Dim d As Range
Dim e As Variant
'Turn screen updating off to speed up macro code.
'User won't be able to see what the macro is doing, but it will run faster.
Application.ScreenUpdating = False
For Each c In Worksheets("Task").Range("A2:A" & LastRow).Cells
CityString = c
CityArray() = Split(CityString, ";")
For Each e In CityArray()
e = Trim(e)
For Each d In Worksheets("Cities").Range("A2:A" & LastRow).Cells
c.Interior.Color = vbRed
If (UCase(e) = UCase(d) Or c = "All") Then
c.Interior.Color = vbWhite
Exit For
End If
Next
If c.Interior.Color = vbRed Then
Exit For
End If
Next
Next
现在,上面的代码只有在 sheets (Sheet1 - 'Task' 和 Sheet2 - 'Cities' 都相等时才有效记录数。如果 Sheet2 - 'Cities' 的记录数多于 'Task' Sheet,则上述代码不起作用。
例如:纽约位于 'Task' sheet 的 'A55' 单元格。
它也在 'Cities' Sheet 'A41' 中。我的代码正确验证了单元格。
例如:'A53' of 'Task' sheet 我有 'Tokyo' 而 'Task' Sheet 只有 200 条记录,其中 'Tokyo' 出现在 'Cities' sheet 的 'A988',它有 8000 多条记录,那么我的代码没有正确验证这个单元格。
任何人都可以给我一个替代代码吗?
我需要代码来比较两列长度不等的记录。
遍历值列表来搜索匹配项不是很有效。每个列表变得越长,运行 宏所需的时间就越长。相反,使用内置的 FIND 方法来搜索值。
我更新了代码以显示正在运行的 FIND 方法。检查一下,让我知道这是否使 sense/works.
(旁注):我在上面留下了评论,详细说明了为什么您的初始代码无法正常工作。您需要第二个变量来引用城市的最后一行 sheet。
Dim CityString As String
Dim CityArray() As String
'Get the last row
'Dim lastRow As Integer
LastRow = Sheets("Task").UsedRange.Rows.Count
nLastRowSheet2 = Sheets("Cities").UsedRange.Rows.Count
Dim c As Range
Dim d As Range
Dim e As Variant
'Turn screen updating off to speed up macro code.
'User won't be able to see what the macro is doing, but it will run faster.
Application.ScreenUpdating = False
For Each c In Worksheets("Task").Range("A2:A" & LastRow)
CityString = c
CityArray() = Split(CityString, ";")
For Each e In CityArray()
e = Trim(e)
Dim rngFnder As Range
On Error Resume Next
Set rngFnder = Sheets("Cities").Range("A2:A" & nLastRowSheet2).Find(e)
If rngFnder Is Nothing Then
c.Interior.Color = vbRed
End If
On Error GoTo 0
Next
Next
我正在验证 excel 的两个不同 sheet 上存在的两列(长度不等)。
第一个 sheet 名字是 'Task'。 'Task' sheet 的第 'A' 列有大约 200 个城市名称。
第二个sheet是'Cities'。 'Cities' sheet 的第 'A' 列有大约 8000 多个城市名称。
现在我需要进行验证,使 'Task' sheet 的 A 列中的城市名称应为
sheet 'Cities'
的第 'A' 列指定的城市名称中的任意一个
或者可以有多个条目,用分号隔开;根据分号分隔所有城市后,每个城市名称应与 'Cities' sheet.
的 D 列中的城市名称匹配
如果不是以上两种情况,那么应该是'All'
'Task' Sheet 中城市名称不匹配的单元格将变为红色背景
我的代码如下:(我只给出了需要的部分代码)
Dim CityString As String
Dim CityArray() As String
'Get the last row
'Dim lastRow As Integer
LastRow = ActiveSheet.UsedRange.Rows.Count
Dim c As Range
Dim d As Range
Dim e As Variant
'Turn screen updating off to speed up macro code.
'User won't be able to see what the macro is doing, but it will run faster.
Application.ScreenUpdating = False
For Each c In Worksheets("Task").Range("A2:A" & LastRow).Cells
CityString = c
CityArray() = Split(CityString, ";")
For Each e In CityArray()
e = Trim(e)
For Each d In Worksheets("Cities").Range("A2:A" & LastRow).Cells
c.Interior.Color = vbRed
If (UCase(e) = UCase(d) Or c = "All") Then
c.Interior.Color = vbWhite
Exit For
End If
Next
If c.Interior.Color = vbRed Then
Exit For
End If
Next
Next
现在,上面的代码只有在 sheets (Sheet1 - 'Task' 和 Sheet2 - 'Cities' 都相等时才有效记录数。如果 Sheet2 - 'Cities' 的记录数多于 'Task' Sheet,则上述代码不起作用。
例如:纽约位于 'Task' sheet 的 'A55' 单元格。 它也在 'Cities' Sheet 'A41' 中。我的代码正确验证了单元格。
例如:'A53' of 'Task' sheet 我有 'Tokyo' 而 'Task' Sheet 只有 200 条记录,其中 'Tokyo' 出现在 'Cities' sheet 的 'A988',它有 8000 多条记录,那么我的代码没有正确验证这个单元格。
任何人都可以给我一个替代代码吗? 我需要代码来比较两列长度不等的记录。
遍历值列表来搜索匹配项不是很有效。每个列表变得越长,运行 宏所需的时间就越长。相反,使用内置的 FIND 方法来搜索值。
我更新了代码以显示正在运行的 FIND 方法。检查一下,让我知道这是否使 sense/works.
(旁注):我在上面留下了评论,详细说明了为什么您的初始代码无法正常工作。您需要第二个变量来引用城市的最后一行 sheet。
Dim CityString As String
Dim CityArray() As String
'Get the last row
'Dim lastRow As Integer
LastRow = Sheets("Task").UsedRange.Rows.Count
nLastRowSheet2 = Sheets("Cities").UsedRange.Rows.Count
Dim c As Range
Dim d As Range
Dim e As Variant
'Turn screen updating off to speed up macro code.
'User won't be able to see what the macro is doing, but it will run faster.
Application.ScreenUpdating = False
For Each c In Worksheets("Task").Range("A2:A" & LastRow)
CityString = c
CityArray() = Split(CityString, ";")
For Each e In CityArray()
e = Trim(e)
Dim rngFnder As Range
On Error Resume Next
Set rngFnder = Sheets("Cities").Range("A2:A" & nLastRowSheet2).Find(e)
If rngFnder Is Nothing Then
c.Interior.Color = vbRed
End If
On Error GoTo 0
Next
Next