2011-11-27 5 views
11

スプレッドシートのすべての行と列を選択したいと思います。マクロは呼び出されるたびに列と行の数が変化する傾向があるため、動的である必要があります。また、空白の行と列を考慮に入れる必要があります。A1から最後に使用された最後のセルまでの範囲を返す

このサブルーチンは、プロセスの一部を実現:

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

これは、スプレッドシートの最後のセルを検索し、選択します。スプレッドシートの最後のセルが見つかったので、セルA1を範囲としてLastCellに選択するにはどうすればよいですか?

答えて

18

あなたは検索が何も返さない場合は、このエラーを与えるようあなたがFindSelectを使うべきではありませんので、シートは、空白になる場合があり、コード

  1. にこれらの改造を行う必要があります。代わりに、範囲オブジェクトIs Not Nothing
  2. Findが行と列で検索できることをテストしてください。あなたが最初のセル(A1)から2 Findで決定あなたのセルの範囲を設定するために、真の最後のセル使用Rangeを決定したら、あなたは本当の最後に使用されたセル
  3. を決定するために両方最後の行と列を決定する必要がありますFindは、値を取得し、2つのFind Sによって識別最後に使用セルにA1から範囲rng3を行った場合範囲

PLSが

以下のコードを参照してください。使用された最後のセルにA1を選択するには

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

:列Aの(間にブランクを含む)を使用し、最後のセルにA1を選択

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

は、このような単純なです(列Aで使用されているかどうかにかかわらず):

+2

xlCellTypeLastCellは、通常、使用された範囲の更新を強制する前に、つまりActiveSheet.UsedRangeなどの行を追加しない限り、(削除されたデータから)最後に使用されたセル位置を見積もります。しかし、私はそれが私がより具体的な必要から適応した私が使用したFindよりも短いことに同意します。 Daveを歓声する。効率的な答えは – brettdj

+0

+1です。 – brettdj

+0

使い易い使い方についてのメモを追加してくれてありがとう!それは私が言及すべきであった重要なことです。 – 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 
関連する問題