2015-04-15 4 views
1

Я поручил себе создать небольшой инструмент QA, но проблема в том, что я не очень хорошо знаком с VBA или программированием. Я хочу, чтобы иметь возможность итерации через один столбец в трех разных CSV-файлах. Ячейки в этих столбцах должны совпадать, и вся точка инструмента - идентифицировать ячейки, которые являются «странным человеком».VBA - Сравнить значения ячеек в нескольких рабочих листах

В настоящее время у меня есть некоторые спагетти код, который дает мне ошибку "false.xlsx" не найден ... Пожалуйста, будьте нежны ...

Sub CompareLists() 

Dim count As Integer 
Dim kRange As Range 
Dim LastRow As Long 
Dim iRow As Long 
Dim varSheetA As Variant 
Dim varSheetB As Variant 
Dim varSheetC As Variant 


LastRow = Range("A" & Rows.count).End(xlUp).Row 
Set kRange = ActiveSheet.Range("A3:A" & LastRow) 


Set File_Path1 = Workbooks.Open(Filename = "C:\Test Files\Test_File1.csv") 
Set varSheetA = File_Path1.Worksheets("Sheet1").Range(kRange) 
Set File_Path2 = Workbooks.Open(Filename = "C:\Test Files\Test_File2.csv") 
Set varSheetB = File_Path2.Worksheets("Sheet1").Range(kRange) 
Set File_Path3 = Workbooks.Open(Filename = "C:\Test Files\Test_File3.csv") 
Set varSheetC = File_Path3.Worksheets("Sheet1").Range(kRange) 


For iRow = LBound(varSheetA) To UBound(varSheetA) 
    count = 1 
    If varSheetA(iRow) = varSheetB(iRow) Then 
     count = count + 1 
    Else 
    If varSheetA(iRow) = varSheetC(iRow) Then 
     count = count + 1 
    Else 
     If count < 3 Then 
      ActiveCell.Interior.ColorIndex = 3 
     End If 
    End If 
    End If 
Next 

End Sub 
+0

Знаете ли вы, на чью строку набрасывается ошибка? Неважно. Я только что проверил, и он сбой для меня в наиболее логичной точке «Set File_Path1 = ...». –

+0

Вы получили это ...Заранее спасибо за то, что посмотрели мой код. – supernoob

ответ

3

Ваша линия:

Set File_Path1 = Workbooks.Open(Filename = "C:\Test Files\Test_File1.csv") 

Вычисляет внутри как логическая проверка того, имеет ли какая-то несуществующая переменная Filename значение «C: \ Test Files \ Test_File1.csv». Поскольку новая переменная Filename не имеет значения, сравнение возвращает false. Вероятно, вы пытались сделать :=, а не =. Оператор := присваивает параметру метода, а = либо выполняет логическую оценку, либо присваивает переменные. Любая из следующих четырех строк должна исправить вашу ошибку, поскольку сначала используйте оператор := для назначения параметру Filename, а последние два просто знают, что имя файла является первым параметром по умолчанию.

Set File_Path1 = Workbooks.Open(Filename:="C:\Test Files\Test_File1.csv") 
Set File_Path1 = Workbooks.Open Filename:="C:\Test Files\Test_File1.csv" 
Set File_Path1 = Workbooks.Open("C:\Test Files\Test_File1.csv") 
Set File_Path1 = Workbooks.Open "C:\Test Files\Test_File1.csv" 

В качестве побочного примечания в VBA это должно быть очень осторожно. Поместите Option Explicit в верхней части каждого модуля, чтобы он заставлял вас определять ваши переменные. Если вы это сделаете, ваша строка с ошибкой будет жаловаться на то, что переменная «Filename» не была определена.

Насколько ваша следующая линия идет:

Set varSheetA = File_Path1.Worksheets("Sheet1").Range(kRange) 

у вас есть две проблемы. Во-первых, при открытии csv-файла имя закладки всегда совпадает с именем файла и NOT Sheet1. Во-вторых, kRange является частью рабочего листа, на котором вы начали, чтобы получить сопоставимый диапазон на новом листе, вы должны использовать kRange.Address. Эти исправления меняют вышеуказанное на:

Set varSheetA = File_Path1.Worksheets("Test_File1").Range(kRange.Address) 

Ваша петля рассматривает диапазоны как массивы. Самый прямой способ исправить это - заставить их быть массивами, изменив операторы Dim (добавив круглые скобки) и операторы присваивания для ваших переменных диапазона (удаление и добавление .Value).

Dim varSheetA() As Variant 
... 
varSheetA = File_Path1.Worksheets("Test_File1").Range(kRange.Address).Value 
... 
If varSheetA(iRow, 1) = varSheetB(iRow, 1) Then 

Лучший метод альтернатива никогда не создавать переменные диапазона в первую очередь и просто захватить клетки с помощью индексов строки и столбца.

