【发布时间】:2015-01-21 11:40:16
【问题描述】:
我正在验证两个不同的 Excel 表上存在的两列(长度不等)。
第一个工作表名称是“任务”。 “任务”表的“A”列有大约 200 个城市名称。
第二张是“城市”。 “城市”表的“A”列有大约 8000 多个城市名称。
现在我需要进行验证,以便“任务”表的 A 列中的城市名称应该是
工作表“城市”的“A”列中指定的城市名称之一
或者它可以有多个用分号分隔的条目;以分号分隔所有城市后,每个城市名称应与“城市”表 D 列中的城市名称匹配。
如果不在上述两种情况中,则应为 '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 值。 [个人偏好]:当我为两张不同的工作表识别最后一行时,我有时会使用不同的变量。这减少了我的困惑。编辑:看起来您将需要使用两个不同的变量,因为两个工作表的最后一行都被同时引用。