我的问题其实是关于上延伸的事EXCEL VBA商店搜索结果中的排列?
这里安德烈亚斯试图通过一列搜索和点击保存到一个数组。 我想是相同的。 但不同之处在于(1)上找到一个值(2)欲作为其中搜索到的值被发现在同一行中复制来自(3)的细胞不同的值的类型,(4),以二维阵列。
因此,该数组(概念上)看起来像:
Searchresult.1st SameRow.Cell1.Value1 SameRow.Cell2.Value2 SameRow.Cell3.Value3
Searchresult.2nd SameRow.Cell1.Value1 SameRow.Cell2.Value2 SameRow.Cell3.Value3
Searchresult.3rd SameRow.Cell1.Value1 SameRow.Cell2.Value2 SameRow.Cell3.Value3
Etc.
我使用的代码如下所示:
Sub fillArray()
Dim i As Integer
Dim aCell, bCell As Range
Dim arr As Variant
i = 0
Set aCell = Sheets("Log").UsedRange.Find(What:=("string"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not aCell Is Nothing Then
Set bCell = aCell
ReDim Preserve arr(i, 5)
arr(i, 0) = True 'Boolean
arr(i, 1) = aCell.Value 'String
arr(i, 2) = aCell.Cells.Offset(0, 1).Value
arr(i, 3) = aCell.Cells.Offset(0, 3).Value
arr(i, 4) = aCell.Cells.Offset(0, 4).Value
arr(i, 5) = Year(aCell.Cells.Offset(0, 3).Value)
i = i + 1
Do While exitLoop = False
Set aCell = Sheets("Log").UsedRange.FindNext(after:=aCell)
If Not aCell Is Nothing Then
If aCell.Address = bCell.Address Then Exit Do
'ReDim Preserve arrSwUb(i, 5)
arr(i, 0) = True
arr(i, 1) = aCell.Value
arr(i, 2) = aCell.Cells.Offset(0, 1).Value
arr(i, 3) = aCell.Cells.Offset(0, 3).Value
arr(i, 4) = aCell.Cells.Offset(0, 4).Value
arr(i, 5) = Year(aCell.Cells.Offset(0, 3).Value)
i = i + 1
Else
exitLoop = True
End If
Loop
End If
End Sub
这似乎出问题的redimming在循环数组。 我得到一个下标超出范围的错误。 我想我现在做我不能REDIM数组,但我无法弄清楚它是如何应该做。
我很感激任何线索,我做错了什么。
Answer 1:
REDIM保留只能调整您的数组的最后一个维度: http://msdn.microsoft.com/en-us/library/w8k3cys2(v=vs.71).aspx
从上面的链接:
保留
Optional. Keyword used to preserve the data in the existing array when you change the size of only the last dimension.
编辑:这不是很大的帮助,是它。 我建议你转你的阵列。 另外,从阵列功能的那些错误消息是可怕的。
在Siddarth的建议,试试这个。 让我知道,如果你有任何问题:
Sub fillArray()
Dim i As Integer
Dim aCell As Range, bCell As Range
Dim arr As Variant
i = 0
Set aCell = Sheets("Log").UsedRange.Find(What:=("string"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not aCell Is Nothing Then
Set bCell = aCell
ReDim Preserve arr(0 To 5, 0 To i)
arr(0, i) = True 'Boolean
arr(1, i) = aCell.Value 'String
arr(2, i) = aCell.Cells.Offset(0, 1).Value
arr(3, i) = aCell.Cells.Offset(0, 3).Value
arr(4, i) = aCell.Cells.Offset(0, 4).Value
arr(5, i) = Year(aCell.Cells.Offset(0, 3).Value)
i = i + 1
Do While exitLoop = False
Set aCell = Sheets("Log").UsedRange.FindNext(after:=aCell)
If Not aCell Is Nothing Then
If aCell.Address = bCell.Address Then Exit Do
ReDim Preserve arrSwUb(0 To 5, 0 To i)
arr(0, i) = True
arr(1, i) = aCell.Value
arr(2, i) = aCell.Cells.Offset(0, 1).Value
arr(3, i) = aCell.Cells.Offset(0, 3).Value
arr(4, i) = aCell.Cells.Offset(0, 4).Value
arr(5, i) = Year(aCell.Cells.Offset(0, 3).Value)
i = i + 1
Else
exitLoop = True
End If
Loop
End If
End Sub
注:在声明中,您必须:
Dim aCell, bCell as Range
这是一样的:
Dim aCell as Variant, bCell as Range
一些测试代码来证明上述:
Sub testTypes()
Dim a, b As Integer
Debug.Print VarType(a)
Debug.Print VarType(b)
End Sub
Answer 2:
这里有一个假设,你可以在开始维度数组的选项。 我用了一个WorsheetFunction.Countif的UsedRange为“弦”,这似乎像它应该工作:
Option Explicit
Sub fillArray()
Dim i As Long
Dim aCell As Range, bCell As Range
Dim arr() As Variant
Dim SheetToSearch As Excel.Worksheet
Dim StringCount As Long
Set SheetToSearch = ThisWorkbook.Worksheets("log")
i = 1
With SheetToSearch
StringCount = Application.WorksheetFunction.CountIf(.Cells, "string")
ReDim Preserve arr(1 To StringCount, 1 To 6)
Set aCell = .UsedRange.Find(What:=("string"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
arr(i, 1) = True 'Boolean
arr(i, 2) = aCell.Value 'String
arr(i, 3) = aCell.Cells.Offset(0, 1).Value
arr(i, 4) = aCell.Cells.Offset(0, 3).Value
arr(i, 5) = aCell.Cells.Offset(0, 4).Value
arr(i, 6) = Year(aCell.Cells.Offset(0, 3).Value)
Set bCell = aCell
i = i + 1
Do Until i > StringCount
Set bCell = .UsedRange.FindNext(after:=bCell)
If Not bCell Is Nothing Then
arr(i, 1) = True 'Boolean
arr(i, 2) = bCell.Value 'String
arr(i, 3) = bCell.Cells.Offset(0, 1).Value
arr(i, 4) = bCell.Cells.Offset(0, 3).Value
arr(i, 5) = bCell.Cells.Offset(0, 4).Value
arr(i, 6) = Year(bCell.Cells.Offset(0, 3).Value)
i = i + 1
End If
Loop
End If
End With
End Sub
请注意,我在您的固定声明的一些问题。 我加了显式的选项,这迫使你声明变量 - exitLoop是未申报。 现在aCell和B细胞都是范围- 以前只B细胞是 (向下滚动到“重视声明的一个昏暗的声明变量”)。 我还创建了一个工作表变量,它包围在一个With语句。 另外,我在1开始阵列的两个维度,因为......好吧,因为我想我猜:)。 我还简化了一些循环退出逻辑的 - 我不认为你需要的一切告诉何时退出。
Answer 3:
你不能Redim Preserve
这样的多维数组。 在一个多维数组,你可以当您使用保留更改只有最后一个维度。 如果你试图改变任何其他维度,发生运行时错误。 我建议阅读本MSDN链接
话说回来,我能想到的2个选项
选项1
将结果保存到一个新的临时表
选项2
声明一维数组,然后串联使用例如特有的分隔符的结果"#Evert_Van_Steen#"
在代码的顶部
Const Delim As String = "#Evert_Van_Steen#"
然后使用它像这样
ReDim Preserve arr(i)
arr(i) = True & Delim & aCell.Value & Delim & aCell.Cells.Offset(0, 1).Value & Delim & _
aCell.Cells.Offset(0, 3).Value & Delim & aCell.Cells.Offset(0, 4).Value & Delim & _
Year(aCell.Cells.Offset(0, 3).Value)
文章来源: Use findnext to fill multidimensional array VBA Excel