【问题标题】:Excel VBA, How to select rows based on data in a column?Excel VBA,如何根据列中的数据选择行?
【发布时间】:2012-03-20 16:31:54
【问题描述】:
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),粘贴到选项卡 1,从第 2 行开始,因为第 1 行有标题。

提前致谢。请注意,我在我的 VBA 中使用了 Options Explicit,因为有人告诉我这是“正确的做事方式”...

【问题讨论】:

  • 试试这个:Do While Range(“A1”).Offset(1, 6) &lt;&gt; ""

标签: excel vba


【解决方案1】:

是的,使用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

希望这是你想要的吗?

席德

【讨论】:

  • 第二个非常接近我想要的。我想要做的是将数据从 Backorder.cvs 复制到 JobsDB.xlsx,在“新建”选项卡下。这是两者的附件。 dl.dropbox.com/u/3327208/Jobs.zip
  • Gr8 :) “关闭”是什么意思?哪个部分不起作用(如果不起作用)您是否对上述代码进行了相关更改以满足您的需求?如果是,那么我很想看看你尝试过的代码:)
  • 我刚刚将附件作为链接发布...它将解释我最初的意思,我很快就会回来,我有一个紧急旅行我必须采取。
  • 很抱歉就这样离开了。我有一个客户,她的笔记本电脑被她儿子掉了,不得不恢复驱动器上的所有媒体和数据。它不像SSD。无论如何,我没有说我想要什么,而是上传了包含所有文件的最终附件,并解释了我需要做什么。如果您能提供帮助,将不胜感激。 dl.dropbox.com/u/3327208/zips/Late%20Jobs.zip
【解决方案2】:

最简单的方法是使用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")

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2011-05-30
    相关资源
    最近更新 更多