【问题标题】:Excel VBA, Custom Class: Function call raises "method not supported" errorExcel VBA,自定义类:函数调用引发“方法不支持”错误
【发布时间】:2013-07-31 20:19:04
【问题描述】:

我正在写我的第一堂课。 一个是 cCRElist,它本质上是 cCRE 实例(一些特殊事件)的集合。

我希望在 cCRElist 中有一个子函数或函数,它将工作表中的所有 CRE 加载到一个我可以使用的大集合中。我创建了这个函数,当我从一个普通的代码模块调用它时它工作正常,但后来我试图将代码移动到类中。现在我无法调用函数 LoadFromWorksheet(myWS as Worksheet)。

错误是“对象不支持此属性或方法”。我曾尝试将其设为子程序、函数,将其设为公开而非公开,我已尝试将其变为 Property Let 而不是子程序。显然,我对它的作用一无所知。我试过了

Call CREList.LoadFromWorksheet(myWS) 

CREList.LoadfromWorksheet myWS

每次都出现同样的错误。

下面是使用类并调用函数的测试代码:

Sub TestClassObj()
    Dim CRElist As cCRElist
    Set CRElist = New cCRElist

    Dim myWS As Worksheet

    Set myWS = ThisWorkbook.ActiveSheet

    CRElist.LoadFromWorksheet (myWS)

End Sub

这是一个 cCRElist 类的 sn-p:

' **** CLASS cCRElist
Option Explicit

' This is a collection of CRE objects
Private pCRElist As Collection

Private Sub Class_Initialize()
    Set pCRElist = New Collection
End Sub

Public Property Get CREs() As Collection
    Set CREs = pCRElist
End Property

Public Property Set Add_CRE(aCRE As cCRE)
        pCRElist.Add aCRE
End Property

Function LoadFromWorksheet(myWS As Worksheet)
    Dim CRE As cCRE
    Dim iFirst As Long
    Dim iLast As Long
    Dim i As Long

    Set CRE = New cCRE

    iFirst = gHeader_Row + 1
    iLast = FindNewRow(myWS) - 1

    ' update data in CRE then add
    For i = iFirst To iLast
        If myWS.Cells(i, gCRE_Col) <> "" Then   ' This is a CRE row
            Set CRE = New cCRE
            With CRE
                .CRE_ID = myWS.Cells(i, gCRE_Col)
                If Not IsDate(myWS.Cells(i, gCRE_ETA_Col)) Then
                    .ETA = "1/1/1900"
                Else
                    .ETA = Trim(myWS.Cells(i, gCRE_ETA_Col))
                End If
                <... snipped ...>
            End With
            pCRElist.Add_CRE CRE
        End If
    Next
End Sub
' **** END OF CLASS cCRElist

感谢您的专业知识。

【问题讨论】:

  • 请确认您将Sub TestClassObj() 保留在标准模块中...您在哪一行收到您提到的错误?尝试将Function LoadFromWorksheet(...) 改回Sub LoadFromWorksheet(...)。调用此方法时,尽量去掉参数的括号。
  • 在vbe中点击工具-选项,选择常规选项卡并将错误捕获更改为'break in class module',然后再次尝试代码;这可能有助于缩小真正的错误范围
  • KazJaw...是的,TestClassObj 在标准模块中。我在“CRElist.LoadFromWorksheet(myWS)”行收到错误。
  • 这是有效的。首先,我做了“打破课堂模块”。在测试代​​码中,我制作了这样的调用行(我之前尝试过):codeCRElist.LoadFromWorksheet myWS code。在课堂上,我不得不更改实际上是 code 设置 pCRElist.Add_CRE CRE codecode pCRElist.Add CRE code 现在它工作了!

标签: class excel vba


【解决方案1】:

根据我在 cmets 中获得的帮助,以下是有效的方法。首先,我做了“打破课堂模块”。在测试代​​码中,我将函数调用从:

CRElist.LoadFromWorksheet(myWS)

CRElist.LoadFromWorksheet myWS

在课堂上,我不得不改变

Set pCRElist.Add_CRE CRE

pCRElist.Add CRE

然后我能够摆脱无关的 CLASS 函数 Add_CRE 和 Count。

感谢大家的意见。我不知道如何将 cmets 标记为已接受的答案,所以我这样做了。如果我需要做一些不同的事情,请告诉我。 现在它起作用了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多