Линия, которая бомбардирует:
Size_1_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Orig)) - 1
Цель кода - сравнить две одинаковые таблицы с похожей информацией, одну из прошлого года, а другую из этого года. Я ожидаю, что это будет происходить ежегодно, поэтому я пытаюсь написать это таким образом, чтобы предвидеть любые проблемы, которые могут возникнуть в будущем с разными именами файлов, типами файлов и пользовательским вводом, но я отступаю.
Электронная таблица фильтрует релевантные столбцы в надежде уменьшить размер массивов. После того, как он отфильтрован, он берет два столбца сравнения («Mon From Bus Num» и «Con1 From Bus Num») и извлекает комментарии за предыдущий год и вставляет эти комментарии в электронную таблицу за текущий год. Я также не уверен, что отфильтрованная / видимая информация в массиве работает правильно, не проверял ее
Это бомбардировка, где я пытаюсь измерить динамику c массив. Я работал над более простой настройкой, однако, когда я преобразовал код для работы с более сложной электронной таблицей, он дал мне ошибку несоответствия типов. Я нахожусь в стадии отладки, поэтому в коде может быть больше ошибок, которые я еще не получил.
Любая помощь будет принята с благодарностью. Я новичок, когда дело доходит до кодирования, и я также использовал бы любые указатели, чтобы сделать мой код более эффективным.
ПОЛНЫЙ КОД (пока)
Option Explicit
Global Username As String
Global ComboBox1 As String
Global ComboBox2 As String
Global WorkSh As Worksheet
Global FilterRow As Variant
Private Sub Test_Array()
'
' Test_Array Macro
'
Dim Size_1_Orig As Integer
Dim Size_2_Orig As Integer
Dim Size_3_Orig As Integer
Dim Size_1_Comp As Integer
Dim Size_2_Comp As Integer
Dim Size_3_Comp As Integer
Dim i_Orig As Integer
Dim i_Comp As Integer
Dim Column_Name_1_Orig As String
Dim Column_Name_2_Orig As String
Dim Column_Name_3_Orig As String
Dim Column_Name_1_Comp As String
Dim Column_Name_2_Comp As String
Dim Column_Name_3_Comp As String
Dim Array_1_Orig() As String
Dim Array_2_Orig() As String
Dim Array_3_Orig() As String
Dim Array_1_Comp() As String
Dim Array_2_Comp() As String
Dim Array_3_Comp() As String
Dim path As String
Column_Name_1_Orig = "Mon From Bus Num"
Column_Name_2_Orig = "Con1 From Bus Num"
Column_Name_3_Orig = "TP Comments"
Column_Name_1_Comp = "Mon From Bus Num"
Column_Name_2_Comp = "Con1 From Bus Num"
Column_Name_3_Comp = "TP Comments"
'Get the window username so that the program can be installed on any users desktop
Username = Environ$("username")
''''KEEP''''
''''KEEP'''' ComboBox1 = Compare.ComboBox1.Value
''''KEEP'''' ComboBox2 = Compare.ComboBox2.Value
''''KEEP''''
''''KEEP'''' 'close Userform
''''KEEP'''' Unload Compare_ITP_P3_Files
'----------------------------------------------------------------------------------------------------------------------
''''' FOR TESTING PURPOSES TO BYPASS THE USERFORM '''''
ComboBox1 = "2019.xlsx"
ComboBox2 = "2020.xlsx"
''''' FOR TESTING PURPOSES TO BYPASS THE USERFORM '''''
'----------------------------------------------------------------------------------------------------------------------
'----Open Wordbook-----
Call Open_Workbook_Orig
Sheets("Vo").Select
Range("A1").Select
'------------------------------ Find Original spreadsheet values & place them in an array ----------------------------------
'Arrays start counting at 0
Size_1_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Orig)) - 1
Size_2_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_2_Orig)) - 1
Size_3_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_3_Orig)) - 1
ReDim Array_1_Orig(Size_1_Orig)
ReDim Array_2_Orig(Size_2_Orig)
ReDim Array_3_Orig(Size_3_Orig)
For i_Orig = 0 To Size_1_Orig
Array_1_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_1_Orig).Value
' Debug.Print Array_1_Orig(i_Orig)
Next i_Orig
For i_Orig = 0 To Size_2_Orig
Array_2_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_2_Orig).Value
' Debug.Print Array_2_Orig(i_Orig)
Next i_Orig
For i_Orig = 0 To Size_3_Orig
Array_3_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_3_Orig).Value
' Debug.Print Array_3_Orig(i_Orig)
Next i_Orig
'------------------------------ Find Compare spreadsheet values & place them in an array ----------------------------------
Call Open_Workbook_Comp
Sheets("Vo").Select
Range("A1").Select
Size_1_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Comp)) - 1
Size_2_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_2_Comp)) - 1
Size_3_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_3_Comp)) - 1
ReDim Array_1_Comp(Size_1_Comp)
ReDim Array_2_Comp(Size_2_Comp)
ReDim Array_3_Comp(Size_3_Comp)
For i_Comp = 0 To Size_1_Comp
Array_1_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_1_Comp).Value
' Debug.Print Array_1_Comp(i_Comp)
Next i_Comp
For i_Comp = 0 To Size_2_Comp
Array_2_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_2_Comp).Value
' Debug.Print Array_2_Comp(i_Comp)
Next i_Comp
For i_Comp = 0 To Size_3_Comp
Array_3_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_3_Comp).Value
' Debug.Print Array_3_Comp(i_Comp)
Next i_Comp
'------------------------------ Compare both arrays ----------------------------------
Sheets("Vo").Select
Range("A2").Select
For i_Orig = 0 To Size_1_Comp
If Array_1_Orig(i_Orig) = Array_1_Comp(i_Orig) And Array_2_Orig(i_Orig) = Array_2_Comp(i_Orig) Then
Cells(i_Orig + 1, Column_Name_3_Comp).Value = Array_3_Orig(i_Orig)
End If
On Error Resume Next
Next i_Orig
'
End Sub
Private Sub Open_Workbook_Orig()
Dim strBookName As String
Dim wb As String
Dim path As String
path = "C:\Users\" & Username & "\Desktop\P3 output\"
wb = ComboBox1
strBookName = ComboBox1
If BookOpen(strBookName) Then
Application.WindowState = xlNormal
Windows(ComboBox1).Activate
Application.WindowState = xlMaximized
Set WorkSh = Sheets("Vo")
WorkSh.Activate
''''
''''
'''' ----------**************** The line below might bomb out if all filters are already open, haven't tested ****************----------
''''
''''
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
Else
Workbooks.Open path & wb
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
End If
End Sub
Private Sub Open_Workbook_Comp()
Dim strBookName As String
Dim wb As String
Dim path As String
path = "C:\Users\" & Username & "\Desktop\P3\"
wb = ComboBox2
strBookName = ComboBox2
If BookOpen(strBookName) Then
Application.WindowState = xlNormal
Windows(ComboBox2).Activate
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3"
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>"
Else
Workbooks.Open path & wb
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
End If
End Sub
Function BookOpen(strBookName As String) As Boolean
Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(strBookName)
On Error GoTo 0
If oBk Is Nothing Then
BookOpen = False
Else
BookOpen = True
End If
End Function