Какая великая мудрость в определении вашего собственного объекта, если я не могу этого сделать?

127
15

Это для Excel и VBA. Предположим, что BondClass правильно определен в модуле класса. Я получаю # ВАЛЮТ! когда я ввожу "= GetBondPrincipal()" в ячейку Excel. Я сделал что-то синтаксически неправильно или это просто невозможно в Excel/VBA? Я спрашиваю, потому что я действительно хочу это сделать:
Возврат определенного типа данных в ячейке Excel


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



Option Explicit

Function InitializeBond(ir As Double, p As Double) As BondClass
Dim mybond As BondClass
Set mybond = New BondClass
Call mybond.Initialize(ir, p)
InitializeBond = mybond
End Function


Function GetBondPrincipal()
Dim b As BondClass
Set b = New BondClass
b = InitializeBond(0.03, 100) //the code quits here,
//it doesn't like the BondClass return type?
GetBondPrincipal = b.GetPrincipal()
End Function


Я знаю, что в приведенном выше примере мне не нужно вызывать InitializeBond и просто ввести "Call b.Initialize(.03,100)". Код будет работать нормально, если я это сделаю. Но я не могу заставить UDF возвращать тип, отличный от встроенных типов. Любой способ сделать это? Должен ли я определять назначение для не встроенных типов?

спросил(а) 2021-01-19T20:31:44+03:00 6 месяцев, 2 недели назад
1
Решение
64

Подсказка: используйте "SET".

(наиболее распространенная ошибка, сделанная программистами VB в VB6 и VBA).

ответил(а) 2021-01-19T20:31:44+03:00 6 месяцев, 2 недели назад
45

Во всяком случае, я не считаю это очень элегантным.

Я бы предпочел написать:


Function GetBondPrincipal()
Dim b As BondClass
Set b = New BondClass
with b
.param1 = 0.03
.param2 = 100
.InitializeBond
GetBondPrincipal = .GetPrincipal()
end with
End Function

ответил(а) 2021-01-19T20:31:44+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема