整个范围仅填充第一项数组

时间:2014-07-24 15:37:58

标签: arrays excel-vba resize range vba

我有两个数组,都有rows = intAllNumsRows。第一个数组(arrAllNums)是Public Dim' d为Integer,宽6列,即arrAllNums(1到intAllNumsRows,1到6)。第二个(arrAllNumsDates)是Public Dim"作为Date,只有1列宽,即arrAllNumsDates(1到intAllNumsRows)。日期对应于他们的arrAllNums数据。

正如您在下面的代码中所看到的,Ranges被调整为等于intAllNumsRows的行,并将它们各自的数组放入其中。第一个Range及其数组工作得很好。工作表上的正确单元格具有6列宽的数据和正确的行数。所有数据都显示出来。

第二个范围与arrAllNumsDates完全相同,但只有第一个日期......来自arrAllNumsDates(1)的日期...放在范围的所有单元格中 。换句话说,如果arrAllNumsDates(1)=#1/1/2014#,那么这是从AA5到Range中最后一个单元格行的每个单元格中的日期。每个单元都有相同的日期。

如您所见,我已使用Debug.Print验证存储在数组中的实际日期。他们很完美。阵列没有任何问题。由于Range确实在所有正确的单元格中显示日期,因此Range似乎正在适当调整大小。所有适当的细胞都有一个日期。令人困惑的问题是它是相同的日期,即数组中的第一个日期。

有什么想法吗?

Private Sub CommandButton1_Click()

Dim rng As Range

Set rng = Sheet1.Range("U5")
rng.Resize(intAllNumsRows, 6) = arrAllNums

Set rng = Sheet1.Range("AA5")
rng.Resize(intAllNumsRows, 1) = arrAllNumsDates

Set rng = Nothing


'**************************
Dim intI As Integer

For intI = 1 To intAllNumsRows
    Debug.Print arrAllNumsDates(intI)
Next

End Sub

Private Sub CommandButton1_Click()

1 个答案:

答案 0 :(得分:2)

一维数组存储为行而不是列。只需转置你的数组,这应该可以解决问题

rng.Resize(intAllNumsRows, 1) = worksheetfunction.transpose(arrAllNumsDates)

编辑:作为对您下面评论的回复 - 首先,我认为记住数组和范围是两回事可能会有所帮助。数组是一种特定的数据类型,它包含某种类型的大量数据。 VBA只是提供一种方便的方式来看待"如果你愿意,在数组中就好像它是一个范围。根据范围来考虑数组可能会有所帮助,但是VBA实际上将数组视为您需要考虑的范围的方式有几个细微之处。

要考虑的一件事是VBA将数组视为范围的方式取决于数组是一维还是二维

  • yourarray(1到m,1到n):这将被视为m行和n列的范围 - 正如您所期望的那样
  • yourarray(1到m):这将被视为一行m列

另一个微妙之处在于,如果您尝试将范围读入数组而不是相反 - 在这种情况下,即使返回单个行或列,即返回的数组,也将始终返回二维数组将涉及1个元素的额外冗余维度。

重新询问是否arrAllNums(intAllNums)= arrAllNums(1到intAllNums,1到1)的特定点

  • arrAllNums(intAllNums)是intAllNums元素的一维数组
  • arrAllNums(1到intAllNums,1到1)是intAllNums * 1元素的二维数组

尽管这两个数组看起来非常相似,但是当它在第二个实例中归结为它时,该数组实际上是一个具有额外冗余维度的一维数组,这些实际上并不是完全相同的东西,并且它们是这些数组的底层结构的细微差别,这将导致VBA以不同的方式看待它们

希望这有助于澄清