Sub CompareLists_2() 
    Dim count As Integer 
    Dim LastRow As Long, iRow As Long 
    Dim MainSht As Worksheet, ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet 

    Set MainSht = ActiveSheet 
    LastRow = MainSht.Range("A" & Rows.count).End(xlUp).Row 
    Set ws1 = Workbooks.Open(Filename:="C:\Test Files\Test_File1.csv").Worksheets("Test_File1") 
    Set ws2 = Workbooks.Open(Filename:="C:\Test Files\Test_File2.csv").Worksheets("Test_File2") 
    Set ws3 = Workbooks.Open(Filename:="C:\Test Files\Test_File3.csv").Worksheets("Test_File3") 

    For iRow = 3 To LastRow 
     count = 1 
     If ws1.Cells(iRow, 1).Value = ws2.Cells(iRow, 1).Value Then 
      count = count + 1 
     Else 
      If ws1.Cells(iRow, 1).Value = ws3.Cells(iRow, 1).Value Then 
       count = count + 1 
      Else 
       If count < 3 Then 
        MainSht.Cells(iRow, 1).Interior.ColorIndex = 3 
       End If 
      End If 
     End If 
    Next 
End Sub 

Конечно, насколько я могу сказать, ваша логическая логика сводится к:

If ws1.Cells(iRow, 1).Value <> ws2.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value And ws2.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value Then 
    MainSht.Cells(iRow, 1).Interior.ColorIndex = 3 
End If 

Пересмотру булевой логики в комментарии (хотя я немного запутался по логике):

If ws1.Cells(iRow, 1).Value <> ws2.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value And ws2.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value Then 
    ws1.Cells(iRow, 1).Interior.ColorIndex = 3 
ElseIf ws1.Cells(iRow, 1).Value = ws2.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value Then 
    ws1.Cells(iRow, 1).Interior.ColorIndex = 3 
    ws2.Cells(iRow, 1).Interior.ColorIndex = 3 
End If 
+0

Я немного изменил код, чтобы заставить его делать то, что я хочу, но он работает. Спасибо за вашу помощь! На следующей неделе я отправлю окончательный код, чтобы вы могли взглянуть на него, если хотите. – supernoob

0
Sub CompareLists() 
Dim count As Integer 
Dim LastRow As Long, iRow As Long 
Dim MainSht As Worksheet, ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet 
Dim ws5 As Workbook 
Dim var1 As Variant 


Set ws1 = Workbooks.Open(Filename:="C:\Test Files\Test_File1.csv").Worksheets("Test_File1") 
Set ws2 = Workbooks.Open(Filename:="C:\Test Files\Test_File2.csv").Worksheets("Test_File2") 
Set ws3 = Workbooks.Open(Filename:="C:\Test Files\Test_File3.csv").Worksheets("Test_File3") 

Set MainSht = ws1 
LastRow = MainSht.Range("A" & Rows.count).End(xlUp).Row 

For iRow = 3 To LastRow 
    count = 1 

    If ws1.Cells(iRow, 1).Value <> ws2.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value Then 
     ws1.Cells(iRow, 1).Interior.ColorIndex = 3 

    ElseIf ws1.Cells(iRow, 1).Value = ws2.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value Then 
     ws1.Cells(iRow, 1).Interior.ColorIndex = 6 
     ws2.Cells(iRow, 1).Interior.ColorIndex = 6 

    ElseIf ws1.Cells(iRow, 1).Value = ws3.Cells(iRow, 1).Value And ws1.Cells(iRow, 1).Value <> ws2.Cells(iRow, 1).Value Then 
     ws1.Cells(iRow, 1).Interior.ColorIndex = 6 
     ws3.Cells(iRow, 1).Interior.ColorIndex = 6 
    End If 

    If ws3.Cells(iRow, 1).Value <> ws2.Cells(iRow, 1).Value And ws3.Cells(iRow, 1).Value <> ws1.Cells(iRow, 1).Value Then 
     ws3.Cells(iRow, 1).Interior.ColorIndex = 3 
    ElseIf ws3.Cells(iRow, 1).Value = ws2.Cells(iRow, 1).Value And ws3.Cells(iRow, 1).Value <> ws1.Cells(iRow, 1).Value Then 
     ws3.Cells(iRow, 1).Interior.ColorIndex = 6 
     ws2.Cells(iRow, 1).Interior.ColorIndex = 6 
    End If 

    If ws2.Cells(iRow, 1).Value <> ws3.Cells(iRow, 1).Value And ws2.Cells(iRow, 1).Value <> ws1.Cells(iRow, 1).Value Then 
     ws2.Cells(iRow, 1).Interior.ColorIndex = 3 

    End If 


Next 



End Sub 
Смежные вопросы