在 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 中循环遍历数组的主要内容,如果未能解决你的问题,请参考以下文章