Excel VBA Runtime error '438': объект не поддерживает это свойство или метод - PullRequest
1 голос
/ 21 июня 2019

Я запускаю этот код в 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 Ответ

2 голосов
/ 21 июня 2019

Ошибка здесь:

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))
...