【问题标题】:Paste array to range paste only the first value将数组粘贴到范围仅粘贴第一个值
【发布时间】:2021-11-27 20:31:25
【问题描述】:

我正在尝试将数组值粘贴到一个范围内,但它只粘贴范围内的第一个值。

Dim Array1()

For i = 0 to 9
   ReDim Preserve Array1
   Array1(i)= Int((6 * Rnd) + 1)
Next

ws.Range("A1").Value = Array1

输出:

我是不是做错了什么?

【问题讨论】:

  • 既然您知道数组维度,您应该将其声明为二维数组,并使用适当的维度并将其填充到正确的维度上。 ReDim Preserve经常使用是一种记忆压力...
  • @FaneDuru 您好,感谢您的反馈。我必须使用Resize 才能正常工作
  • Resize 必须使用,无论如何...我会发布一个答案,只是为了看看我不会建议什么。

标签: excel vba


【解决方案1】:

您必须正确地重新调整数组的大小,然后转置它。

Option Explicit

Sub Sample()
    Dim Array1()
    Dim ws As Worksheet
    Dim i As Long
    
    '~~> Change to respective sheet
    Set ws = Sheet1

    For i = 0 To 9
        ReDim Preserve Array1(i) '<~~ increment by i
        Array1(i) = Int((6 * Rnd) + 1)
    Next
    
    '~~> Store in the worksheet
    ws.Range("A1").Resize(UBound(Array1) + 1, 1).Value = Application.Transpose(Array1)
End Sub

【讨论】:

  • 谢谢,我看到了this,但由于您的代码的最后一行缺少Transpose,因此无法正常工作
  • 是的,因为在那个链接中它是一个二维数组。试试上面的代码。它有效。
【解决方案2】:

请尝试下一种方法,以填充已标注尺寸的二维数组,轻松将其内容放到一个范围内:

Sub fill2DArray()
  Dim Array1(1 To 10, 1 To 1), ws As Worksheet, i As Long
  Set ws = ActiveSheet
    For i = 0 To 9
       Array1(i + 1, 1) = Int((6 * Rnd) + 1)
    Next

 ws.Range("A1").Resize(UBound(Array1), UBound(Array1, 2)).value = Array1
End Sub

Transpose 在大范围内使用时有一些限制。

下一个版本是您更正的代码,但避免在每次迭代时使用ReDim Preserve,如果使用过于频繁,这会加重系统内存:

Sub fill1DEfficient()
    Dim Array1(), i As Long, ws As Worksheet, itNo As Long
    
    Set ws = ActiveSheet
    itNo = 10 'number of iterations
    ReDim Array1(itNo - 1)
    For i = 0 To itNo - 1
       Array1(i) = Int((6 * Rnd) + 1)
    Next
   ws.Range("A1").Resize(UBound(Array1) + 1, 1).value = Application.Transpose(Array1)
End Sub

【讨论】:

  • 也很有趣
  • 您的代码可以避免Redim Preserve... 在循环之前使用Redim。我将编辑答案以显示它。
【解决方案3】:

一列数组到一列范围

Option Explicit

Sub WriteArrayToOneColumnRange()
    
    Const rCount As Long = 10 ' Number of Elements (rows in this case)
    Const rndMin As Long = 1
    Const rndMax As Long = 6
    
    ' Define the 2D one-based one-column array.
    Dim Data As Variant: ReDim Data(1 To rCount, 1 To 1)
    
    Dim r As Long ' Element (Row) Counter
    
    ' Populate the array.
    For r = 1 To rCount
        Data(r, 1) = Int(((rndMax - rndMin + 1) * Rnd) + rndMin)
        'Debug.Print Data(r, 1)
    Next r
    
    ' Write the array values to a one-column range starting in 'A1'.
    Dim ws As Worksheet: Set ws = ActiveSheet ' be more specific
    ws.Range("A1").Resize(rCount).Value = Data

End Sub

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多