【问题标题】:Is there a way to transfer all values from one array to another, then erase the original array?有没有办法将所有值从一个数组传输到另一个数组,然后擦除原始数组?
【发布时间】:2021-02-28 04:02:20
【问题描述】:

我在工作中尝试开发的代码块遇到了问题。本质上,我在 Excel 中创建了一个用户表单,人们将在其中输入轨道车的数据,因为它们在特定位置加载(我们将这些称为“点 1、点 2、点 3 等”)。

有时他们必须将那辆车移动到不同的位置,在这种情况下,我希望他们能够保留轨道车上第一个/原始条目中的所有信息,然后从原始位置删除数据一旦完成。

为了以更精简的方式实现这一点,我为 5 个点中的每一个都建立了数组,这些点引用了他们在用户窗体上输入数据的所有单元格:

Dim spot1information(14)
    spot1information(0) = UserForm.ProductType1.Value
    spot1information(1) = UserForm.ProductID1.Value
    spot1information(2) = UserForm.BatchID1.Value
    etc....

Dim spot2information(14)
    spot2information(0) = UserForm.ProductType2.Value
    spot2information(1) = UserForm.ProductID2.Value
    spot2information(2) = UserForm.BatchID2.Value
    etc....

所有五个位置以此类推。我不知道这是否会使事情变得更加困难,但请注意,这些数组值并非都属于同一类型。例如,索引 (0) 将是一个字符串,但索引 (10) 是 DATETIME,索引 (12) 定义为 Long。

假设他们正在将汽车从地点 1 移动到地点 2。简而言之,我希望代码执行以下操作:

  • 将 spot2information 中索引 0 - 6 的值(当前为空)替换为 spot1information 中索引 0 - 6 的值(用户已在用户表单中填写)。
  • 我只对索引 0-6 感兴趣,因为它们包含相关的轨道车信息
  • 将 spot1information 的每个值清空到“”

为此,我尝试了以下代码及其一些变体:

If OriginalSpot.Value = 1 Then
    If DestinationSpot.Value = 2 Then
        For i = 0 to 6
           spot2information(i) = spot1information(i)
        Next
        For Each i in spot1information
           spot1information(i) = ""
        Next
     End If
 End If

但是,这不断出现类型不匹配。我想是因为 spot2information 数组中的数据是空的,而 spot1information 数组中的数据不是,但我不完全确定解决这个问题的方法。


更新:我做了下面的建议并替换:spot1information(i) = ""Erase spot1information

代码现在基本上可以工作了!数组“spot2information”的值现在是以前的“spot1information”值,“spot1information”现在为空。

下面建议的 2D 数组也很有魅力。我一直面临的新问题是数组值正在更新,但用户表单没有。 (注意:将来我会将这类事情作为一个单独的问题发布,我深表歉意!)

【问题讨论】:

  • 你的第二个循环应该有i = "",因为i代表一个元素而不是索引。
  • 你的意思是vbscript还是VBA?如果是后者,请更正您的标签。
  • 建议如果一个问题已被回答,则接受适当的答案以完成该问题。如果在解决方案实施后出现“新问题”,则打开一个新问题。请不要一直在最初的问题中添加要求,这既不健康也不恰当。
  • 当然,现在就在努力!谢谢指点!

标签: arrays excel vba for-loop userform


【解决方案1】:

将其作为 2D 数组更容易管理:

Sub Tester()

    Dim spots(1 To 5, 0 To 14), n As Long, i As Long
    
    'fill your spot arrays from the form....
    For n = 1 To 5
        spots(n, 0) = UserForm.Controls("ProductType" & n).Value
        spots(n, 1) = UserForm.Controls("ProductID" & n).Value
        spots(n, 2) = UserForm.Controls("BatchID" & n).Value
        'etc etc
    Next n
    
    'swap a spot with another
    Debug.Print spots(2, 1), spots(3, 1)
    SwapSpots spots:=spots, fromSpot:=2, toSpot:=3
    Debug.Print spots(2, 1), spots(3, 1)

End Sub


Sub SwapSpots(spots, fromSpot As Long, toSpot As Long)
    Dim n As Long
    For n = 0 To 6
        spots(toSpot, n) = spots(fromSpot, n)
        spots(fromSpot, n) = Empty 'empty the source slot value
    Next n
End Sub

【讨论】:

  • 我今天刚试过,我得说你先生是个天才,我肯定会开始在我的其他项目中加入多维数组。
【解决方案2】:

假设数组的DataTypeIndex 相同,即所有点的index(0)string,所有点的Index(2)long,依此类推。

如果是这样,那么这部分应该不会产生任何错误:

    For i = 0 to 6
       spot2information(i) = spot1information(i)
    Next

错误应该发生在这部分,更准确地说是在标有#的行中

    For Each i in spot1information
       spot1information(i) = ""   '#
    Next

错误的原因似乎是尝试将字符串值"" 分配给数字类型,考虑到 "mismatch" 错误。

使用For Each i in spot1information 表示您要"Initiate"Erase 整个数组,因此我建议使用这一行而不是For…Next 方法。

Erase spot1information

关于这个:

但是我现在遇到了一个新问题,用户窗体上的值没有更新以反映存储在数组中的新值。我是否需要以某种方式“刷新”用户表单?

您刚刚更新了数组,然后您需要运行用于更新UserForm 中受两个数组影响的对象的值的过程。

【讨论】:

  • 哦,好吧,这很有意义!没错,我将“For Each”语句更改为“Erase”语句,不再出现类型不匹配错误。
  • 感谢您对后续跟进的回复,我现在知道这是一种非常规的做法,以后我将发布一个单独的问题以避免混淆。你知道我是否需要使用指针来更新那些受数组影响的对象的值吗?
  • 我猜这些数组是从用户输入到 UserForm 对象(或这些输入的结果)中获得的。现在您需要设置一个过程来使用数组中的数据更新这些对象。
  • 听起来不错!我会试一试,如果我无法弄清楚,将发布一个单独的问题
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2021-09-17
  • 1970-01-01
  • 2021-03-27
相关资源
最近更新 更多