Excel VBA中的运算符重载

6
我想做什么:

我想在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
根据这个,你所寻求的似乎是不可能的,尽管我认为如果它真的出现了,那将是一个非常优秀的VBA功能。 - Matt Cremeens
我之前有一段时间偶然看到了那个页面,当时还希望事情已经有所改变。虽然我不是这方面的专家,但我相信微软最近已经将Office VBA从基于VB6扩展到基于.NET(请不要引用我说的话)? - Michael Molter
1
一个想法是创建一个 Worksheet_Change 事件,通过使用 Split 函数对单元格的输入进行分词,如果发现 +,则修改单元格以实现所需功能。 - Matt Cremeens
@MichaelMolter,在过去十年中,微软在VBA方面并没有做好。VSTO已经是一个被抛弃的技术了。 - cyboashu
我相信@MattCremeens的评论提出了一个可行的解决方案,尽管是通过另一种方式。我可以想象在单元格中按照自己的意愿编写带有重载的“+”、“-”等运算符的函数,然后只需使用宏将该函数扩展为必须工作的格式即可。 - Michael Molter
我在这里问了一个非常类似的问题链接 - Foad S. Farimani
2个回答

3

VBA无法实现这一点。VBA旨在提供帮助自动化的脚本,我们称之为宏。VBA没有建立在模块化类或对象的基础上。您在编辑器中输入/按Enter键时,您的VBE会编写直接的P代码。虽然VBA功能很强大,但是期望在VBA中具有这些功能有点牵强。将来也不可能具备此功能。此外,建议不要过于担心代码格式美观性,它们只是无用的开销。


2
说"代码美学"无用是过分的说法。我在一个需要整洁、易读、易调试的领域工作。我表格中的所有内容都会经过导师/主管的审核,并且必须让他们理解。这就是为什么这一直是个问题的原因。 - Michael Molter
@MichaelMolter,你误解了代码美学和代码可读性。我使用doAdd(param1,param2)来添加两个数字,这是非常易读和标准的。试图用“+”替换doAdd只是一种美学修饰和无用的开销。 - cyboashu
并不是真正的开销,因为大多数代码美化工作都发生在编译时... 注意:实现此功能的真正方法是黑客VBE。 - Sancarn

2

下面是一种使用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

不幸的是,目前这个解决方案意味着你实际上无法在表格上简单地添加两个数字。不过,也许对于你的目的来说这并不是什么大问题。 - Matt Cremeens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接