如何在VBA中的一个语句中写入一个Multi-D数组中的一个D?

我怎样才能在一个单一的声明中写一个multidimensional array的整个维度?

编辑2:澄清:

只需要更新VBA数组的一个切片(垂直或水平),而无需循环/处理整个数组。

  • 我假设我们需要将2D转换为1D或1D转换为2D数组。 不确定这是必要的。

  • 我的例子使用工作表范围作为来源,但不要被分心。 我不想更新工作表 – 尝试更新数组。 我寻求的解决scheme不应该要求工作表读/写。

编辑1:我有VBA中的二维数组。 它包含从工作表中拉入的单元格数据:

dim blockData blockData = [a1:d10] 

现在,我想将不同的单元格区域复制到该数组中,只覆盖一行:

 dim rowData ' just one row of data, but same width as 2D blockData rowData = [a20:d20] ' load into array, overwriting row 3 with this new data. ' This is the one-liner i seek: blockData(3,) = rowData 

那么,如何在一个语句中将一个整数的一维数组写入一个二维数组的D中,而不需要循环呢?

一些想法:

  • 我可以使用INDEX技巧从数组中获取单个列。 也许这可以以某种方式利用:colArray = WorksheetFunction.Index(rangeArray,0,1)colArray(1,2)=“新的单元格值”
  • 使用转置(colArray),但迄今为止还没有帮助。
  • 使用Redim Preserve以某种方式组合arrays,但不知道如何可以帮助。
  • 使用VarPtr将我的更改目录写入原始数组,但不能确定没有循环就可以完成。
  • 在一个语句中将整个数组复制到另一个variables是很容易的。 也许这可以被利用: Dim a1, a2 a1=array(1,2,3) a2=a1

谢谢

您可以尝试使用这种技术来填充数组,方法是使用Evaluate和目标源范围的数组公式。 数组公式包含一个IF语句,用于检查目标单元格的ROW或COLUMN,这意味着您可以隔离数组中的特定行或列,并在将其映射回源范围之前对其进行更改。

请参阅下面的示例代码。 注意中间线基本上是你的问题的答案所以,我怎么能在一个语句中写一个整数的一维数组到一个二维数组的一个D,而没有循环?

 Dim varRange As Variant varRange = [IF(ROW(D1:H7)=7,"X",D1:H7)] Sheet1.Range("D1:H7").Value = varRange 

你可以做更复杂的例子,但是这个技术似乎需要Evaluate而不是[]简写:

 Dim rngArray As Range Dim strAddress As String Dim varRange As Variant Dim strUpdateValue As String Dim intTargetRow As Integer Dim intTargetColumn As Integer ' set array from range - 7 rows x 5 columns of 1s Set rngArray = Sheet1.Range("D1:H7") ' get full address else Evaluate uses Activesheet strAddress = rngArray.Address(External:=True) ' update a row eg IF(ROW(D1:H7)=4,"Robin",D1:H7) strUpdateValue = "Robin" intTargetRow = 4 varRange = Evaluate("IF(ROW(" & strAddress & ")=" & intTargetRow & ",""" & strUpdateValue & """," & strAddress & ")") ' set back to range rngArray.Value = varRange ' update a column eg IF(COLUMN(D1:H7)=5,"Robin",D1:H7) strUpdateValue = "Robin" intTargetColumn = 5 varRange = Evaluate("IF(COLUMN(" & strAddress & ")=" & intTargetColumn & ",""" & strUpdateValue & """," & strAddress & ")") ' set back to range rngArray.Value = varRange 

在VBA中没有一个用于更新二维数组中列/行的class轮,您必须循环。

你有select。 如果想留在VBA中,并且要保持简短,唯一的方法就是创build一个循环的函数:

 Function RowSwap(Arr1, Arr2, Row) As Variant For col = LBound(Arr1, 2) To UBound(Arr1, 2) Arr1(Row, col) = Arr2(1, col) Next col RowSwap = Arr1 End Function 

那么你可以写在VBA中:

 blockData = RowSwap(blockData, rowData, 3) 

这是你所需要的,用rowData覆盖blockData第3行

否则,我认为在您的工作表中更改源数据是最好的,如果有必要,在临时表中。

– 如果它是一个元数组(数组数组),那么可以用一条语句更新一行:ArrayOfArrays(12)= NewRowArray

– 如果是二维数组,可以用CopyMemory更新一列。 不是为了模糊,如果你做错了,你可以崩溃(不要忘记清理部分)。 我没有弄清楚细节,但有一些线索: https : //stackoverflow.com/a/24843721/209942