【问题标题】:Comparing records from two columns with unequal lengths比较两列长度不等的记录
【发布时间】:2015-01-21 11:40:16
【问题描述】:

我正在验证两个不同的 Excel 表上存在的两列(长度不等)。

第一个工作表名称是“任务”。 “任务”表的“A”列有大约 200 个城市名称。

第二张是“城市”。 “城市”表的“A”列有大约 8000 多个城市名称。

现在我需要进行验证,以便“任务”表的 A 列中的城市名称应该是

  1. 工作表“城市”的“A”列中指定的城市名称之一

  2. 或者它可以有多个用分号分隔的条目;以分号分隔所有城市后,每个城市名称应与“城市”表 D 列中的城市名称匹配。

  3. 如果不在上述两种情况中,则应为 'All'

“任务”表中城市名称不匹配的单元格将变为红色背景

我的代码如下:(我只是给出了所需的部分代码)

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

现在,上述代码仅在工作表(Sheet1 - 'Task' 和 Sheet2 - 'Cities' 的记录数相等时才有效。如果 Sheet2 - 'Cities' 的记录数多于 'Task' 工作表,则上面的代码不起作用。

例如:纽约位于“任务”工作表的“A55”单元格。 它也在“A41”的“城市”表中。我的代码正确验证了单元格。

例如:“任务”表的“A53”我有“东京”和“任务”表只有 200 条记录,而“东京”出现在“城市”表的“A988”中,大约有 8000 + 记录,那么我的代码无法正确验证此单元格。

谁能给我一个相同的替代代码? 我需要代码来比较两列长度不等的记录。

【问题讨论】:

  • 我会把这个项目分解成几个更小的步骤:(1)将“城市”表转换为城市名称的单列,这意味着所有以分号分隔的单元格都已被解析出来,每个单元格都包含正是一个城市名称。 (2) 遍历城市名称的“城市”列,在“任务”表上搜索匹配项。 (3) 根据是否找到匹配应用格式
  • @DanWagner 哦...伙计谢谢您的回复...我只提供了一小部分代码。我的两张纸每张都有 30 多列。其中一个是“城市”,我的这个问题与我在 stackoverflow.com 上提出的另一个问题有关。你也能看进去吗。 link 我已经按照你的建议编写了代码。但是我需要一个代码,它可以在“城市”表的记录少于“任务”的情况下工作(如果应用上面解释的逻辑),反之亦然
  • @DanWagner 因为我在 excelsheet 中有大约 40 种其他类型的验证;再次将逻辑分解为更小的步骤,从而降低性能:(
  • 看来您需要重新定义“LastRow”变量才能与“城市”表一起使用。它使用任务表中先前声明的 LastRow 值。 [个人偏好]:当我为两张不同的工作表识别最后一行时,我有时会使用不同的变量。这减少了我的困惑。编辑:看起来您将需要使用两个不同的变量,因为两个工作表的最后一行都被同时引用。

标签: excel vba


【解决方案1】:

循环遍历值列表来搜索匹配项的效率不是很高。每个列表越长,运行宏所需的时间就越长。相反,使用内置的 FIND 方法来搜索值。

我更新了代码以显示 FIND 方法的实际作用。检查一下,让我知道这是否有意义/有效。

(旁注):我在上面留下了一条评论,详细说明了为什么您的初始代码无法正常工作。您需要第二个变量来引用城市表的最后一行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多