【问题标题】:Excel VBA Run-time error '438': Object doesn't support this property or methodExcel VBA 运行时错误“438”:对象不支持此属性或方法
【发布时间】:2019-11-04 11:48:03
【问题描述】:

我在 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做什么?
  • 你在哪一行得到错误?
  • 尝试 'wksht.Name = wkbk.Sheets(2).Name' 而不是 If wksht = wkbk.Sheets(2)'
  • @AmieBeckwith 对于 VBA,您可以通过按 F8 键在 VBA 编辑器中单步执行您的代码。如果您大致了解代码在哪里中断,但不知道具体是哪一行,您可以找出以下两种方法之一:在打开 VBA 编辑器窗口的情况下运行它(它将在引发错误的行停止),或者在您知道抛出错误的部分之前的某个位置放置一个断点(单击代码左侧的灰色列添加一个红点),然后从顶部运行整个事情。一旦代码在断点处暂停,按 F8 进入代码,一步一步。
  • @TylerH 你也可以使用 F9 切换断点

标签: excel vba runtime-error


【解决方案1】:

错误在这里:

If wksht = wkbk.Sheets(2) Then

Worksheet 类没有默认属性,所以你不能 let-coerce 该对象; 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))

【讨论】:

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