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