Excel VBA - ошибка выполнения 13 - несоответствие типов - PullRequest
0 голосов
/ 27 января 2020

Линия, которая бомбардирует:

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

1 Ответ

0 голосов
/ 27 января 2020

Спасибо, BigBen, вы меня правильно выбрали. Я не понял, что вы упомянули о столбцах.

Мне удалось достичь того, что мне нужно, с помощью следующего

    For Each Cell In Range("A1:CC1")
        If Cell.Value = Column_Name_1_Orig Then
            Cell.Select
            Size_1_Orig = Cells(Rows.Count, ActiveCell.Column).End(xlUp).Row - 1
            Size_1_Orig_Count = Size_1_Orig_Count + 1
            Exit For
        End If
        Size_1_Orig_Count = Size_1_Orig_Count + 1
    Next

Еще раз спасибо!

...