Функция для создания экземпляра класса в VBA - PullRequest
1 голос
/ 05 января 2020

Я пытаюсь использовать функцию в 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
Поиск нескольких вариантов «использовать функцию VBA для создания нового экземпляра класса» привел меня к таким сайтам, как этот учебник или этот учебник , но оба говорят о хранении функций внутри классов, я не использую функцию для ее создания. Самый близкий вопрос, который я мог бы найти на этом сайте, это этот вопрос , где некоторые ответы, кажется, указывают на то, что я хочу, возможно. Однако этот вопрос касается другой проблемы и, похоже, не дает ответа на этот вопрос.

1 Ответ

3 голосов
/ 05 января 2020

У вас есть пара небольших ошибок. Сначала в 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 (а не Object), а также использовать ключевое слово 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

Теперь должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...