みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAシリーズとして、請求データから請求書を作成するマクロの作り方についてお伝えしています。
前回の記事はこちら。
エクセルVBAで条件分岐処理を行うIf文の使い方についてお伝えしました。
実は、このマクロ。実行方法によっては、良くない結果になってしまうことがありまして、それを解消していきます。
エクセルVBAでセル範囲の値をクリアするClearContentsメソッドとClearメソッドの使い方です。
では、行ってみましょう!
前回のおさらいと課題
前回作成したプロシージャはこちらです。
Sub 請求書作成() wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示 Dim rowsData As Long '行数カウント用の変数 rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得 Dim i As Long, j 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 For j = 1 To 3 wsTemplate.Cells(k, j).Value = wsData.Cells(i, j + 1).Value Next j 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
だいぶ立派になってきましたね…!
でも、実はこのマクロ、使い方によっては問題が出てしまいます。
以前の実行によるデータが残ってしまう問題
例えば、実行したときに、以下のような現象が起きてしまうときがあります。
転記した請求データの価格の実際の合計と、ひな形の計算式として計算されている小計の値が異なってしまう時があるのです。
実は、以前の実行した時のデータが、Hiddenプロパティで隠されているだけで残ってしまっているのです。
この問題を解消する必要があります。
ClearContentsメソッドでセル範囲の値をクリアする
この問題を解決するには、転記の処理を行う前に、以前のデータが残っている可能性があるセル範囲の値のクリアをする処理を入れるという手を使います。
セル範囲の値のクリアするには、ClearContentsメソッドを使うことができます。
書式は以下の通りです。
今回の場合は、転記処理の前に以下のようなステートメントを入れておけばOKです。
wsTemplate.Range("A21:C50").ClearContents
ClearメソッドとClearContentsメソッドの違い
同様に、セル範囲をクリアするメソッドとして、Clearメソッドというものがあります。
書式は以下の通りです。
こちらも、セル範囲のクリアをするメソッドなのですが、先程のClearContentsメソッドと何が違うのでしょうか?
試しに、以下のステートメントを冒頭に挿入して実行してみましょうか。
wsTemplate.Range("A21:C50").Clear
すると、以下のようになります。
わかりますか?
Clearメソッドの対象となった範囲のフォントが周りと別のものになりましたよね?
そうなんです、Clearメソッドはセルの値だけでなく書式も全てクリアします。
一方で、ClearContentsメソッドはセルの値のみをクリアします。
だから、今回は書式はそのままでしておきたいのでClearContentsメソッドを使うほうが良いですよね。
この違い、ぜひ覚えておいてくださいね。
まとめ
以上、エクセルVBAでセル範囲のクリアをする方法についてお伝えしました。
ソースコードのまとめはこちらです。
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, j 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 For j = 1 To 3 wsTemplate.Cells(k, j).Value = wsData.Cells(i, j + 1).Value Next j 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
ClearContentsメソッドとClearメソッドでは、クリアする対象が異なるという点もぜひ押さえて置きたいですね。
次回は、マクロ実行後の親切処理として、指定のシートやセルをアクティブにする方法についてお伝えします。
どうぞお楽しみに!
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
- 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
- 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
- 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
- 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
- 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
- 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
- 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
- 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
- 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
- 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド