Excel VBA运行时错误“ 438”:对象不支持此属性或方法

时间:2019-06-21 15:41:22

标签: excel vba runtime-error

我正在VBA中运行此代码,但无法弄清楚我的错误在哪里。我不断收到错误消息

  

“运行时错误'438':对象不支持此属性或方法”。

我已经在互联网上寻找解决方案,但找不到能解决我问题的任何东西。

 Sub FinalCleanUp()
    Dim wkbk As Workbook
    Dim wksht As Worksheet
    Dim DataSheet As Worksheet
    Dim sheetName As String

    sheetName = "Data"
    Set wkbk = ActiveWorkbook

    'Delete consolidated data sheet if it already exists
    For Each wksht In wkbk.Sheets
        If wksht.Name = sheetName Then
            wkbk.Sheets(sheetName).Delete
            Exit For
        End If
    Next wksht

    'Create new sheet for consolidated data
    wkbk.Sheets.Add Before:=wkbk.Sheets(1)
    Set DataSheet = ActiveSheet
    ActiveSheet.Name = sheetName

    'Step through each sheet and copy data to consolidated data sheet
    'ERROR IS SOMEWHERE BELOW HERE
    For Each wksht In wkbk.Sheets
        If wksht.Name <> sheetName Then
            wksht.Activate
            Range(Cells(1, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)).Copy
            If wksht = wkbk.Sheets(2) Then
                DataSheet.Activate
                Cells(ActiveSheet.UsedRange.Rows.Count, 1).Select
            Else
                DataSheet.Activate
                Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).Select
            End If
            ActiveSheet.Paste
        End If
    Next wksht

End Sub

该代码应该从多个工作表中获取数据并将其合并到一个工作表中。如前所述,运行宏时出现运行时错误且无输出。

1 个答案:

答案 0 :(得分:2)

错误在这里:

If wksht = wkbk.Sheets(2) Then

Worksheet类没有默认属性,因此您不能强制该对象; VBA尝试调用Worksheet的默认成员来满足比较运算符,但是由于没有这种成员,因此会引发错误438。

我认为您要尝试验证wksht 是否 wkbk.Sheets(2)。您需要Is运算符以实现引用相等:

If wksht Is wkbk.Sheets(2) Then

请注意,这与比较工作表的.Name不同:这里我们比较的是对象引用

也就是说,我要在这里买一个或两个元音,键入这些错字太容易了……确保指定了Option Explicit


附录

wkbk.Sheets.Add Before:=wkbk.Sheets(1)
Set DataSheet = ActiveSheet

Worksheets.Add返回添加的工作表对象,因此您可以改为执行此操作,而不必依赖添加的表现在为ActiveSheet的副作用:

Set DataSheet = wkbk.Sheets.Add(Before:=wkbk.Sheets(1))