Ваша линия:
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
Знаете ли вы, на чью строку набрасывается ошибка? Неважно. Я только что проверил, и он сбой для меня в наиболее логичной точке «Set File_Path1 = ...». –
Вы получили это ...Заранее спасибо за то, что посмотрели мой код. – supernoob