【发布时间】:2021-03-06 12:43:58
【问题描述】:
这是我之前发布的问题的后续问题(请参见此处):https://stackoverflow.com/q/64866771/14651009
基本上,我在 excel 中有一个 VBA 驱动的用户表单,人们将在轨道车加载到某个位置(在 5 个“点”)时输入轨道车的数据
有时他们不得不把那辆有轨电车搬到另一个地方。在这种情况下,我希望他们能够从第一个/原始条目中保留轨道车上的所有信息。在用户窗体上,新点应该包含原始点的所有数据,并且一旦执行代码,原始点应该是空的。
顺便说一句,我正在处理 5 个加载点,每个加载点包含 14 条信息。我只想在re-spot发生时保留前7条信息(索引0-6)
为此我做了两件事,首先我为所有 5 个位置建立了一个包含所有数据的二维数组(根据另一位 Stack Overflow 用户的推荐,感谢 Tim Williams!):
Dim spots(1 To 5, 0 To 14), n As Long, i As Long
'Fill spot arrays from the userform:
For n = 1 To 5
spots(n, 0) = UserForm.Controls("ProductSelectionBox_Spot" & n).Value
spots(n, 1) = UserForm.Controls("Spot" & n & "_ProductID").Value
spots(n, 2) = UserForm.Controls("BatchNumber_Spot" & n).Value
spots(n, 3) = UserForm.Controls("CarNumber_Spot" & n).Value
spots(n, 4) = UserForm.Controls("Pounds_Spot" & n).Value
...
spots(n, 14) = UserForm.Controls("TotalLoadTime_Spot" & n).Value
Next n
然后,我使用 for 循环替换索引 0 - 6,并清空原始位置的所有条目:
Dim fromSpot As Long
Dim toSpot As Long
fromSpot = Userform.OriginalSpotSelector.Value
toSpot= UserForm.DestinationSpotSelector.Value
'Replace function
For n = 0 to 6
spots(toSpot, n) = spots(fromSpot, n)
Next n
'Empty original spot function
For n = 0 to 14
spots(fromSpot, n) = Empty
Next n
就更改数组值而言,这绝对是一种魅力。使用以下检查:
a = MsgBox(spots(toSpot, 1), vbOKOnly, "Test")
我可以打印一个消息框,显示目标点 (toSpot) 数组值现在是以前的原始点 (fromSpot) 值。 唯一的问题是,一旦代码执行,用户窗体本身就没有任何更新的值。
在我最初的问题中,一位评论者总结了这个问题:
“您需要设置一个过程来使用数组中的数据更新用户表单对象”
我与我的一位同事交谈,他说数组本质上只是用户窗体值的副本,我必须利用指针来更新用户窗体对象本身的值。我已经做了一些研究,但仍然不知所措。我是否需要使用指针来更新这些用户窗体对象?有没有更简单的方法?如果没有,我如何在这个特定的实例中应用指针?
【问题讨论】:
-
这只是代码的第一位的反转,将数组元素分配给控件。
-
天哪,真的那么容易吗?基本上只是将等号左侧的内容放在右侧,反之亦然?
-
是的,如果我理解正确的话。这段代码在哪里?
-
是的,差不多就是这样。您将得到一个返回二维数组的“GetSpots”函数,以及一个接受二维数组并从数组中填充用户表单的“SetSpots”子函数。
-
天哪!听起来我只是让解决方案在我的脑海中过于复杂。我试了一下,它奏效了!将其发布为答案。谢谢大家!
标签: arrays excel vba pointers userform