首页 > 解决方案 > 在 VBA 中创建类的实例的函数

问题描述

我正在尝试使用 VBA 中的函数来创建我定义的类的新实例。

数据如下所示:

Address 1        | Address 2
123 Sample Ln NW | 1        
123 Sample Ln NW | 2    

该类已在名为“Apt”的类模块中定义,如下所示:

Option Explicit

Public Add1 As String
Public Add2 As String

我想使用一个函数来返回这个类的一个实例(因为我必须从几个不同的子例程中执行它)。

Sub TestIssue2()

    Dim i As Integer
    i = 2

    currApt = makeApt(i)

    MsgBox (currApt.Add1 & ", " & currApt.Add2)

End Sub


Function makeApt(i As Integer) As Object

    Dim x As New Apt
    x.Add1 = Worksheets("Sheet1").Range("A" & i).Value
    x.Add2 = Worksheets("Sheet1").Range("B" & i).Value

    makeApt = x

End Function

我得到:

“运行时错误'91':对象变量或未设置块变量”。

我试过的:

  1. 如果我在子例程中定义实例,我发现它确实有效,所以这确实有效:
Sub TestIssue1()

    Dim i As Integer
     i = 2

    Dim currApt As New Apt
    currApt.Add1 = Worksheets("Sheet1").Range("A" & i).Value
    currApt.Add2 = Worksheets("Sheet1").Range("B" & i).Value

    MsgBox (currApt.Add1 & ", " & currApt.Add2)

End Sub
  1. 搜索“使用函数 VBA 来创建新的类实例”的多种变体让我找到了类似本教程本教程的网站,但两者都在谈论在类中存储函数,而不是使用函数来创建一个。
  2. 我可以在这个网站上找到的最接近的问题是这个问题,其中一些答案似乎表明我想要什么是可能的。但是,该问题提出了一个不同的问题,并且似乎没有提供该问题的答案。

标签: excelvba

解决方案


你有几个小错误。首先在TestIssue2()中你必须定义currApt,然后Set在赋值时使用关键字。所以这变成:

Sub TestIssue2()

    Dim i As Integer
    i = 2
    Dim currApt As Apt

    Set currApt = makeApt(i)

    MsgBox (currApt.Add1 & ", " & currApt.Add2)

End Sub

其次,你应该让你的 makeApt 函数返回一个 Apt(而不是一个对象),并使用Set关键字。像这样:

Function makeApt(i As Integer) As Apt

    Dim x As New Apt
    x.Add1 = Worksheets("Sheet1").Range("A" & i).Value
    x.Add2 = Worksheets("Sheet1").Range("B" & i).Value

    Set makeApt = x

End Function

它现在应该可以正常工作了。


推荐阅读