【问题标题】:VBA - Update values in an array with For Each statementVBA - 使用 For Each 语句更新数组中的值
【发布时间】:2015-05-28 09:03:48
【问题描述】:

一旦我知道计算机上设置了哪些区域设置,我正在尝试更新我的数组中的数值。

我使用了这个代码:

If Application.International(xlCountrySetting) <> 33 Then
    For Each x In Country
        x = Replace(x, ",", ".")
    Next x
Else
    For Each x In Country
        x = Replace(x, ".", ",")
    Next x
End If

当我调试时,我看到 x 已更改,但后来在代码中,Array 中的值没有被修改

我知道我可以使用For i = LBound(Country,1) to UBound(Country,1),但我想知道是否有使用For Each 声明的方法

有什么想法吗?

【问题讨论】:

  • 当您说“数值”时,您是指数字的字符串表示形式吗?否则,尝试替换数值中的字符没有多大意义。显示您对 Country 的定义以及放入数组中的示例值会很有帮助。
  • 这是十进制值,我的问题是关于区域设置,这些值要么是数字(小数分隔符和区域设置之间的良好匹配)要么是字符串(不匹配)。但我的问题是这些循环对实际数组值没有任何影响。替换工作很好。
  • 所以你的数组是 Variant 类型的?
  • 是的,通常我只是这样声明它Dim Country(),在这里,我都尝试了。

标签: arrays vba foreach


【解决方案1】:

For Each 循环中的问题是xCountry 的一个单独变量(您必须在代码中更早声明它)并且被设置为Country 的当前元素的值;它不共享相同的内存,即它不是“按引用”。

因此,当您替换 x 中的字符时,您只会更改 x 而不会更改 Country 中的元素。

您可以通过将 Country 添加到 Watch 窗口来查看这一点,如果您单步执行您的代码,您将看到,当您遍历循环时,Country 的元素不会改变。

但是,当您使用 For 循环并使用 Country(i) = Replace(Country(i), ".", ",") 时,您正在修改 Country 元素,因此值会发生变化。

【讨论】:

  • 在这种情况下,我将在函数参数中给出一个具有不同维度和元素计数的数组。在这种情况下,我需要使用 For Each 并验证数组的每个元素。
【解决方案2】:

我遇到了类似的问题。我需要在循环时更改 VBA 中 Collection 的值。

尝试使用 for 循环修改 Collection 会导致错误。然后就像 R3uK 的问题所示,当我在 foreach 循环中修改集合时,集合中的值没有改变。

我所做的是使用另一个 Collection 变量作为我的最终答案。所以我会在循环时将每个值添加到新的集合中。然后我收集了我想要的数据。

因此,如果“国家”是一个集合,我的 VBA 答案将如下所示:

Dim Country As New Collection
Dim finalCountry As New Collection

If Application.International(xlCountrySetting) <> 33 Then
    For Each x In Country
        x = Replace(x, ",", ".")
        finalCountry.Add x
    Next x
Else
    For Each x In Country
        x = Replace(x, ".", ",")
        finalCountry.Add x
    Next x
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2015-05-08
    • 2011-10-26
    • 2011-01-29
    • 2022-10-13
    相关资源
    最近更新 更多