VBAについてMixiミクシーでいろいろ教えていただきましたので、
忘れないように忘備録としてWebアップしました。


      
   Sub A列最終行上より()
  MaxRow = Range("A1").End(xlDown).Row
  MsgBox "最終行は" & MaxRow & "です "
    End Sub
   
  

★A列を対照して、A1から下方に検索します。
(1)列の途中に空白があればその手前のデータのある行を取得します
(2)列の最初が空白なら最初にデータのある行番号を取得します
(3)列すべてが空白ならエクセル最終行65536となります


Sub A列最終行下より2003()
MaxRow = Range("A65536").End(xlUp).Row
MsgBox "最終行は" & MaxRow & "です "
End Sub

★A列を対照して、A列の一番下から上方に検索します。
(1)列の途中に空白があるなしに関わらず一番下のデータ行を取得します
(2)列のすべてが空白の場合は1行を取得します
(3)2007以降のバージョンではA65536が変わります。


Sub A列最終行をカウント()
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "最終行は" & MaxRow & "です "
End Sub

★A列のデータのある行をカウントします。
(1)列の途中に空白があるなしに関わらず一番下のデータ行を取得します
(2)列のすべてが空白の場合は1行を取得します



Sub 一行の最終列を前から右へ()
MaxCol = Range("A1").End(xlToRight).Column
MsgBox "最終列は" & MaxCol & "です "
End Sub

★一行目の最終データ列を前から右へ検索します。
(1)一行目の途中に空白があればその手前のデータのある列を取得します
(2)一行目の最初が空白なら最初にデータのある列番号を取得します
(3)一行目すべてが空白ならエクセル最終列 IV1 となります



Sub 一行の最終列を後ろから左へ()
MaxCol = Range("IV1").End(xlToLeft).Column
MsgBox "最終列は" & MaxCol & "です "
End Sub

★一行目の最終から左へデータのある列まで検索します。
(1)一行目の途中に空白があるなしに関係なく最終列を検索します。
(2)一行すべてが空白なら1列目を返します。
(3)エクセルのバージョンによって最終列の指定IV1を変更する必要があります。



Sub 一行目の最終列をカウント()
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox "最終列は" & MaxCol & "です "
End Sub

★一行目の最終から左へデータのある列まで検索します。
(1)一行目の途中に空白があるなしに関係なく最終列を取得します
(2)一行目すべてが空白なら1となります



Sub 最終行列()
With Range("A1").SpecialCells(xlLastCell)
MaxRow = .Row
MaxCol = .Column
End With
MsgBox "は" & MaxRow & "行、" & _
"最終列は" & MaxCol & "列です"
End Sub

★書式を含めたオブゼクトを対照に最終の行と列を検索します。
(1)フオントのサイズなど変更されていたらデータが無くても検索します
(2)途中の空白なんか無視されます。



Sub 最終行列()
   With ActiveSheet.UsedRange
MaxRow = .Rows.Count
MaxCol = .Columns.Count
  End With
MsgBox "は" & MaxRow & "行、" & _
"最終列は" & MaxCol & "列です"
 End Sub

★書式を含めたオブゼクトを対照に最終の行と列を検索します。
(1)罫線、セル幅なども対照されます。
(2)空白は無視されます。



Sub CellCnt()
Dim lngYCnt As Long
Dim intXCnt As Integer
lngYCnt = Worksheets("Sheet1").UsedRange.Rows.Count
intXCnt = Worksheets("Sheet1").UsedRange.Columns.Count
MsgBox "最終行は" & intYCnt & "行、" &
_ "最終列は" & lngXCnt & "列です"
End Sub

★書式を含めたオブゼクトを対照に最終の行と列を検索します。
(1)フオントのサイズなど変更されていたらデータが無くても検索します
(2)途中の空白なんか無視されます。


----------------------------

さて、 Mixiの掲示板で最終行を取得する方法は今まで何度も見てきました。
私もよっちやんの詳しい記事を見て凄いなと感服しているところです。
ただ私のレベルでは用語を含めてさっぱりお手上げです。
それでもメモに保存して少しづつ勉強することにしています。
 そこで思うには、このコミュニの2万余の全会員の中で
何パーセント程の人がこの記事の内容を理解できるでしょうか、
>ここまでは予備知識でした。
>ここからは、やってみてほしいのでコードは提示しない)
そして、何割の人がどんな方法で挑戦しているのか興味深深です。
私などはすぐに面倒になってぐぐります ↓ ↓これじゃ駄目っポ。




