Excel VBA,如何根据列中的数据选择行?

时间:2012-03-20 16:31:54

标签: excel-vba vba excel

Sub SelectAllReleventText()
Do While Range(“A1”).Offset(1, 6) <> Empty
Rows(ActiveCell.Row).Select
ActiveCell.Offset(1, 0).Select
Loop
End Sub

这是我的剧本,我已经被告知它没有做到它的意图,这是我的预期,因为这是我的第一次尝试。我想出一个未定义错误的变量。我以为我定义了变量,但我猜它对Excel VBA来说还不够具体。

这就是我想要做的。

  1. 在练习册1中,在B6上有一个字母数字名称,我希望选择该行。
  2. 向下一行,如果有文字,则选择该行。
  3. 继续直到文字不再流行。
  4. 复制选定的行。
  5. 粘贴到另一个工作簿(Workbook2),从第2行开始,进入选项卡1,因为第1行有标题。
  6. 提前致谢。只是抬头,我在我的VBA中使用选项显式,因为我被告知这是&#34;正确的做事方式&#34; ...

2 个答案:

答案 0 :(得分:10)

使用Option Explicit是一个好习惯。然而,使用.Select不是:)它会降低代码的速度。同样完全证明工作表名称,否则代码将始终为Activesheet运行,这可能不是您真正想要的。

这是你在尝试的吗?

Option Explicit

Sub Sample()
    Dim lastRow As Long, i As Long
    Dim CopyRange As Range

    '~~> Change Sheet1 to relevant sheet name
    With Sheets("Sheet1")
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 2 To lastRow
            If Len(Trim(.Range("A" & i).Value)) <> 0 Then
                If CopyRange Is Nothing Then
                    Set CopyRange = .Rows(i)
                Else
                    Set CopyRange = Union(CopyRange, .Rows(i))
                End If
            Else
                Exit For
            End If
        Next

        If Not CopyRange Is Nothing Then
            '~~> Change Sheet2 to relevant sheet name
            CopyRange.Copy Sheets("Sheet2").Rows(1)
        End If
    End With
End Sub

注意

如果你有从第2行到第10行的数据,第11行是空白的,那么你从第12行再次获得数据,那么上面的代码只会将数据从第2行复制到第10行

如果要复制所有包含数据的行,请使用此代码。

Option Explicit

Sub Sample()
    Dim lastRow As Long, i As Long
    Dim CopyRange As Range

    '~~> Change Sheet1 to relevant sheet name
    With Sheets("Sheet1")
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 2 To lastRow
            If Len(Trim(.Range("A" & i).Value)) <> 0 Then
                If CopyRange Is Nothing Then
                    Set CopyRange = .Rows(i)
                Else
                    Set CopyRange = Union(CopyRange, .Rows(i))
                End If
            End If
        Next

        If Not CopyRange Is Nothing Then
            '~~> Change Sheet2 to relevant sheet name
            CopyRange.Copy Sheets("Sheet2").Rows(1)
        End If
    End With
End Sub

希望这是你想要的?

西特

答案 1 :(得分:3)

最简单的方法是使用End方法,通过按结束键,然后在单元格上的方向(在这种情况下为B6),为您提供到达的单元格)。但是,如果B6或B7为空,这将无法满足您的期望。

Dim start_cell As Range
Set start_cell = Range("[Workbook1.xlsx]Sheet1!B6")
Range(start_cell, start_cell.End(xlDown)).Copy Range("[Workbook2.xlsx]Sheet1!A2")

如果您无法使用End,则必须使用循环。

Dim start_cell As Range, end_cell As Range

Set start_cell = Range("[Workbook1.xlsx]Sheet1!B6")
Set end_cell = start_cell

Do Until IsEmpty(end_cell.Offset(1, 0))
    Set end_cell = end_cell.Offset(1, 0)
Loop

Range(start_cell, end_cell).Copy Range("[Workbook2.xlsx]Sheet1!A2")