【问题标题】:Adding multiple ranges to an array then using .value to copy/paste to a new sheet将多个范围添加到数组,然后使用 .value 复制/粘贴到新工作表
【发布时间】:2021-06-01 21:09:28
【问题描述】:

我有几个命名范围(timelinemarket、clientdetailsmarket、presencemonthlymarket、cashinflowmarket、cashoutflowmarket),我正在逐个循环并使用 .value 转移到新工作表。这需要大量代码,因为我正在逐个循环并执行 .value 操作。所有范围都(或被设计为)相同的高度(目前为 72 行)。

我想要的是将范围内的所有值添加到一个看起来像这样的数组中:

range 1 col 1 range 1 col 2 range 2 col 1 range 3 col 1 range 4 col 1
value value value value value
value value value value value
value value value value value
value value value value value

然后我想把那个数组粘贴到位置 x 的新工作表中。

我的理解是我可以一个接一个地遍历范围,将值添加到数组中,然后使用类似下面的内容将它们放入新的工作表中:

range("newrange") = myarray

要处理的范围都将是相同的高度,72 行,但它们具有不同的列数。

  1. 范围 1:72 行 x 2 列
  2. 范围 2:72 行 x 1 列
  3. 范围 3:72 行 x 1 列
  4. 范围 4:72 行 x 1 列

结果数组:72 行 x 5 列

【问题讨论】:

  • 你明白什么是数组,没有冒犯吗?请编辑您的问题并尝试用文字解释您尝试完成的工作。试图理解你的代码看起来已经够难了。
  • 有点……我已经阅读了多个教程,我想我明白了,但后来我尝试实际使用它们,但它的行为并不符合我的预期。我已经编辑了我的问题,希望更清楚......
  • 您不应该删除所有代码。也许其他更有耐心的人会更好地理解它的含义......现在,为了提供更多相关性,我认为您应该向我们展示您要处理的数据的外观。我知道以多种方式处理数组并且我喜欢提供帮助,但是如果没有看到输入,实际上不可能向您展示应该如何创建这样的输出......
  • 我认为你是对的,代码实际上并没有为问题添加任何内容。我只需要知道如何将范围的值添加到数组中......如果这实际上是实现我想要的结果的好方法!并感谢您花时间回答,非常感谢。
  • 最简单的方法是使用范围Value 属性。例如arr = Range("A1:B4").value 将范围放入具有两列和四行的数组中。是不是清楚一点?你可以测试一下。然后,使用“Debug.Print arr(2, 2)”。它将返回以前的范围“B2”值...

标签: excel vba


【解决方案1】:

要按列连接两个数组,请使用下一个函数:

Function JoinArrCol(arr As Variant, ar1 As Variant) As Variant
     Dim i As Long, j As Long, lastItem As Long
     
     lastItem = UBound(arr, 2)
     ReDim Preserve arr(1 To UBound(arr), 1 To UBound(arr, 2) + UBound(ar1, 2))
     
     For i = 1 To UBound(arr)
        For j = 1 To UBound(ar1, 2)
            arr(i, j + lastItem) = ar1(i, j)
        Next j
     Next i
     JoinArrCol = arr
 End Function

为了将范围放入数组中,请使用下一个Sub,它使用上述函数来连接数组。连接结果将被丢弃在下一张表中:

Sub joinArraysPerColumns()
    Dim sh As Worksheet, sh1 As Worksheet, lastR As Long, arr1, arr2, arr3, arr4, arrFin
    
    Set sh = ActiveSheet
    Set sh1 = sh.Next
    lastR = sh.Range("A" & sh.rows.count).End(xlUp).row
    arr1 = sh.Range("A2:B" & lastR).value
    arr2 = sh.Range("C2:E" & lastR).value
    
    arrFin = JoinArrCol(arr1, arr2)
    sh1.Range("A2").Resize(UBound(arrFin), UBound(arrFin, 2)).value = arrFin
 End Sub

【讨论】:

  • 非常感谢您的帮助!这个好像可以用了,我来玩玩看看怎么样!
  • @exoticdisease:很高兴我(终于)能帮上忙!您可以使用您的命名范围而不是"A2:B" & lastR,或者甚至将所有名称放在一个数组中并从那里使用它们。只需要两个数组。一个接收命名的范围值,另一个将一直递增,将它与从范围中提取的新数组连接起来。您首先必须使用If not IsArray(arrFin) then ArrFin = arr。其中arrFin 应该是连接所有内容的数组,arr 是从每个命名范围中获取值的数组...如果看起来有问题,请随时寻求帮助。
【解决方案2】:

循环命名范围的代码不多

Sub CopyRanges()

    Dim wsDashData As Worksheet
    Dim rng As Range, rngDest As Range, c As Integer
    Dim namerange, data, i As Integer
    namerange = Array("timelinemarket", "clientdetailsmarket", "premisesmonthlymarket", "cashinflowmarket", "cashoutflowmarket")
    
    Set wsDashData = ThisWorkbook.Sheets(1)
    Set rngDest = Sheet2.Range("A1")
    
    For i = 0 To UBound(namerange)
        data = wsDashData.Range(namerange(i)).Value2
        c = UBound(data, 2)
        rngDest.Resize(UBound(data), c).Value2 = data
        Set rngDest = rngDest.Offset(0, c)
    Next
    
End Sub

【讨论】:

  • 谢谢您,我将尝试使用此代码 - 您将命名范围放入数组的解决方案看起来很有希望。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
相关资源
最近更新 更多