最後のシートを取得
「最後(右端)のシート」を確実に扱う基本から、可視シートだけを対象にする安全版、他ブック対応、実務で役立つ例題までを初心者向けに丁寧にまとめます。
基本:右端(最後)のワークシートを取得する
Sub GetLastWorksheet_Basic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
MsgBox "最後のワークシート: " & ws.Name
End Sub
VB- ポイント: 最後のシートは「シート枚数のインデックス」で取得します。
Worksheets.Countで枚数を取り、Worksheets(その数)が右端のワークシートです。 - WorksheetsとSheets: グラフシートを含めないなら
Worksheetsが安全。Sheetsは図表シートも含むため用途で使い分けます。
安全テンプレート:例外なく「最後のワークシート」を返す
Function GetLastWorksheet(Optional wb As Workbook) As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
If wb.Worksheets.Count = 0 Then
Set GetLastWorksheet = Nothing
Else
Set GetLastWorksheet = wb.Worksheets(wb.Worksheets.Count)
End If
End Function
Sub Use_GetLastWorksheet()
Dim lastWs As Worksheet
Set lastWs = GetLastWorksheet()
If lastWs Is Nothing Then
MsgBox "ワークシートがありません。"
Else
MsgBox "右端シート: " & lastWs.Name
End If
End Sub
VB- ポイント: 実務では「どのブックを対象にするか」を明示するのが安定。
Optional wbで他ブックにも対応できます。
可視シートだけを対象にする(非表示を除外)
Function GetLastVisibleSheet(Optional wb As Workbook) As Worksheet
Dim i As Long
If wb Is Nothing Then Set wb = ThisWorkbook
For i = wb.Sheets.Count To 1 Step -1
If wb.Sheets(i).Visible = xlSheetVisible Then
Set GetLastVisibleSheet = wb.Sheets(i)
Exit Function
End If
Next
Set GetLastVisibleSheet = Nothing
End Function
Sub Use_GetLastVisibleSheet()
Dim lastVisible As Worksheet
Set lastVisible = GetLastVisibleSheet()
If lastVisible Is Nothing Then
MsgBox "可視のシートが見つかりません。"
Else
MsgBox "右端の可視シート: " & lastVisible.Name
End If
End Sub
VB- ポイント: 最後のシートが非表示(Hidden/VeryHidden)の場合に備え、後ろから見て最初に「Visible」なものを返すロジックが安全です。
他ブックの最後のシートを取得する
Sub GetLastWorksheet_OtherWorkbook()
Dim wb As Workbook, ws As Worksheet
Set wb = Workbooks("月次集計.xlsm") '開いているブック名を指定
Set ws = wb.Worksheets(wb.Worksheets.Count)
MsgBox "他ブックの右端: " & ws.Name
End Sub
VB- ポイント: 「どのブックの右端か」を明示できれば同じ考え方で取得可能です。右端へ追加したい場合は
Worksheets.Add After:=wb.Worksheets(wb.Worksheets.Count)が定番です。
例題で練習:右端を使う定番タスク
例題1:右端のシートに日付を記録
Sub LogDateToLastSheet()
Dim ws As Worksheet
Set ws = GetLastWorksheet()
ws.Range("A1").Value = "更新日"
ws.Range("B1").Value = Date
MsgBox "右端シートに日付を記録しました。"
End Sub
VB- ポイント: 右端=最新追加の出力シート、といった運用に相性が良いです。
例題2:右端に新規シートを追加してアクティブ化
Sub AddAfterLastAndActivate()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "出力_" & Format(Now, "hhmmss")
ws.Activate
End Sub
VB- ポイント: 末尾に追加したいときは
After:=Worksheets(Worksheets.Count)を使うのが最短です。
例題3:右端の可視シートを選択(非表示ならスキップ)
Sub SelectLastVisibleSheet()
Dim ws As Worksheet
Set ws = GetLastVisibleSheet()
If Not ws Is Nothing Then ws.Select
End Sub
VB- ポイント: 可視チェックを挟むと、非表示が右端でも確実に選択できます。
実務の落とし穴と対策
- 対象誤り: ThisWorkbookとActiveWorkbookの混同で別ブックを触ってしまう事故が多い。常にどちらを使うかを意図で統一しましょう。
- 非表示シート: 右端が非表示だと「選択」や「画面操作」が失敗します。可視シート限定の取得関数を用意しておくと安心です。
- SheetsとWorksheets: グラフシートを含める必要がないなら
Worksheetsを使うと混乱が減ります。末尾への挿入・取得は枚数インデックスで行うのが基本です。
