【发布时间】:2016-05-19 01:21:29
【问题描述】:
我需要做以下事情:
- 将范围 C2:AU264 提升为二维数组
- 创建另一个一维数组,(1 到 11880)
- 用第一个数组中的值填充第二个数组(“转置”)
- 将数组 2 写回工作表
这是我正在使用的代码:
Private Ws As Worksheet
Private budgets() As Variant
Private arrayToWrite() As Variant
Private lastrow As Long
Private lastcol As Long
Private Sub procedure()
Application.ScreenUpdating = False
Set Ws = Sheet19
Ws.Activate
lastrow = Ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).row
lastcol = Ws.Cells.Find("*", searchorder:=xlByColumns, searchdirection:=xlPrevious).Column
ReDim budgets(1 To lastrow - 1, 1 To lastcol - 2)
budgets= Ws.Range("C2:AU265")
ReDim arrayToWrite(1 To (lastCol - 2) * (lastRow - 1))
k = 0
For j = 1 To UBound(budgets, 2)
For i = 1 To UBound(budgets, 1)
arrayToWrite(i + k) = budgets(i, j)
Next i
k = k + lastrow - 1
Next j
Set Ws = Sheet6
Ws.Activate
Ws.Range("E2").Resize(UBound(arrayToWrite)).Value = arrayToWrite
'For i = 1 To UBound(arrayToWrite)
'Ws.Range(Cells(i + 1, 5).Address).Value = arrayToWrite(i)
'Next i
Application.ScreenUpdating = True
End Sub
这只是从范围 C2:AU264(第一个数组的第一个元素)到整个范围 E2:E11881 写入第一个值。但是,如果我在脚本结束之前取消注释 For 循环并这样做,它确实有效,但速度很慢。如何使用第一条语句正确写入数组?
【问题讨论】:
-
我认为范围的长度与您所写的不同。我认为应该是 Resize(UBound(arrayToWrite)+1)。
-
查理,我不认为这是问题所在。在边界之后的一切都被切断的情况下,“正常”的VB行为不是吗?在那种情况下,我只会失去最后一个价值,但我什么也得不到!只有数组budget(1,1) 的第一个值被写入所有行
-
我同意 - 我知道如果范围与数组不匹配会有一些问题 - 看起来有人在下面抓住了它。