Возврат определенного типа данных в ячейке 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:

http://www.amazon.com/Financial-Applications-using-Development-Finance/dp/0470027975/ref=ntt_at_ep_dpt_1

Он обсуждает способы работы с такими ручками более надежно с надстройками 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. На самом деле могут быть и другие проблемы, связанные с попыткой вернуть объект в функцию рабочего листа (что, безусловно, есть), но даже если бы проблема с областью не все равно могла ее убить.

Вы можете сохранить указатель на объект в ячейке и получить объект через этот указатель, но снова область его убьет. Чтобы получить объект из указателя, он должен оставаться в области видимости, поэтому зачем хранить указатель.

Очевидно, что ваша реальная ситуация более сложна, чем ваш пример. Таким образом, ответ заключается не в том, чтобы хранить объекты в ячейках, но если вы объясните, что вы пытаетесь выполнить, могут быть альтернативы.