Вернуть определенный пользователем тип данных в ячейку Excel - PullRequest
4 голосов
/ 30 августа 2009

Я искал в Интернете и искал вопросы здесь по stackoverflow, но мне не удалось найти решение.

Вот что я хотел бы сделать:

Предположим, у меня есть следующий код в модуле класса с именем "MyClass"

<code>
Option Explicit
Dim var1 as integer</p>

<p>Sub Initialize(v as integer)
   var1 = v
End Sub</p>

<p>Function GetVar1()
   GetVar1 = var1
End Function

Тогда у меня есть UDF в отдельном модуле с кодом

 <code>
Function InitializeMyClass(v as integer) as MyClass
   Dim myvar as MyClass
   Set myvar = new MyClass
   Call myvar.Initialize(v)
   Set InitializeMyClass = myvar
End Function</p>

<p>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

Ответы [ 3 ]

2 голосов
/ 02 сентября 2009

Как показывают другие ответы, буквальный ответ на ваш вопрос - «нет». Вы не можете хранить в ячейке ничего, кроме числа, строки, логического значения, ошибки и т. Д. Вы не можете вернуть ничего, кроме простого значения, такого как те, или массив, или ссылку на диапазон, из UDF.

Однако вы можете делать по существу то, что вы хотите, передавая (и сохраняя в ячейках) некоторый дескриптор ваших объектов, который является допустимым значением ячейки (то есть «myclass: instance: 42») , Это, вероятно, то, что делает пример, который вы указали в своем редактировании. Ваш код должен быть в состоянии интерпретировать значение значений дескриптора и поддерживать объекты в самой памяти. Это может быть сложно, если вы заботитесь о том, чтобы не пропустить объекты, поскольку существует множество способов стереть или переписать дескрипторы, которые вы не можете обнаружить, если вы используете VBA для всего этого.

У меня сейчас нет этого, но вы можете посмотреть на книгу «Финансовые приложения с использованием разработки надстроек Excel в C / C ++», написанную Стивом Далтоном:

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

Он обсуждает способы более надежной работы с такими дескрипторами с надстройками XLL.

1 голос
/ 31 августа 2009

Это выглядит жестким печеньем. Это немного странно, но вы могли бы сделать так, чтобы ваша функция Initialize возвращала имя (строку), а затем добавляла параметр name в функцию Get. В основном манипулирование строкой имени вместо объекта напрямую.

0 голосов
/ 01 сентября 2009

Вложение не будет работать, потому что myvar выходит из области видимости, как только UDF завершает выполнение. На самом деле могут быть другие проблемы, связанные с попыткой вернуть объект в функцию рабочего листа (скорее всего, есть), но даже если бы не было области действия, проблема все равно бы его убила.

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

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

...