如何在VBA中使用两个变量选择一系列行

时间:2013-05-02 19:33:57

标签: vba excel-vba range excel

我是VBA的新手,我正在尝试编写一个宏来将同一目录中所有工作簿中的特定数据提取到主工作簿中。我在尝试使用变量选择一系列数据时遇到困难,这样我就可以将数据复制并粘贴到主工作簿中。我一直在观看视频和通过论坛阅读,但似乎无法让宏工作。

我有一张Excel工作表,其中列出了A列中的员工,以及我要复制的有关B,C,D,E和F列(后续行)中员工的所有数据。例如,第1行包含单元格A1中的第一个雇员,然后第2行到第5行包含B到F列中的数据。第6行包含单元格A6中的下一个雇员姓名,有关它们的数据位于第7行到第7行9(BF栏)。我想复制行2-5并将它们粘贴到主工作簿中,然后复制7-9并粘贴到master,8-14,依此类推。

我的第一次尝试是将两个变量定义为整数。然后我尝试在A列中找到第一个雇员的名字并选择之后的行,并将第一个变量设置为等于该行。然后找到第二个员工的名称,选择之前的行并将变量2设置为等于该行。然后使用这两个变量选择范围。这是我的代码的样子:

Sub SelectConsultantData()
Dim Consultant1 As Integer, Consultant2 As Integer
Dim ConsultantRange As Range

    Columns("A:A").Select
    Selection.Find(What:="Andrew", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Consultant1 = Rows(ActiveCell.Row).Select
    Consultant1 = Consultant1 + 1
    Columns("A:A").Select
    Selection.Find(What:="Bob", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Consultant2 = Rows(ActiveCell.Row).Select
    Consultant2 = Consultant2 - 1
    Set ConsultantRange = Range(Consultant1, Consultant2).Select

End Sub

知道我做错了什么,或者有人能想到更好的方法吗?如果我需要提供进一步的背景信息,请告诉我。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码可以重写如下。避免在代码中使用Select。检查此link以了解原因。

Sub SelectConsultantData()
    Dim Consultant1 As Integer, Consultant2 As Integer
    Dim ConsultantRange As Range

    Dim rngFind As Range
    Set rngFind = Columns("A:A").Find(What:="Andrew", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

    If Not rngFind Is Nothing Then
        Consultant1 = rngFind.Row + 1
    End If

    Set rngFind = Columns("A:A").Find(What:="Bob", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

    If Not rngFind Is Nothing Then
        Consultant2 = rngFind.Row - 1
    End If

    If Consultant1 > 0 And Consultant2 > 0 Then
        Set ConsultantRange = Range(Cells(Consultant1, 2), Cells(Consultant2, 6))
    End If

End Sub