【发布时间】:2017-05-06 02:59:41
【问题描述】:
我的宏遍历一个范围,按列循环,查找数字数据在每列中的开始位置,并将范围存储在一个锯齿状数组中(代码中的“矩阵”变体)。
之后,我想将整个矩阵返回到另一个工作表中的范围。如果我尝试将“matrix(1)”分配给我想要放置的范围,它工作正常,但如果我尝试将整个“矩阵”分配给一个范围,我会得到空白单元格。
如何在不使用循环的情况下一次将“矩阵”中的所有值返回到一个范围?
这是我的代码:
Sub MyMatrix()
Dim wb1 As Workbook
Set wb1 = ActiveWorkbook
Dim wsNSA As Worksheet
Set wsNSA = wb1.Worksheets("NSA")
Dim wsSA As Worksheet
Set wsSA = wb1.Worksheets("SA")
Dim col As Range
Dim matrix() As Variant
'LR is the Last row and LC is the last column with data
LR = wsNSA.Cells(1, 1).End(xlDown).Row
LC = wsNSA.Cells(LR, 1).End(xlToRight).Column
'Loops through columns and finds the row where numeric data begins
For Each col In wsNSA.Range(wsNSA.Cells(1, 2), wsNSA.Cells(LR, LC)).Columns
wsNSA.Activate
nsa = wsNSA.Range(wsNSA.Cells(1, col.Column), wsNSA.Cells(LR, col.Column))
num_linha = Application.Match(True, Application.Index(Application.IsNumber(nsa), 0), 0)
nsa = wsNSA.Range(wsNSA.Cells(num_linha, col.Column), wsNSA.Cells(LR, col.Column))
'The range starts in the column B in the worksheet, so the matrix ubound is 'col.column -1
ReDim Preserve matrix(1 To col.Column - 1)
matrix(col.Column - 1) = nsa
Next
wsSA.Range(wsSA.Cells(3, 2), wsSA.Cells(LR, LC)) = matrix
End Sub
【问题讨论】:
-
如果它是锯齿状的,最好的方法可能是遍历行,在单个语句中将每一行分配给一个范围。
-
除了将
matrix用作值的临时存储之外,您是否在做任何事情?如果没有,ReDim Preserve语句几乎肯定比简单地将每一行转储到循环中的wsSA更昂贵。 -
您希望输出返回时的样子?您是否希望将每个源列中的第一个数字项放置在目标的第 3 行,还是希望将源信息的每一行作为目标中的一行返回(但前导非数字单元格设置为空白)?也许更新您的问题以包括源数据的屏幕转储和您的预期输出。
-
基于该示例输出,您确实最好将输出写入移动到循环内并摆脱
matrix。你有什么理由不想在循环中写它?
标签: vba excel jagged-arrays