【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について

cell

photo credit: Theen … Inmate Outlook via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者向けエクセルVBAシリーズ、請求データから請求書を作成する方法をお伝えしています。

前回の記事はこちら。

【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
初心者向けエクセルVBAシリーズとして、請求書を作成するマクロの作り方をお伝えしています。今回は、エクセルVBAでセル範囲の値をクリアするClearContentsメソッドとClearメソッドの使い方です。

マクロの初期処理として、貼り付け先のセル範囲をクリアする方法についてお伝えしました。

初期処理を作りましたので、今度は終了処理として、終了後に貼り付け先のシートとセルを常に表示するという親切な処理を入れていきます。

では、エクセルVBAでセル・シートをアクティブにするためのSelectメソッドとActivateメソッドです。

なお、この記事は以下のYouTube動画と連動していますので、合わせてご覧いただければと思います。

行ってみましょう!

スポンサーリンク

前回のおさらいと課題

前回作成したプロシージャはこちら。

Sub 請求書作成()

wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示
wsTemplate.Range("A21:C50").ClearContents

Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得

Dim i As Long, k As Long
k = 21
For i = 2 To rowsData
    Dim deliDate As Date
    deliDate = wsData.Cells(i, 1).Value
    If Year(deliDate) = 2018 And Month(deliDate) = 1 Then
        wsData.Range(wsData.Cells(i, 2), wsData.Cells(i, 4)).Copy wsTemplate.Cells(k, 1)
        k = k + 1
    End If
Next i

wsTemplate.Rows(k & ":50").Hidden = True  'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"
End Sub

以下に示す「請求データ」シートがありまして

請求データに納品日の列が追加された

これらの請求データから、納品日が2018年1月のデータのみを、隣の「請求書ひな形」シートに転記するというものです。

実行後に見たいところをアクティブにしてあげたい

ただ、実行後のエクセル画面が以下のようになっているときがあります。

エクセルVBAのマクロを実行後の画面

不親切ですよね…?

というのも、マクロを実行したユーザーの気持ちとしては、ちゃんと転記がされたのか様子を見たくないですか?

なので、「請求書ひな形」の転記先のセルにカーソルを移動するという処理を親切処理として入れてあげましょう。

Selectメソッドでワークシートを選択する

まず、請求書ひな形シートを選択状態にしたいと思います。

ワークシートを選択するには、Selectメソッドを使います。

書き方はこちらです。

Worksheetオブジェクト.Select

これでOKです。簡単です。

Activateメソッドでシートをアクティブにする

あと、全く同じ動作をするメソッドとして、Activateメソッドというのもあります。マクロ記録では登場することがありますね。

Worksheetオブジェクト.Activate

一般的にはどちらを使っても良いですが、シートが非表示のときにSelectメソッドを使うと以下のように「実行時エラー ‘1004’: ‘Select’ メソッドは失敗しました」というエラーが発生します。

WorksheetオブジェクトのSelectメソッドが失敗したときのエラー

Activateメソッドを使うとこのエラーは出て来ませんので、シートの表示/非表示をするようなマクロの場合は、Activateメソッドのほうが安全かも知れません。

セルを選択する

Selectメソッドでセルを選択する

次に、カーソルを「A21」のセルを配置するようにしましょう。

セルを選択するには、こちらもSelectメソッドを使います。

Rangeオブジェクト.Select

一点、注意点としては、Rangeオブジェクトの選択をする前に、Worksheetオブジェクトの選択をしておかないとダメということです。

この順序を間違えると、以下のように「実行時エラー ‘1004’: Rangeクラスの Select メソッドは失敗しました」というエラーが出ます。

RangeオブジェクトのSelectメソッドが失敗したときのエラー

Activateメソッドでセルをアクティブにする

Rangeオブジェクトについても、Activateメソッドがあります。

Rangeオブジェクト.Activate

こちらについては、SelectメソッドとActivateメソッドは明確に役割が異なります。

例えば、「A21」セルを含む範囲を選択した状態で、以下のメソッドを実行してみましょう。

wsTemplate.Range("A21").Activate

すると、以下のような状態になります。

エクセルVBAで選択したセル範囲のいずれかのセルをアクティブに

つまり、Rangeオブジェクトの場合

  • Selectメソッドの対象はセル範囲
  • Activateメソッドの対象は単一セル
  • Selectメソッドで範囲選択している中のセルをActivateメソッドでアクティブにできる

という動きになります。

なお、Selectメソッドで範囲選択している範囲外のセルをActivateすると、選択状態は解除となります。

なかなか深いですね。

まとめ

以上、エクセルVBAでワークシート・セルを選択する方法について色々とお伝えしました。

どちらのオブジェクトについても、SelectメソッドとActivateメソッドが用意されています。基本はSelectメソッドで良いと思いますが、Activateメソッドのことも覚えておいてあげてください。

まとめのコードはこちらです。

Sub 請求書作成()

'初期処理
wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示
wsTemplate.Range("A21:C50").ClearContents

'メイン処理
Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得

Dim i As Long, k As Long
k = 21
For i = 2 To rowsData
    Dim deliDate As Date
    deliDate = wsData.Cells(i, 1).Value
    If Year(deliDate) = 2018 And Month(deliDate) = 1 Then
        wsData.Range(wsData.Cells(i, 2), wsData.Cells(i, 4)).Copy wsTemplate.Cells(k, 1)
        k = k + 1
    End If
Next i

'終了処理
wsTemplate.Rows(k & ":50").Hidden = True  'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"

wsTemplate.Select
wsTemplate.Range("A21").Select

End Sub

次回は、入力ダイアログを使って「年月」を指定する方法についてお伝えします。

【初心者向けエクセルVBA】入力ダイアログを表示するInputBoxメソッドの使い方
初心者向けエクセルVBAで請求データから請求書を作成するシリーズです。今回はInputBoxメソッドを使った入力ダイアログの使い方です。引数や引数名について、またInputBox関数との違いについても解説します。

どうぞお楽しみに!

連載目次:データ一覧から請求書を自動で作る

お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。
  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
  3. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  4. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  5. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  6. 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
  7. 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
  8. 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
  9. 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
  10. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  11. 【初心者向けエクセルVBA】For~Next文でセル範囲を一行ずつ移動させる
  12. 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
  13. 【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について
  14. 【初心者向けエクセルVBA】入力ダイアログを表示するInputBoxメソッドの使い方
  15. 【初心者向けエクセルVBA】日付データから月末日と翌月末日を自動算出する
  16. 【初心者向けエクセルVBA】ワークシートをコピーする方法とそのシート名を変更する方法
  17. 【初心者向けエクセルVBA】オブジェクトを変数にセットして取り扱う方法
  18. 【初心者向けエクセルVBA】Openメソッドで新たなブックを開く方法
  19. 【初心者向けエクセルVBA】現在マクロを書いているブックのフォルダパスを取得する
  20. 【初心者向けエクセルVBA】開いたブックとそのワークシートをオブジェクト変数にセットする
  21. 【初心者向けエクセルVBA】ワークブックを別名で保存して閉じる方法
  22. 【初心者向けエクセルVBA】取引先別に請求書を作成するマクロを作る
タイトルとURLをコピーしました