Arrays VBA代码赢得';t将数组写入范围,只有它';第一要素

Arrays VBA代码赢得';t将数组写入范围,只有它';第一要素,arrays,vba,excel,Arrays,Vba,Excel,我需要做以下工作: 将范围C2:AU264提升到2D阵列中 创建另一个1D阵列(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 proce

我需要做以下工作:

  • 将范围C2:AU264提升到2D阵列中
  • 创建另一个1D阵列(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循环的注释并以这种方式执行,它确实可以工作,但速度很慢。如何使用第一条语句正确写入数组?

如果要将数组写入范围,数组必须具有两个维度。即使你只想写一个专栏

改变

ReDim arrayToWrite(1 To (lastCol - 2) * (lastRow - 1))


简单地使用转置。。。改变

Ws.Range("E2").Resize(UBound(arrayToWrite)).Value = arrayToWrite

提示:无需重新分配预算(1到lastrow-1,1到lastcol-2)
如果
budgets
是一个变量,那么
budgets=Ws.Range(“C2:AU265”)
将自动设置范围(左上角单元格(在本例中为C2)将为
(1,1)

编辑

假设您只想将所有列(一列接一列)写在彼此下面,可以将宏缩短一点,如下所示:

Private Sub procedure()

  Dim inArr As Variant, outArr() As Variant
  Dim i As Long, j As Long, k As Long

  With Sheet19
    .Activate
    inArr = .Range(, .Cells(2, 3), .Cells(.Cells.Find("*", , , , 1, 2).Row, .Cells.Find("*", , , , 2, 2).Column)).Value
  End With

  ReDim outArr(1 To UBound(inArr) * UBound(inArr, 2))
  k = 1

  For j = 1 To UBound(inArr, 2)
    For i = 1 To UBound(inArr)
      k = k + 1
      arrayToWrite(k) = budgets(i, j)
    Next i
  Next j

  Sheet6.Range("E2:E" & UBound(arrayToWrite)).Value = Application.Transpose(arrayToWrite)

End Sub

如果你想让每一行相互转换,而不是简单地将这两行切换为…-行。(代码与以前基本相同)

我认为范围的长度与您正在编写的不同。我认为应该调整大小(UBound(arraytowite)+1)。查理,我不认为这是问题所在。sich中的“正常”VB行为不就是边界被切断后的一切吗?如果是这样的话,我只会失去最后的价值,但我什么也得不到!只有数组预算的第一个值(1,1)通过所有行写入我同意-我知道如果范围与数组不匹配会出现问题-看起来有人在下面捕捉到了它。德克,谢谢你的回复!我简直不敢相信我有多傻——数组写的是行而不是列的方向!这就是为什么它总是只得到第一个值。我理解您的解决方案,但是,我是否可以通过在一开始就为这个数组分配不同的值来实现这一点?(arrayToWrite(i+k)=预算(i,j))编号。。。一维数组将始终按列“拉伸”(1行高)。要在没有转置的情况下使用它,您需要一个第二维度,如@jkpieterse;)在那种情况下,我们互相误解了。我认为它被列拉伸了,这就是为什么我对代码进行了这样的排序。好的,谢谢您应该注意,在一行中写入,只有一个维度是有效的<代码>[A1:B1]=数组(1,2)完全按照它的外观执行;)
arrayToWrite(i + k, 1) = budgets(i, j)
Ws.Range("E2").Resize(UBound(arrayToWrite)).Value = arrayToWrite
Ws.Range("E2").Resize(UBound(arrayToWrite)).Value = Application.Transpose(arrayToWrite)
Private Sub procedure()

  Dim inArr As Variant, outArr() As Variant
  Dim i As Long, j As Long, k As Long

  With Sheet19
    .Activate
    inArr = .Range(, .Cells(2, 3), .Cells(.Cells.Find("*", , , , 1, 2).Row, .Cells.Find("*", , , , 2, 2).Column)).Value
  End With

  ReDim outArr(1 To UBound(inArr) * UBound(inArr, 2))
  k = 1

  For j = 1 To UBound(inArr, 2)
    For i = 1 To UBound(inArr)
      k = k + 1
      arrayToWrite(k) = budgets(i, j)
    Next i
  Next j

  Sheet6.Range("E2:E" & UBound(arrayToWrite)).Value = Application.Transpose(arrayToWrite)

End Sub