2010-02-05 3 views
3

Я пытаюсь создать экземпляр объекта и вернуть его из функции. Класс, с которым я работаю, - это тот, который я создал. Однако, когда я пытаюсь установить объект на то, что было возвращено из функции, я получаю сообщение об ошибке. Что я делаю не так?Ошибка возврата экземпляра объекта из функции в VBA

Function CreateBlah(NAME As String, Count As Integer, val As String) As Blah 
    Dim b As Blah 
    Set b = New Blah 
    bkmrk.Initialize NAME, Count, val 
    MsgBox (bkmrk.NAME) 
    CreateBlah = bkmrk 
End Function 

Тогда в другой функции ...

Dim bmrk As Blah 
Set bmrk = CreateBlah("Test", 1, Trim(AString)) 

Я также попытался ...

Dim bmrk As Object 
Set bmrk = CreateBlah("Test", 1, Trim(AString)) 

Я новичок в VBA, может кто-нибудь сказать мне, что я делать не так?

+0

Этот вопрос довольно плохо сформулирован, так как вы оставили ваши типы реальных данных. Неясно, с какими «объектами» вы имеете дело, хотя из-за .Initialize он выглядит как отдельный модуль класса. Включая эту информацию, вы хотели бы улучшить свои ответы. Тем не менее, это довольно очевидно, так как @AdamRalph указывает ниже, что последней строкой вашей функции должно быть «Set CreateBlah = bkmrk». Возможно, это не то, что вызывает вашу проблему, но это недостаток в коде, который вы опубликовали (что может быть или не быть близким к вашему оригиналу). –

+0

как насчет предоставления нам некоторых деталей об этой ошибке? –

ответ

2

Я предполагаю, что

Dim b As Blah 
Set b = New Blah 

должен на самом деле читать

Dim bkmrk As Blah 
Set bkmrk = New Blah 

если да, то вы упускаете множество ключевых слов.

Set CreateBlah = bkmrk 

После того, как вы исправили это, то обе версии кода, потребляющего должны работать, хотя бывший лучше, так как вы сильно вводить переменную.

9

Вам необходимо установить каждые времени, которое вы назначили объекту. Это означает, что при установке возвращаемого значения и при присвоении возвращаемого значения переменной. Late Bound Пример:

Public Sub Example() 
    Dim objWrd As Object 
    Set objWrd = GetWord 
    objWrd.Visible = True 
    objWrd.Quit 
End Sub 

Public Function GetWord() As Object 
    Set GetWord = CreateObject("Word.Application") 
End Function 

Ранний Bound Пример:

Public Sub Example() 
    ''//Requires reference to Microsoft Office Word 
    ''//(Tools>References) 
    Dim objWrd As Word.Application 
    Set objWrd = GetWord 
    objWrd.Visible = True 
    objWrd.Quit 
End Sub 

Public Function GetWord() As Word.Application 
    Set GetWord = New Word.Application 
End Function 
+0

В Sub Example() вы должны иметь оператор: set objWrd = no после инструкции objWrd.Quit, чтобы предотвратить утечку памяти. –

+1

@JayHaase, я не уверен в VB, но нет необходимости устанавливать это в «ничего» в других PL. Это локальная переменная (или лучше называть ее указателем или ссылкой), и она будет автоматически уничтожена при завершении подпрограммы. – meir

+0

@Meir, из моего понимания, установка ссылки на ничего ускорит процесс сбора мусора, который может быть важен для дорогих ресурсов, таких как наборы записей. Пожалуйста, обратитесь к этому вопросу: http://stackoverflow.com/questions/517006/is-there-a-need-to-set-objects-to-nothing-inside-vba-functions –

Смежные вопросы