Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态更新因变量_Javascript_Vba_Excel - Fatal编程技术网

Javascript 动态更新因变量

Javascript 动态更新因变量,javascript,vba,excel,Javascript,Vba,Excel,我刚刚在cs知识上发现了一个漏洞。。。这段代码是用VBA编写的,但我真的很想知道如何在javascript中做到这一点 基本上,我所处的情况是,一整套变量都依赖于一个变量,比如: 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

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

基本上,我所处的情况是,一整套变量都依赖于一个变量,比如:

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的值进行动态更新

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中实现这一点?
这类东西有没有名字,这样我就能更好地用谷歌搜索它?比如“动态因变量”?非常感谢

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

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

我猜您正在寻找类似Excel单元格公式以及它们层叠更新的方式。没有像VBA那样的内置编码机制。有一些编程语言使用了一种称为的范例,这种范例通过将函数链接在一起并以惰性方式进行计算而表现出类似的行为,但是VBA更像是一种(弱)面向对象的命令式风格

解决这类问题的一种方法通常是创建一个类来封装所有计算,并使用成员变量作为首先设置的计算的基本元素,如
start
,以及派生数的函数,如
var1
var2
var3

这里有一个例子。创建一个名为
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
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
接下来创建一个名为
mdlMain
的模块,并添加以下内容:

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
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
在编译时构建一个类来处理公式化计算是一个很好的实践,因为它以一种非常可维护的方式公开了您的数学和逻辑,并且受益于语言的语法和类型检查。然而,它确实缺乏运行时系统的一些灵活性。如果你想尝试这样的事情,我可以给你一些建议,但这将是一个相当艰巨的任务。我在过去也做过类似的事情,必须实现[Topology Sort],根据先决条件图确定在中执行计算更新的顺序



我不能直接与Javascript对话,因为我对它没有太多经验。然而,Javascript是一种比VBA更具动态性的语言,而且完全有可能已有库来做您想要做的事情。

不清楚您为什么需要这样一组变量。如果
var1
var2
之间存在固定的关系,那么
var2
的作用是什么?如果您真的想这样做,那么您可以将变量属性设置为一个类,其中只有
var1
有一个“let”方法,
var2
var3
返回基于
var1
的内部值的值。我认为,您需要的是闭包。闭包不是在
VBA
中实现的,而是在
vb9.0
中实现的。我不会在
VBA
中使用闭包,因为该语言不是专门设计用来这样做的。下面的答案正是你想要的……你是对的,这就是我决定要做的。在javascript中,这种东西存在于下划线js库中,我确信在其他地方。谢谢你的帮助和解释!