2015-08-17 6 views
1

То, что я хотел бы сделать:Оператор Перегрузки в Excel VBA

Я хотел бы использовать operator overloading в Excel для запуска пользовательских функций на моих пользовательских типов данных. Например, при оценке формулы я хочу, чтобы Excel выполнял мою функцию вместо оператора «+», когда вычисление включает один из моих пользовательских типов данных.

Почему я хочу это сделать:

В аналитической химии, каждый номер имеет неопределенность, прикрепленную к ней и написано:

13,56 (± 0,02) мм

Я хотел бы для создания пользовательского типа данных сохраняется величина и неопределенность числа вместе в одной и той же ячейке.

Кроме того, я хочу, чтобы реализовать перегрузку оператора, поэтому, когда я пишу

=A1+A2 

и либо A1 или A2 содержит ряд неопределенность типа, моя пользовательская функция работает вместо «+» оператора по умолчанию вычислить неопределенность.

Это сделало бы мои таблицы гораздо чище, так как в настоящее время, я должен написать такое заявление, как

=ADD_UNC(A1, A2) 

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

=MULT_UNC(A3, ADD_UNC(MULT_UNC(A5, A1, A2), A3) 

vs. 

=A3*((A1*A2)+A3) 

Почему я предполагаю, что это возможно:

Я знаю, что в реальной, распустившиеся языки программирования, такие как C#, перегрузка операторов очень часто и очень легко выполнить.

Спасибо за вашу помощь,

Майкл

+1

Судя по [это] (http://www.pcreview.co.uk/threads/user-defined-types-and-overloaded-operators.3318580/), что вы ищете не представляется возможным, хотя я считаю, что это будет отличная функция vba, если она когда-либо появится. –

+0

Я на самом деле столкнулся с этой страницей некоторое время назад и надеялся, что с тех пор все изменилось. Я не специалист по подобным вещам, но я считаю, что Microsoft недавно расширила Office VBA от использования VB6.На основе NET (действительно, не цитируйте меня на этом)? –

+1

Одна мысль заключалась бы в создании события [Worksheet_Change] (https://msdn.microsoft.com/en-us/library/office/ff839775.aspx), токенизирующего ввод ячейки, скажем, с помощью 'Split' и если найдена '+', измените ячейку, чтобы делать то, что вы хотите. –

ответ

2

Не возможно в VBA. VBA предназначался для предоставления сценариев, которые помогают в автоматизации. Понимаете, мы называем их макросами. VBA не построен поверх модульных классов или объектов. Ваш VBE записывает прямой P-код в тот момент, когда вы вводите/входите в редактор. VBA потрясающий и обладает множеством функций, но ожидание такого рода объектов в VBA немного растянуто. Нет возможности иметь эту функцию даже в будущем. и просто предложение, никогда не слишком беспокоиться о кодовой косметике, они бесполезны накладные расходы.

+0

Высказывание _code-cosmetics_ бесполезно, это довольно сложное заявление. Я работаю в области, которая требует чистых, читаемых, отладочных рабочих листов. Все, что я делаю, проверяется инструктором/супервизором, и ** имеет **, чтобы быть понятным для них. Вот почему это была такая проблема. –

+0

@MichaelMolter вы неправильно поняли код-косметику с читабельностью кода. У меня есть doAdd (param1, param2), чтобы добавить два числа, которые являются вполне читаемыми и стандартными. Не пытайтесь заменить doAdd на «+» - это косметика и бесполезные накладные расходы. – cyboashu

1

Вот взломать событие Worksheet_Change. Вы можете поместить в ячейку, которая содержит символ «+», что угодно, тем самым эффективно отключая «+» знаки нормальной функции.

Private Sub Worksheet_Change(ByVal Target As Range) 
If UBound(Split(CStr(Target), "+")) > 0 Then 
    Target = "Overloaded" 
Else: 
    Target = "Not overloaded" 
End If 
End Sub 
+0

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