dynamic更新因variables

刚刚在我的cs知识中发现了一个大洞…这个代码是用VBA写的,但是我真的很想知道如何在javascript中做到这一点!

基本上,我处于一整套variables取决于一个variables的情况 – 例如:

Sub test() Dim start As Integer Dim var1 As Integer Dim var2 As Integer Dim var3 As Integer var1 = start + 1 var2 = start + 2 var3 = start + 3 End Sub 

我的问题是,我希望var1,var2和var3的值根据start的值dynamic更新,例如

 Sub test() Dim start As Integer Dim var1 As Integer Dim var2 As Integer Dim var3 As Integer start = 0 var1 = start + 1 var2 = start + 2 var3 = start + 3 ' would like to have var1 = 1, var2 = 2, var3 = 3 MsgBox "start = " & start & vbNewLine & _ "var1 = " & var1 & vbNewLine & _ "var2 = " & var2 & vbNewLine & _ "var3 = " & var3 start = 5 ' would now like to have var1 = 6, var2 = 7, var3 = 8 MsgBox "start = " & start & vbNewLine & _ "var1 = " & var1 & vbNewLine & _ "var2 = " & var2 & vbNewLine & _ "var3 = " & var3 End Sub 

但显然这不起作用,我得到相同的价值观

 var1 = 1, var2 = 2, var3 = 3 

两次。 有没有办法让这个工作在VBA? 有没有这样的事情的名字,所以我可以更好地谷歌呢? 像“dynamic因variables”? 非常感谢 !

我猜你正在寻找像Excel单元格公式以及它们级联更新的方式。 在VBA中没有内置的编码机制。 有一些编程语言使用一个称为函数编程 ( Functional Programming)的范例,通过将函数链接在一起并以懒惰的方式进行评估,其行为方式类似,但VBA更多地是(弱)面向对象的,势在必行的。

解决这类问题的一种方法通常是创build一个类来封装所有的计算,并使用成员variables作为计算的基本元素,如start和衍生数字的函数,比如var1var2var3

这是一个例子。 创build一个名为clsRectangle的类并复制以下内容:

 Option Compare Database Option Explicit Public length As Integer Public width As Integer Public Property Get diagonal() As Double diagonal = VBA.Sqr((length ^ 2) + (width ^ 2)) End Property Public Property Get area() As Integer area = length * width End Property Public Property Get perimeter() As Integer perimeter = 2 * (length + width) End Property 

接下来创build一个名为mdlMain的模块并添加以下内容:

 Public Sub Main() Dim rect As clsRectangle Set rect = New clsRectangle With rect .length = 3 .width = 5 MsgBox "perimeter: " & .perimeter & vbCrLf & _ "diagonal: " & .diagonal & vbCrLf & _ "area: " & .area & vbCrLf 'After changing the underlying numbers (like *start* in your example) 'area, perimeter and diagonal all return new values .length = 2 .width = 7 MsgBox "perimeter: " & .perimeter & vbCrLf & _ "diagonal: " & .diagonal & vbCrLf & _ "area: " & .area & vbCrLf End With End Sub 

在编译时build立一个类来处理公式化的计算是很好的做法,因为它以一种非常可维护的方式公开你的math和逻辑,并从语言的语法和types检查中受益。 但是,它缺乏运行时系统的一些灵活性。 如果你想尝试这样的事情,我可以给你一些指示,但这将是一个相当沉重的提升。 我在过去做过类似的事情,必须实现[Topological Sort]来根据先决条件的graphics计算出执行计算更新的顺序。


我不能直接跟Javascript说话,因为我没有太多的经验。 但是,Javascript是一种比VBA更加dynamic的语言,完全有可能库已经存在去做你想做的事情。

据我所知,这在VBA中是不可能的。 您可以在模块级别(在您的过程之外)声明您的variables,并通过调用函数更新它们,如下所述。 这并不像您期望的那么简单,但是每次“开始”更改时都要手动更新variables。

 Dim start As Integer Dim var1 As Integer Dim var2 As Integer Dim var3 As Integer Sub test() start = 0 var1 = start + 1 var2 = start + 2 var3 = start + 3 ' would like to have var1 = 1, var2 = 2, var3 = 3 MsgBox "start = " & start & vbNewLine & _ "var1 = " & var1 & vbNewLine & _ "var2 = " & var2 & vbNewLine & _ "var3 = " & var3 start = ChangeStart(5) ' would now like to have var1 = 6, var2 = 7, var3 = 8 MsgBox "start = " & start & vbNewLine & _ "var1 = " & var1 & vbNewLine & _ "var2 = " & var2 & vbNewLine & _ "var3 = " & var3 End Sub Public Function ChangeStart(StartValue As Long) start = StartValue var1 = start + 1 var2 = start + 2 var3 = start + 3 End Function