如何使选择在 VBA 中的可变数据中移动

How to make selection move through variable data in VBA

我试图继续这个过程直到细胞结束,但是 selection 需要按照设定的顺序改变。这是代码:

' C_P Macro
' copies from worksheet & pastes in new sheet
' Keyboard Shortcut: Ctrl+Shift+L

  Dim rng1 As Range
  Dim Look As String
  Dim iRow As Integer
  With Windows("Audubon-Crest-Rent-Roll-201502-1.xlsx").Activate
  Set rng1 = Range("A:A")
  ActiveCell = Range("A228")
  Do
    Windows("Audubon-Crest-Rent-Roll-201502-1.xlsx").Activate
    Range("A228:A239").Select
        Selection.Copy
    Windows("Audubon Crest Rent Roll 20150219-altered.xlsm").Activate
    Range("B17").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Windows("Audubon-Crest-Rent-Roll-201502-1.xlsx").Activate
    Application.CutCopyMode = False

    Range("A228:A239").Offset(13, 0).Select
    Selection.Copy
    Windows("Audubon Crest Rent Roll 20150219-altered.xlsm").Activate
    Range("B17").Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Range("B18").Select
    Loop Until IsEmpty(Cells(iRow, 1))
End With
End Sub

正如你所看到的,它基本上做的是制作一个select11行的离子,然后将数据转置复制到下一行的下一个工作簿中.我 F8 通过了这个过程,我可以看出它对一个 selection 效果很好,然后向下移动 13 行并执行下一个 selection,但我不确定如何连续进行移动数据。我需要它总是 select 11 行,执行该过程然后向下数 13 行并再次执行直到遇到空行。理想情况下,我可以将其设置为 Find a certain cell entry and select 11 rows once it locates the next instance of this cell entry,但我认为这 13 行仍然是一个模式,所以如果它只是倒计时 13 行应该没问题。

所以,我认为我的困惑是如何使行 selections 变量。当我查看代码时,我可以看到我的行 selections 是具体值,所以如果我要 运行 宏,它不会向下移动,它只会执行我指定的单元格。我怎样才能让它在细胞中向下移动?

您不需要激活工作簿来执行其中包含某个范围的操作,而是您可以通过首先限定该范围所在的工作簿来对非活动工作簿中的某个范围执行操作。这同样适用于工作表和范围。不可否认,这不是导致您发布的代码示例出现问题的原因,因为您实际上并没有触及它,但它使您的代码更难阅读。

您的问题的一个可能解决方案是使用如下所示的宏:

Sub Copy_Paste
    Dim sourceBook As Workbook, destBook As Workbook, sourceRange As Range, destRange As Range

    Set sourceBook = Workbooks("Audubon-Crest-Rent-Roll-201502-1.xlsx")
    Set destBook = Workbooks("Audubon Crest Rent Roll 20150219-altered.xlsm")

    Set sourceRange = sourceBook.Worksheets(<name of sheet the data is in as string>).Range("A228:A239")
    Set destRange = destBook.Worksheets(<name of sheet the data shall be copied to as string>).Range("B17")

    Do
        sourceRange.Copy
        destRange.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        Application.CutCopyMode = False

        Set destRange = destRange.Offset(1, 0)
        Set sourceRange = sourceRange.Offset(13, 0)
    Loop Until IsEmpty(sourceRange)
End Sub

如您所见,我定义了要复制的范围,方法是命名它们,然后使用 Set 语句告诉 Excel 它们的位置。对于循环的每次迭代,我通过再次设置将目标范围向下移动一行,并通过使用 offset 从前一个目标范围一行12=]。我对源范围执行相同的操作,但我将其偏移 13 行,因为这就是您在代码示例中所做的。

希望对您有所帮助!