2016-04-26 10 views
0

Код ниже, дайте мне эту ошибку: Class does not support automation or does not support expected interfaceТип Run Time Error

Может кто-нибудь пожалуйста, объяснить, почему я получаю эту ошибку

Sub typeofcheck() 
Dim wks As New Worksheet 

If TypeOf wks Is Worksheet Then 
    MsgBox "This is Worksheet" 
Else 
    MsgBox "This is not" 
End If 
End Sub 

ответ

0

Не уверен, если можно объяснить, но я думаю, что вы можете исправить свой код путем инициализации переменных wks. Что-то вроде этого

Sub typeofcheck() 
Dim wks As New Worksheet 
Set wks = Sheets("someFunnySheetName") 


If TypeOf wks Is Worksheet Then 
    MsgBox "This is Worksheet" 
Else 
    MsgBox "This is not" 
End If 
End Sub 

ИМХО проблема будет, что с DIM вас только alocate некоторое количество памяти, и с Set вы установите тип данных. Но VBA - это своего рода мистерия. Как только я попытался что-то прочитать в документации MSDN, и это было хуже, чем черт ...

edit1: я сделал еще один тест, и эта хорошая ошибка msg, которую вы упоминаете, звучит очень профессионально, но если вы отлаживаете код и наведите указатель мыши на переменную wks, она сообщит вам, что wks = <Object variable or With block variable not set>, что намного проще читать. Поэтому в будущем попробуйте отладить и наведите указатель мыши на переменные. И если вы не знаете, что делать, попробуйте немногие Set s :) VBA о магии

+1

@Well AFAIK мутными вы объявляете переменную в то время как с набором мы привозим объект жить, Он использует набор о том, что память выделяется на объект. –

2

Проблема в As New.

AFAIK вы не можете создать новый экземпляр листа непосредственно; вы должны вызвать метод Add в Sheets коллекции, например:

Public Sub typeofcheck() 
    Dim wks As Worksheet 
    Set wks = ActiveWorkbook.Sheets.Add 

    If TypeOf wks Is Worksheet Then 
     MsgBox "This is Worksheet" 
    Else 
     MsgBox "This is not" 
    End If 
End Sub 
0

ошибка вызвана пытается получить доступ an interface that isn't available.

Правильный способ сделать то, что вы хотите:

Sub typeofcheck() 
Dim wks As Worksheet 
Set wks = Worksheets.Add 

Debug.Print TypeOf wks Is Worksheet 
If TypeOf wks Is Worksheet Then 
    MsgBox "This is Worksheet" 
Else 
    MsgBox "This is not" 
End If 
End Sub