在 VBA 中循环遍历数组

Posted

技术标签:

【中文标题】在 VBA 中循环遍历数组【英文标题】:Looping through an array in VBA 【发布时间】:2014-03-20 06:43:15 【问题描述】:

在 Sheet1 的单元格 A1 中,我有以下文本:A-B-C-D-E-F

我需要遍历这段文本,并且我编写了以下代码,可以正常工作:

dim w as worksheet
dim s as variant
dim p as integer

set w = Worksheets(1)

p = 0
For Each s In Split(w.Range("A1").Value, "-")
    p = p + 1
    MsgBox Split(w.Range("A1").Value, "-")(p - 1)
Next s

如预期的那样,上面的代码会弹出消息框,一个接一个地显示每个字母。

但我对重复 Split(w.Range("A1").Value, "-") 不满意,为循环声明数组,并为循环中的每个事件再次声明。

所以我尝试过:

MsgBox s.Value

但它会引发有关正在请求的对象的错误。

既然“s”是一个变体,为什么我不能使用 Value 属性?

【问题讨论】:

【参考方案1】:

Split 返回一个字符串数组,该数组由For Each 分隔为单个 个字符串,因此您可以将它们按原样传递给MsgBox

因此,与其使用s.Value,不如单独使用s

换句话说:

dim w as Worksheet
dim s as Variant

set w = Worksheets(1)

For Each s In Split(w.Range("A1").Value, "-")
    MsgBox s
Next

【讨论】:

我在问这个问题后一分钟就这样做了;-)。但是我的问题仍然存在,“s”是否继承了数组的属性,意味着它可以被视为文本变量? @CloseISQ,这没有实际意义,因为我已将s 明确声明为string,因此它只会“继承”来自for each 的字符串值。如果您明确将其声明为变体,则可能与您为其分配一个字符串相同(因为foreach/split 组合给出了一个字符串),但这不是我建议的。如果您希望能够在其中包含许多不同的类型,则变体很好,但在这里您有一个明确的案例,即 everything 您正在处理的是一个字符串。 我试过这个。 VBA 不允许我将拆分函数的结果传递给字符串变量“s”。它抱怨缺少请求的对象。 @CloseISQ,实际上你是对的,它确实需要一个变体(否则你会得到一个每个控制变量必须是一个变体或对象)。但是,该变体在for each 的上下文中仍被视为字符串,因此您仍使用s 而不是s.Value。已将代码更改为正确的版本,并在 Excel 本身中进行了测试。【参考方案2】:

你可以这样做

dim w as worksheet
dim s as string

set w = Worksheets(1)

For Each s In Split(w.Range("A1").Value, "-")
    MsgBox s
Next

当您将任何对象分配给变体时,它的行为就像分配给它的对象一样,并且仅具有对象中存在的那些属性。在您的 For Each 拆分中,您将字符串分配给 s 和字符串变量直接返回它们的值,而不是通过 objString.Value。

【讨论】:

当然可以,但为什么不是 s.Value? 更新答案请查收。 找到答案,证实了我的审讯。非常感谢。

以上是关于在 VBA 中循环遍历数组的主要内容,如果未能解决你的问题,请参考以下文章

VBA循环遍历数组

遍历两个包含VBA中电子邮件的数组

vba十万刚数据遍历怎么快

循环遍历行、列和交集 VBA

VBA遍历数组的2种方式

怎么用一个循环遍历二维数组?