如何在VBA中通过可变数据进行选择

时间:2015-03-16 21:43:25

标签: excel vba excel-vba do-loops

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

' 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行,然后执行该过程然后向下计算十三行并再次执行直到它遇到一个空行。理想情况下,我可以将其设置为查找某个单元格条目,并在找到此单元格条目的下一个实例后选择11行,但我认为13行仍然是一个模式,所以如果它只计算13行应该没问题。

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

1 个答案:

答案 0 :(得分: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偏移从前一目标范围中移除一行 。我对源范围做了同样的事情,但我将其偏移了13行,因为这就像你在代码样本中所做的那样。

我希望这有帮助!