7

好吧,我一直在为一点点代码苦苦挣扎,似乎无法绕过它……我试图从一系列单元格中获取一个数组,但是该数组显示为 1 个元素宽。
那么这里的代码:

Dim item As Variant
MsgBox Range("D19:H19").Count    
item = Range("D19:H19").Value
MsgBox LBound(item) & " " & UBound(item)   

根据我的理解项目应该包含一个二维数组......但是我得到以下结果 1st MsgBox prints 5 2nd MsgBox prints 1 1

怎么了?

4

5 回答 5

11

问题在于 LBound 和 UBound

jtolle 关于 LBound 和 UBound 是正确的。

LBound(item, 2)

UBound(item, 2)

但是, item 不能作为数组变暗(你会得到一个错误)。

我想这就是你想要的

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Range("D19:H19").Value

MsgBox LBound(item, 2) & " " & UBound(item, 2)

For i = LBound(item, 2) To UBound(item, 2)
  MsgBox item(1, i)
Next
于 2009-10-11T06:40:43.907 回答
2

您的项目应包含预期的二维数组。如果您在代码中设置断点并查看 VBA 编辑器中的“Locals”小窗口,您应该会看到。您对 LBound 和 UBound 的调用正在获得第一维的界限。如果你调用 Lbound(item,2) 和 UBound(item,2),你应该得到 1 和 5,如你所愿。

编辑:也就是说,一旦你完成了任务, item 看起来就像你可以这样声明的东西:

暗淡项目(1 到 1、1 到 5)

VBA 编程的一大弊端是数组可以有任意的下限。所以你所有的代码都需要意识到这一点。

于 2009-10-11T00:19:00.713 回答
1

这是正确的。即使您选择了一个单元格数组,您仍然可以选择从数组中选择一个单元格(例如,使用制表符逐步浏览该数组的项目)

.Value

只为您获取当前单选单元格的内容。

如果你想枚举数组,你可以调用-object的.Cells()-methodRange

假设 D19 到 H19 分别包含“a”到“e”,调用

Range("D19:H19").Cells(2)

回报你"b"。请注意,这是一个基于 1 的数组,可以是二维的。Cells()最多接受 2 个参数来指定从选择的原点的内部偏移量。

希望澄清...问候

于 2009-10-10T22:14:14.807 回答
1

试试这个:

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Application.Transpose(Range("D19:H19").Value)
MsgBox LBound(item) & " " & UBound(item)
于 2009-10-15T19:14:18.507 回答
0

如果你想要一个一维数组,例如将它加入一个 IN 子句,你应该转置你的范围。我发现你必须为一行转置两次,一次为一列数据,如下所示:

Dim rngRow As Range, rngColumn As Range

Set rngRow = Sheets(1).Range("A1", "Z1")
Set rngColumn = Sheets(1).Range("A1", "A20")

Dim arrRowValues, arrColValues
arrRowValues = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow))
arrColValues = WorksheetFunction.Transpose(rngColumn)

Dim numList As String, stringList As String
numList = Join(arrRowValues, ",")
stringList = "'" & Join(arrColValues, "','") & "'"

值得一玩。

于 2009-10-14T13:51:28.897 回答