【问题标题】:Excel VBA - Run-time Error 13 - Type MismatchExcel VBA - 运行时错误 13 - 类型不匹配
【发布时间】:2020-01-27 14:00:07
【问题描述】:

爆炸线:

Size_1_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Orig)) - 1

代码的目的是比较两个具有相似信息的相似电子表格,一个是去年的,另一个是今年的。我预计这是每年都会发生的事情,所以我试图以一种方式来编写它,以预测我将来可能会遇到不同文件名、文件类型和用户输入的任何问题,但我离题了。

电子表格会过滤相关的列,以减少数组的大小。过滤后,它会获取两个比较列(“Mon From Bus Num”和“Con1 From Bus Num”)并从上一年提取 cmets 并将这些 cmets 粘贴到当前年份的电子表格中。 我也不确定数组中的过滤/可见信息是否正常工作,还没有测试它

我正在尝试调整动态数组的大小。我在一个更简单的设置上工作,但是当我将代码转换为使用更复杂的电子表格时,它给了我类型不匹配错误。我正处于调试阶段,所以代码中可能还有更多我尚未解决的错误。

任何帮助将不胜感激。在编码方面,我是一个新手,并且还会采取任何指针来提高我的代码效率。

完整代码(到目前为止)

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

【问题讨论】:

  • 该列是命名范围吗?使用Range 而不是Columns
  • 另外,不要使用Integeruse Long

标签: excel vba type-mismatch


【解决方案1】:

谢谢 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

再次感谢您!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多