Возврат определенного типа данных в ячейке Excel
4 B Rivera [2009-08-30 17:56:00]
Я искал в Интернете, и я искал вопросы здесь, в stackoverflow, но я не смог найти решение.
Вот что я хотел бы сделать:
Предположим, что у меня есть следующий код в модуле класса с именем "MyClass"
Option Explicit
Dim var1 as integer
Sub Initialize(v as integer)
var1 = v
End Sub
Function GetVar1()
GetVar1 = var1
End Function
Затем у меня есть UDF в отдельном модуле с кодом
Function InitializeMyClass(v as integer) as MyClass
Dim myvar as MyClass
Set myvar = new MyClass
Call myvar.Initialize(v)
Set InitializeMyClass = myvar
End Function
Function GetMyVar(m as MyClass)
GetMyVar = m.GetVar1()
End Function
Теперь в ячейке A1 у меня есть "= InitializeMyClass (3)", а в ячейке A2 "= GetMyVar (A1)". Я получаю ошибки #VALUE в обеих ячейках. Это, конечно, связано с тем, что я пытаюсь вернуть определенный пользователем тип данных в ячейку A1. Я чувствую, что это должно быть возможно, но я не знаю, как это сделать.
Изменить: О, да, вопрос в том, "Есть ли способ вернуть пользовательский тип данных в ячейку, а затем вызвать его из другого UDF в приведенном выше примере? знаете, если это требует COM или нет. Если да, то кто-нибудь знает, как я могу начать? В идеале, если бы у кого-то был пример того, как это сработало, это было бы фантастически!"
Другое редактирование: здесь мы идем, теперь я знаю, что это можно сделать: прочитайте это описание, оно не количественное, но даст вам представление о том, что они делают, http://www.quanttools.com/index.php?option=com_content&task=view&id=19
vba excel user-defined-functions
3 ответа
2 Решение jtolle [2009-09-02 03:26:00]
Как показывают другие ответы, буквальный ответ на ваш вопрос "нет". Вы не можете хранить в ячейке ничего, кроме числа, строки, булевых, ошибок и т.д. Вы не можете возвращать из UDF ничего, кроме простого значения, такого как те, или массив, или ссылку на диапазон.
Однако вы можете сделать по существу то, что хотите, передавая (и сохраняя в ячейках) какой-то дескриптор ваших объектов, который является значением юридической ячейки (т.е. "myclass: instance: 42" ). Вероятно, это тот пример, который вы связали с вашим редактированием. Однако ваш код должен иметь возможность интерпретировать значение значений дескриптора и поддерживать объекты в самой памяти. Это может стать сложным, если вы не заботитесь о том, чтобы не просачивать объекты, так как есть много способов стереть или перезаписать дескрипторы, которые вы не можете обнаружить, если вы используете VBA для выполнения всего этого.
У меня его нет прямо сейчас, но вы можете взглянуть на книгу Financial Applications, используя Excel Add-in Development в C/С++ от Steve Dalton:
Он обсуждает способы работы с такими ручками более надежно с надстройками XLL.
1 Lance Roberts [2009-08-31 21:03:00]
Это похоже на жесткий файл cookie. Это немного hokey, но вы можете сделать, чтобы ваша функция Initialize вернула имя (строку), а затем добавила параметр name в функцию Get. В основном манипулирование строкой имени вместо объекта напрямую.
0 Dick Kusleika [2009-09-01 01:19:00]
Вложение не будет работать, потому что myvar выходит из области действия, как только выполняется UDF. На самом деле могут быть и другие проблемы, связанные с попыткой вернуть объект в функцию рабочего листа (что, безусловно, есть), но даже если бы проблема с областью не все равно могла ее убить.
Вы можете сохранить указатель на объект в ячейке и получить объект через этот указатель, но снова область его убьет. Чтобы получить объект из указателя, он должен оставаться в области видимости, поэтому зачем хранить указатель.
Очевидно, что ваша реальная ситуация более сложна, чем ваш пример. Таким образом, ответ заключается не в том, чтобы хранить объекты в ячейках, но если вы объясните, что вы пытаетесь выполнить, могут быть альтернативы.