
photo credit: Theen … Inmate Outlook via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAシリーズ、請求データから請求書を作成する方法をお伝えしています。
前回の記事はこちら。
マクロの初期処理として、貼り付け先のセル範囲をクリアする方法についてお伝えしました。
初期処理を作りましたので、今度は終了処理として、終了後に貼り付け先のシートとセルを常に表示するという親切な処理を入れていきます。
では、エクセルVBAでセル・シートをアクティブにするための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") & " 円" End Sub
以下に示す「請求データ」シートがありまして
これらの請求データから、納品日が2018年1月のデータのみを、隣の「請求書ひな形」シートに転記するというものです。
実行後に見たいところをアクティブにしてあげたい
ただ、実行後のエクセル画面が以下のようになっているときがあります。
不親切ですよね…?
というのも、マクロを実行したユーザーの気持ちとしては、ちゃんと転記がされたのか様子を見たくないですか?
なので、「請求書ひな形」の転記先のセルにカーソルを移動するという処理を親切処理として入れてあげましょう。
Selectメソッドでワークシートを選択する
まず、請求書ひな形シートを選択状態にしたいと思います。
ワークシートを選択するには、Selectメソッドを使います。
書き方はこちらです。
これでOKです。簡単です。
Activateメソッドでシートをアクティブにする
あと、全く同じ動作をするメソッドとして、Activateメソッドというのもあります。マクロ記録では登場することがありますね。
一般的にはどちらを使っても良いですが、シートが非表示のときにSelectメソッドを使うと以下のように「実行時エラー ‘1004’: ‘Select’ メソッドは失敗しました」というエラーが発生します。
Activateメソッドを使うとこのエラーは出て来ませんので、シートの表示/非表示をするようなマクロの場合は、Activateメソッドのほうが安全かも知れません。
セルを選択する
次に、カーソルを「A21」のセルを配置するようにしましょう。
セルを選択するには、こちらもSelectメソッドを使います。
一点、注意点としては、Rangeオブジェクトの選択をする前に、Worksheetオブジェクトの選択をしておかないとダメということです。
この順序を間違えると、以下のように「実行時エラー ‘1004’: Rangeクラスの Select メソッドは失敗しました」というエラーが出ます。
Activateメソッドでセルをアクティブにする
Rangeオブジェクトについても、Activateメソッドがあります。
こちらについては、SelectメソッドとActivateメソッドは明確に役割が異なります。
例えば、「A21」セルを含む範囲を選択した状態で、以下のメソッドを実行してみましょう。
wsTemplate.Range("A21").Activate
すると、以下のような状態になります。
つまり、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】データ一覧から請求書を自動で作る
- 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
- 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
- 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
- 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
- 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
- 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
- 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
- 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
- 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
- 【初心者向けエクセルVBA】For~Next文でセル範囲を一行ずつ移動させる
- 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
- 【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について