如何比较两个不同的Excel工作簿中的列

时间:2015-01-23 10:22:27

标签: excel-vba vba excel

我有一张Excel工作簿,里面有两张工作表'任务'和'城市'。 我需要比较来自'任务'的记录验证代码。与“城市”中的那张相关的表格。片。

我能够做到如下:

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

现在我有另一个要求,我必须从两个不同的工作簿中做同样的事情。

('任务'以及'城市'工作表位于两个不同的工作簿上)

谁能告诉我;我必须对上面的代码做出哪些改变?

2 个答案:

答案 0 :(得分:2)

当你在两个不同的excelssheets"上说"我猜你的意思是他们在不同的Excel工作簿文件中?

当您使用以下行时,您将参考表格"任务"在活跃的工作簿中。

Worksheets("Task").Range("A2:A" & LastRow)

您应该指定工作簿以避免写入错误的工作簿。使用thisWorkbook引用带有代码的工作簿,例如

ThisWorkbook.Worksheets("Task").Range("A2:A" & LastRow)

要访问任何打开的工作簿,包括当前工作簿,请使用

Workbooks("example.xls").Worksheets("Task").Range("A2:A" & LastRow)

如果工作簿已关闭,您可以使用

打开它
dim wrk as Workbook
set wrk = Workbooks.Open("C:\Docs\example.xls") 
wrk.Worksheets("Task").Range("A2:A" & LastRow)

如果您想了解有关VBA中工作簿的更多信息,可以阅读它们here

答案 1 :(得分:0)

我准备了另一个名为'Sample_Data.xlsx'的工作簿,我将在其中有一个工作表'cities'。

所以在下面的代码中,我必须进行更改才能正常工作;当我的'Sample_Data.xlsx'工作簿关闭时。 以下代码打开工作簿;但不要做验证。

Dim CityString As String
Dim CityArray() As String

'Get the last row
'Dim lastRow As Integer
LastRow = Sheets("Task").UsedRange.Rows.Count

Dim wrk As Workbook
Set wrk = Workbooks.Open("E:\Final\Sample_Data.xlsx")

nLastRowSheet2 = wrk.Worksheets("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 = wrk.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