【问题标题】:How to dynamically select a range VBA如何动态选择范围 VBA
【发布时间】:2021-04-29 02:44:41
【问题描述】:

我的问题与以下非常相似:

Excel VBA code to select non empty cells 但是,我之间有一些空单元格。特别是,我试图定义一个需要排除第一行的范围,因为它是一个标题。我还必须排除后面的空单元格。我正在尝试类似的东西

Dim wb as workbook, ws as worksheet
Dim myrange as range

'Defined reference wb and ws
myrange=ws.range("B2",range("B2"),end(xldown))

但这只有在中间没有空单元格的情况下才有效。那么,有没有一种快速简单的方法来动态选择包含非空单元格的范围,但标题除外?

【问题讨论】:

标签: vba range


【解决方案1】:

试试这个

'Defined reference wb and ws
Set myrange = ws.range("B2", ws.Range("B" & Rows.Count).End(xlUp))

别忘了使用Set 关键字

【讨论】:

  • 谢谢,这似乎有效。请您向我解释一下,这究竟是如何工作的?为什么不 xldown?
  • xlDown 在找到空白单元格时停止。
  • .End(xlDown) 与按 Ctrl+Down Arrow 相同。 .End(xlUp) 与按 Ctrl+Up Arrow 相同。在此代码中,您实际上是转到 B 列中的最后一个单元格并按 Ctrl+Up 并使用最终得到的单元格。够了吗?
【解决方案2】:

请尝试下一个方法:

Sub testDefineRange()
 Dim ws As Worksheet, lastRow As Long, myrange As Range

 Set ws = ActiveSheet 'use here what you need
 lastRow = ws.Range("B" & ws.rows.count).End(xlUp).row
 'Defined reference ws
 Set myrange = ws.Range("B2:B" & lastRow)
 myrange.Select
End Sub

【讨论】:

  • 请删除末尾的Select-statement,或者至少添加一条注释,说明添加该语句只是为了展示结果。
  • @FunThomas:出于完全相同的原因,我将其保留在那里。在确认代码按他的需要工作后,他可以轻松地删除它。 :)
  • 是的。当然,他可以删除它。如果您首先提到为什么将其放在那里。如果您提到此代码仅适用于ActiveSheet(否则您将收到运行时错误)。
  • @FunThomas: Set ws = ActiveSheet 'use here what you need 应该让他定义他需要的工作表。我只是试图调整他的代码,使其按照他在问题中提出的方式工作。否则,只需一行代码就可以轻松完成...
  • 如果 ws 设置为任何其他工作表,它将失败。 OP 没有提到任何关于使用 Activesheet 的内容。并且代码应该从不依赖于 ActiveSheet(或选择)。当然可以用一行来完成(尽管我认为最好将其拆分为 2 行并将最后一行保存到变量中),这已经被问到(并回答)了 100 次。
【解决方案3】:

我发现这个链接在很多场合都非常有用。

https://www.thespreadsheetguru.com/blog/2014/7/7/5-different-ways-to-find-the-last-row-or-last-column-using-vba

查找最后一行的方法

Sub FindingLastRow()
'PURPOSE: Different ways to find the last row number of a range
'SOURCE: www.TheSpreadsheetGuru.com

Dim sht As Worksheet
Dim LastRow As Long

Set sht = ActiveSheet

'Using Find Function (Provided by Bob Ulmas)
  LastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

'Using SpecialCells Function
  LastRow = sht.Cells.SpecialCells(xlCellTypeLastCell).Row

'Ctrl + Shift + End
  LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

'Using UsedRange
  sht.UsedRange 'Refresh UsedRange
  LastRow = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row

'Using Table Range
  LastRow = sht.ListObjects("Table1").Range.Rows.Count

'Using Named Range
  LastRow = sht.Range("MyNamedRange").Rows.Count

'Ctrl + Shift + Down (Range should be first cell in data set)
  LastRow = sht.Range("A1").CurrentRegion.Rows.Count

End Sub

查找最后一列的方法

Sub FindingLastColumn()

'PURPOSE: Different ways to find the last column number of a range
'SOURCE: www.TheSpreadsheetGuru.com

Dim sht As Worksheet
Dim LastColumn As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")

'Ctrl + Shift + End
  LastColumn = sht.Cells(7, sht.Columns.Count).End(xlToLeft).Column

'Using UsedRange
  sht.UsedRange 'Refresh UsedRange
  LastColumn = sht.UsedRange.Columns(sht.UsedRange.Columns.Count).Column

'Using Table Range
  LastColumn = sht.ListObjects("Table1").Range.Columns.Count

'Using Named Range
  LastColumn = sht.Range("MyNamedRange").Columns.Count

'Ctrl + Shift + Right (Range should be first cell in data set)
  LastColumn = sht.Range("A1").CurrentRegion.Columns.Count

End Sub

【讨论】:

    【解决方案4】:

    如果适合您的情况,我喜欢使用 CurrentRegion 和 Intersect 来消除标题行。

    with ws.range("b2")
       set myRange = intersect(.currentregion, .currentregion.offset(1,0))
    end with
    debug.print myRange.address
    

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多