Sub FindLast最終行を探す()
Dim r As Range
Dim MaxRow As Long
Dim ar As Variant
Dim buf As Variant
Set r = ActiveSheet.UsedRange
ar = Evaluate("(" & r.Address & "<>"""")*(ROW(" & r.Address & "))")
For i = r.Rows.Count To 1 Step -1
buf = WorksheetFunction.Index(ar, i, 0)
MaxRow = WorksheetFunction.Max(buf)
If MaxRow > 0 Then
Exit For
End If
Next
MsgBox "最後の行は、" & MaxRow
End Sub


Excel(エクセル)活用の管理人よつちやん曰く
提示されたコードは・・・なんという表現をしたらよいのか悩みますが
ワークシート全体で空の文字列 ="" でない値の最終入力行を取得するコードの一例のようですね。
最終行・・・何をもってして最終行とするかの決めになってしまうのですが、
私があちらで記載したEndステートメント(Ctrl+十字キー)の例は
空の文字列(よく長さゼロの文字列と表現されます)も入力行としているのと、
特定の列での話になっていますので、宇宙えびさんご提示のコードとは使い道が異なるでしょうか。
提示のコードは、その発想にとても興味をそそられました。
(でも変数 i も宣言してあげてほしかったです)
使い道あるコードだと思いますのでメモに加えておいてはいかがでしょうか。
ところで、ご提示のコードではUsedRangeが使用されていますね。
ワークシート上の入力範囲の取得にUsedRangeは非常に便利です。
そのため、印刷範囲を自動で設定(拡張・縮小)したりや
何か全体的にあれこれするような時には便利な場合があります。
VBAをお勉強し立ての頃、ワークシート上の最終入力行の取得には
UsedRangeでやるのがベストだと思っていました。




Sub Sample()
   Dim rng1 As Range
   Dim rng2 As Range
   'UsedRangeを取得
   Set rng1 = ActiveSheet.UsedRange
'rng1の最終セルを取得(別に最下行であれば1番右の列にする必要はないけど)
   Set rng2 = rng1.Resize(1, 1).Offset(rng1.Rows.Count - 1, rng1.Columns.Count - 1)
  MsgBox "ActiveSheetの最終入力行は" & rng2.Row & "かな?"
End Sub


ですが、UsedRangeには落とし穴があります。
VBAのヘルプではUsedRangeについて以下のように記載されています。
> オブジェクトを返すプロパティです。
> 値の取得のみ可能です。
「値が入力されたセル範囲を返す」ではなく「使われたセル範囲」と書いてあります。
どういうことかと言いますと、結合されたセルがあったら
実際に値が入力されたセルまでではなく、結合セルも含めて取得されてしまいます。
A1セルに 1 とでも入力してA1〜B10セルを結合すると、
UsedRangeでは A1〜B10 のRangeオブジェクトが取得されてしまいます。
それと、使用されているセルがない場合でもUsedRangeはA1セルを返します。
あるべき用途で使用しないとUsedRangeは牙を向きますので注意が必要ですね。


●(UsedRange)


Sub 使用済みの最終セルの選択()
With ActiveSheet.UsedRange
MaxRow = .Rows.Count
MaxCol = .Columns.Count
End With
MsgBox "最終行は" & MaxRow & "行、" & _
"最終列は" & MaxCol & "列です"
End Sub


「.End(xlDown)」や「.End(xlUp)」は手動操作での「Ctrl+↓」「Ctrl+↑」と同じです。
上記の注意事項に記載したとおりで、どの方法でもオートフィルタの抽出中は、
表示行の中で動作するので実際の最終行にならない場合があります。




Sub A列の5行目を基準最終行を取得()
MsgBox "最終行は : " & Range("A5").End(xlDown).Row
End Sub


Sub 最終セルを表示歯抜け不対応()
MsgBox ActiveSheet.Range("$A$1").End(xlDown).Address
End Sub

Sub 最終セルから探す()
MsgBox ActiveSheet.Range("$A$65536").End(xlUp).Address
End Sub


http://page.mixi.jp/view_page.pl?page_id=243272


★B列の最終行を知る関数


=OFFSET(B1,COUNTA(B:B)-1,0)
=INDEX($B:$B,COUNTA($B:$B),1)


★関数のみである列の最後の行の値を取り出すには、


INDEX関数とCOUNTA関数を組み合わせます。
例えばA1:I140までの表があり最終I140の値を抽出したい。
先ず、I:IでI列すべてを指定する。
表示したいセルに「=COUNTA(I:I)」を入れるとI列のデータ個数139がでる。
先頭行が空白なので実際はCOUNTA(I:I)+1で140個です。
次にそれを利用して


=INDEX(I:I,COUNTA(I:I)+1,1)


とすると
最終セルの値「71.25」を得る



★Sheet1のデータのA1〜G列最終行の内容をコピーして、

Sheet2の最終行の一行下に貼り付ける



Sub Test()
Dim EndRow As Long
' シート"Sheet1"の最終行を取得
EndRow = Worksheets("Sheet1").UsedRange.Rows.Count
' B2からG列最終行までをコピー
Worksheets("Sheet1").Range("a1:G" & EndRow).Copy
' シート"Sheet2"の最終行を取得
EndRow = Worksheets("Sheet2").UsedRange.Rows.Count
' 最終行の次の行、B列に貼り付け
Worksheets("Sheet2").Range("A" & EndRow + 1).PasteSpecial
End Sub