2011-11-27 53 views
11

我想选择电子表格中的所有行和列。宏需要是动态的,因为每次调用宏时列和行的数量都会变化。它还需要能够考虑空白行和列。返回从A1到真正的最后使用单元格的范围

这个子程序完成这一进程的一部分:

Sub FindLastCell() 
Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Select 
End Sub 

它发现并在电子表格中选择最后一个单元格。现在我已经找到了电子表格中最后一个单元格,如何选择单元格A1作为范围的LastCell?

回答

18

你需要使这些器官功能障碍综合征的代码

  1. 片可以是空白的,所以你不应该使用SelectFind仿佛查找没有返回这会给一个错误。而是测试范围对象Is Not Nothing
  2. Find可以按行和按列搜索。您需要确定最后的行和列,以确定真正的最后使用的电池
  3. 一旦你已经确定了真正的最后一个单元格使用Range从第一个单元格(A1)设定的范围与两个Find确定您的电池范围

PLS见下文

代码如果Find得到一个值,那么它使一个范围从rng3 A1至由两个Find S来标识最后使用的小区。

enter image description here

Sub GetRange() 
    Dim rng1 As Range 
    Dim rng2 As Range 
    Dim rng3 As Range 
    Set rng1 = Cells.Find("*", [a1], xlFormulas, , xlByRows, xlPrevious) 
    Set rng2 = Cells.Find("*", [a1], xlFormulas, , xlByColumns, xlPrevious) 
    If Not rng1 Is Nothing Then 
     Set rng3 = Range([a1], Cells(rng1.Row, rng2.Column)) 
     MsgBox "Range is " & rng3.Address(0, 0) 
     'if you need to actual select the range (which is rare in VBA) 
     Application.Goto rng3 
    Else 
     MsgBox "sheet is blank", vbCritical 
    End If 
End Sub 
+1

优秀! :) – AME

+1

好的,这是一个非常kewl kewl方式来执行范围功能。如果仅仅为了区别,我看一下使用一个过程并使用递归迭代。 – JackOrangeLantern

+1

很好地解释:) –

9

选择A1到使用(包括之间的毛坯)在列A的最后一个单元是如此简单:

Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Select 

要选择A1所用的最后一个信元在整个工作表中(不管它是否在列A中使用):

Range("A1:A" & ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row).Select 
+2

xlCellTypeLastCell通常会过度估计上次使用的单元格位置(来自已删除的数据),除非您在它之前强制执行一个已用过的区域更新,即添加一条诸如“ActiveSheet.UsedRange”之类的行。但我同意,它比我使用的查找更短,我从一个更具体的需求改编。欢呼戴夫。 – brettdj

+0

+1为有效的答案。 – brettdj

+0

感谢您添加关于刷新usedrange的注意事项!这是我应该提到的一件重要事情。 – aevanko

2

我想通了如何修改代码以选择从指定单元格开始的范围,并在最后一个单元格结束。在第8行,将a1更改为您希望开始的单元格。就我而言,我选择了j28。

​​

全码:

Sub GetRange() 
     Dim rng1 As Range 
     Dim rng2 As Range 
     Dim rng3 As Range 
     Set rng1 = Cells.Find("*", [a1], , , xlByRows, xlPrevious) 
     Set rng2 = Cells.Find("*", [a1], , , xlByColumns, xlPrevious) 
     If Not rng1 Is Nothing Then 
      Set rng3 = Range([j28], Cells(rng1.Row, rng2.Column)) 
      MsgBox "Range is " & rng3.Address(0, 0) 
      'if you need to actual select the range (which is rare in VBA) 
      Application.Goto rng3 
     Else 
      MsgBox "sheet is blank", vbCritical 
     End If 
    End Sub 
相关问题