使用 VBA 的数组更新 VISIO 中的文本框

Updating Text Boxes in VISIO using an array with VBA

我正在尝试使用分配的数组更新文本框值。看来我可以更新“项目”本身而不是对象?有人对如何更好地解决这个问题有一些建议吗?

这就是我目前所拥有的。我也不确定如何将对象正确设置为数组。

Dim spcList(1 To 3) As Integer
Dim item As Variant

spcList(1) = Me.txt1.Value
spcList(2) = Me.txt2.Value
spcList(3) = Me.txt3.Value

    
' Spacing Error Handling

For Each item In spcList:
    item = 0.875
    Debug.Print item
Next

我的 VBA 已经生锈了,但我相信为此目的,事情的工作原理与 VB.Net 中的几乎相同,我对后者更熟悉一些。免责声明到此为止,让我们继续。


如果你想替换数组中的值,就像问题中的代码试图做的那样,无论是整数还是像引用这样更复杂的东西,你必须使用传统的 For 循环:

Dim i As Integer
For i = 1 To 3
    spcList(i) = 0.875
Next

这是因为 For Each 语句中的循环变量从集合中获取值的 copy。所以对于一个整数,就像这里一样,原始代码只会对变量中保存的副本进行赋值。

为了进一步说明正在发生的事情并希望加深您对该语言的理解,我们还来看看原始代码如何处理引用类型。在这种情况下,循环变量 仍然获得一个副本 ,但不是整个对象的副本:仅引用 。这是可行的,因为副本仍然引用内存中的 相同对象

因此,为循环变量分配一个新的对象引用与更简单的 Integer 类型具有相同的结果,并且数组中的对象引用不会改变,因为我们只是替换了副本。然而,如果你要在循环变量上调用一个方法,或者分配给对象的 属性,这些事情会像你期望的那样工作,因为(再次)循环变量中复制的引用仍然引用内存中的同一对象,因此您正在对该对象的状态进行操作。