0

我正在尝试继续该过程直到单元格结束,但选择需要按设定的顺序更改。这是代码:

' 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

您所见,它基本上所做的是选择 11 行,然后转置将数据复制到下一行的下一个工作簿中。我 F8 完成了整个过程,我可以说它适用于一个选择,然后向下移动 13 行并进行下一个选择,但我不确定如何让它在数据中连续移动。我需要它始终选择 11 行,执行该过程,然后向下计数 13 行,然后再次执行,直到它遇到一个空行。理想情况下,我可以将其设置为查找某个单元格条目并在找到该单元格条目的下一个实例后选择 11 行,但我认为 13 行仍然是一种模式,所以如果它只是倒计时 13 行应该没问题。

所以,我认为我的难题是如何使行选择可变。当我查看代码时,我可以看到我的行选择是具体的值,所以如果我要运行宏,它不会向下移动,它只会执行我指示的单元格。我怎样才能让它通过细胞向下移动?

4

1 回答 1

1

您无需激活工作簿即可对其中的范围进行操作,而是可以通过首先限定范围所在的工作簿来对非活动工作簿中的范围进行操作。这同样适用于工作表和范围。诚然,这并不是导致您发布的代码示例出现问题的原因,因为您实际上并没有涉及到这一点,但这会使您的代码更难阅读。

您的问题的一种可能的解决方案是一个看起来像这样的宏:

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-property将其从前一个目标范围偏移一行。我对 source-range 做同样的事情,但我将它偏移了 13 行,因为这就是你在代码示例中所做的事情。

我希望这有帮助!

于 2015-03-16T22:14:02.990 回答