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

Excel VBA运行时错误“438”:对象不支持此属性或方法,excel,vba,runtime-error,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 w

我正在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
此代码应该从多个工作表中获取数据,并将其合并到一个工作表中。如前所述,运行宏时出现运行时错误且无输出。

错误如下:

If wksht = wkbk.Sheets(2) Then
工作表类没有默认属性,因此不能强制该对象;VBA试图调用工作表的默认成员以满足比较运算符,但没有这样的成员,因此引发错误438

我想你要做的是验证wksht是否为wkbk.Sheets2。您需要Is运算符以实现引用相等:

If wksht Is wkbk.Sheets(2) Then
请注意,这与比较工作表的.Name不同:这里我们比较的是对象引用

也就是说,我会在这里买一两个元音,打字太容易了。。。确保已指定选项Explicit

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


如果wksht=wkbk.Sheets2,您想怎么办?您在哪个行上出错?尝试“wksht.Name=wkbk.Sheets2.Name”,而不是如果wksht=wkk.Sheets2'@amiebackwith For VBA,则可以通过按F8键在VBA编辑器中逐步查看代码。如果您对代码中断的位置有一个大致的了解,但不知道具体是哪一行,您可以找到以下两种方法之一:在VBA编辑器窗口打开的情况下运行它,它将在抛出错误的行上停止,或者放置一个断点,单击代码左侧的灰色列,在您知道的抛出错误的部分之前添加一个红点,然后从顶部运行整个过程。代码在断点处暂停后,按F8逐步进入代码。@TylerH您也可以使用F9切换断点
wkbk.Sheets.Add Before:=wkbk.Sheets(1)
Set DataSheet = ActiveSheet
Set DataSheet = wkbk.Sheets.Add(Before:=wkbk.Sheets(1))