Excel 将多个单元格(而不是并排)复制到并排的单元格

Excel 将多个单元格(而不是并排)复制到并排的单元格,excel,vba,copy-paste,Excel,Vba,Copy Paste,获取此代码: Sub-LoopAllFilesAndCopyPasteKIT() 作为对象的Dim MyObj 将MySource设置为对象 作为变量的Dim文件 将其命名为工作簿“Denne fila” Dim wbTarget作为工作簿“文件管理器åkopiere数据fra” 最后一排一样长 Dim sht1作为工作表 将sht2变暗为工作表 作为变体的Dim vDB 设置wbThis=ActiveWorkbook 设置sht1=wbThis.Sheets(“Ark1”) Folder=“H

获取此代码:

Sub-LoopAllFilesAndCopyPasteKIT()
作为对象的Dim MyObj
将MySource设置为对象
作为变量的Dim文件
将其命名为工作簿“Denne fila”
Dim wbTarget作为工作簿“文件管理器åkopiere数据fra”
最后一排一样长
Dim sht1作为工作表
将sht2变暗为工作表
作为变体的Dim vDB
设置wbThis=ActiveWorkbook
设置sht1=wbThis.Sheets(“Ark1”)
Folder=“H:\Mine-dokumenter\Nedlastinger\Reporter\”
Fname=Dir(文件夹)
While(Fname“”)
设置wbTarget=Workbooks.Open(文件名:=文件夹&Fname)
vDB=wbTarget.Sheets(1).范围(“A3:D3”)
sht1.Range(“A”和Rows.Count).End(xlUp)(2).Resize(UBound(vDB,1),UBound(vDB,2))=vDB
Fname=Dir
“卢卡·菲伦
wbTarget,关闭
温德
端接头
代码打开文件夹中的所有文件,并将单元格复制到“masterWb”,将数据放在下一个空行中。
目标范围设置为“A3:D3”(单元格并排)

我想复制细胞B3,G3,B7和R7

我试过:

vDB = wbTarget.Sheets(1).Range("B3,G3,B7,R7")

下面的粘贴代码中有一个错误。

请尝试下一个功能。它将变换连续一维阵列中的不连续范围:

Function testUnionDiscontinuousRangeArray(rng As Range, sep As String) As Variant
  Dim arr As Variant, arrF As Variant, arr1 As Variant
  Dim temp As String, i As Long, j As Long
  
   arr = Split(rng.Address, ",")

   For i = 0 To UBound(arr)
    arr1 = rng.Parent.Range(arr(i)).Value
    If IsArray(arr1) Then
        For j = 1 To UBound(arr1)
           temp = temp & Join(Application.Index(arr1, j, 0), sep) & sep
        Next
    Else
        temp = temp & arr1 & sep
    End If
   Next
   temp = left(temp, Len(temp) - 1)
   testUnionDiscontinuousRangeArray = Split(temp, sep)
End Function
您可以先通过以下方式进行测试:

Sub testUnionDiscRange()
  Dim rng As Range, arr1Row As Variant
  Set rng = Range("B3,G3:I3,B7,R7") 'it works on active worksheet
  arr1Row = testUnionDiscontinuousRangeArray(rng, "|")
  Debug.Print Join(arr1Row, "|")
End Sub
它将返回所有以“|”分隔的数组值

您可以通过以下方式在代码中使用它:

Sub testUnionDiscRange()
  Dim rng As Range, arr1Row As Variant
  Set rng = Range("B3,G3:I3,B7,R7") 'it works on active worksheet
  arr1Row = testUnionDiscontinuousRangeArray(rng, "|")
  Debug.Print Join(arr1Row, "|")
End Sub
  • 将上述函数与主代码复制到同一模块中

  • 替换:

  • 与:

    已编辑

    要计算实际的最后一个空行,如果某些粘贴单元格中的值为空,请使用下一个函数:

    Function LastEmptyR(sh As Worksheet, ColNo As Long) As Long
       Dim lastR As Long, i As Long
       For i = 1 To ColNo
           If sh.cells(rows.count, i).End(xlUp).row > lastR Then
                lastR = sh.cells(rows.count, i).End(xlUp).row
           End If
       Next i
       LastEmptyR = lastR + 1
    End Function
    
    可以通过以下简单方式对其进行测试:

    Sub testLastEmptyR()
      Debug.Print LastEmptyR(ActiveSheet, 5) '5 = number of columns to be used
    End Sub
    

    您将使用它作为
    sht1.Range(“A”&LastEmptyR).Resize(1,UBound(vDB)+1)=vDB

    当您使用不连续的范围并尝试将其放入数组时,VBA只会放入其第一个区域。。。要在何处复制范围单元格?在连续范围内,在同一行上?您需要一个函数来转换仅具有一行的连续数组中的非连续范围/数组(具有多行)。我会准备并发布它…复制第一个excel文件的B3、G3、B7、R7应该在wbThis中结束,第1、A2、B2、C2、D2页(有标题)。复制下一个excel文件的B3、G3、B7、R7应以A3、B3、C3、D3(下一行)等结尾。。。感谢您的帮助,因为我看到我的挑战变得更加困难(也没有使用数组编写任何vba)…:-)请检查我上面提到的功能,并发送一些反馈。我发布了答案。如果您在我发布后立即复制了该函数,请复制更新版本。我只更改了一行代码:
    arr1=Range(arr(I)).Value
    arr1=rng.Parent.Range(arr(I)).Value
    。我在活动工作表上创建了这个函数,但是如果该范围属于另一个工作表,它需要引用该范围所属的工作表。太棒了!非常感谢!:-)但是,可能有一个错误:VBA没有粘贴最后一个单元格(R7)。如果我将另一个单元格添加到复制位(“B3、G3、B7、R7、K9”),则包括R7,但不包括K9。那会是什么?我刚刚想到的另一个问题是:如果从中复制的某个工作簿中B3为空,则复制/粘贴是可以的,但粘贴下一个工作簿时,它会覆盖此行。有250本工作簿我想从中复制,我还不确定这个例子是否会出现:但如果出现,是否可以以任何方式加以考虑?@kit99:更正了第一期的上述代码。我忽略了粘贴范围调整后的行中的一些明显内容。作为一个一维数组,它的
    Ubound
    从零开始。我添加了1(
    …Resize(1,UBound(vDB)+1)=vDB
    )。关于第二个问题,我不确定我是否理解正确。。。如果是,如果空单元格出现在一列中,对于这种情况,我建议您计算所有列的最后一行并选择最大值。我的意思是,你必须通过迭代来计算它。现在我很忙,但我将创建一个函数,该函数能够返回适当的最后一个空行…:更正工作正常。我仔细查看了文件中的mye副本,所有文件的第一个单元格中都应该有数据。当vba检查粘贴数据中的最后一行时,A列应保存所有行的数据,不允许在A列为空的行顶部粘贴数据。再次感谢您的帮助!:)@无论如何,kit99 I发布的函数能够计算出真正的空行,如果将来可能出现这种情况。代码需要几微秒。。。当然,你可以用,也可以不用,你是个和蔼可亲的人!:)通过在真实数据上尝试vba,我遇到了另一个障碍。事实证明,我试图从中复制数据的几个单元格被合并(不,我没有构建这个…)。当A3:B3合并到B3中时复制B3,并将其粘贴到WST中的1个单元格中。这不在要执行的代码范围内。但我不指望你也能解决这个问题(如果它能解决的话)。你已经给了我足够多的帮助了!
    Sub testLastEmptyR()
      Debug.Print LastEmptyR(ActiveSheet, 5) '5 = number of columns to be used
    End Sub