Top

hiroyuki.tank.support.site

簡単!マクロ講座

第22回〜一か月前のたねあかし〜

 日付や時間の処理というのは本当は難しいのです。
 いままでは変数の処理やエラー処理をやってきました。日付の操作が難しいのに,変数の処理やエラー処理まであってちょっと難しかったかもしれません。
 今回は「こんなやり方もある」という方法を説明します。
 いままで解説したコードの次のコードを紹介します
*********************************************************
Sub デートシリアル() 'DateSerialを使うと年の操作をしなくてよい
年月日 = Range("a1")
年 = Mid(年月日, 1, 2)
月 = Mid(年月日, 4, 2)
日 = Mid(年月日, 7, 2)
年月日2 = DateSerial(年, 月 - 1, 日)
Range("b1") = 年月日2
End Sub
#########################################################

 これを実行すると1月でも1999年でも正しい結果が出ます。
 ただし,1930年1月1日以前のデータだとエラーが出てしまいます。
 今までと違うところは,「年月日2 = DateSerial(年, 月 - 1, 日)」で「DateSerial」という関数を使っています。「DateSerial」の解説は省略しますが,これを使うとエラー処理が少なくて済むということが判明しましたね。

 次はもっと簡単なコードになっています。
*********************************************************
Sub デートアド() 'DateAddを使うと1929年以前もOK!
年月日 = Range("a1")
年月日2 = DateAdd("m", -1, 年月日)
Range("b1") = 年月日2
End Sub
#########################################################

 今までと大きく違うところは,「年月日2 = DateAdd("m", -1, 年月日)」です。
 「DateAdd」は日付にある数値を加えるという関数です。
 これを実行するとどんな日付を入れてもエラーは出ず,正しい結果が出ます。
 それにコードがうんと短くて単純になります。コードが短くなるということはそれだけ処理が早くなるというメリットがあります。また,バグ(プログラムの不具合)が見つけやすいというメリットもあります。

 このように二つの例を挙げただけでも,「こんなに簡単になるんだ」ということがおわかりいただけたかと思います。

 実をいうと今までやってきたものはエクセルの関数でもできるのです。
 「EDATE関数」というものがあります。セルB6に「=EDATE(A6,-1)」と入力されています。
 この結果は,A6のマイナス1か月後という意味で,結局一ヶ月前の日付が表示されます。
 「えっ!?答えが出てないよ」といわれる方が多いと思います。多分「#VALUE!」が表示されていると思います。
 これは通常エクセルをインストールしただけでは入っていない関数で,[ツール]-[アドイン]の中の「分析ツール」にチェックを入れると関数が使えるようになります。

 ここでいいたいのは,「関数でもできることが多い」ということです。
 マクロでプログラムを組んだら大概のことはできます。が,エラー処理が必要だったり,コードが冗長になったりしてきれいにできないことがあります。関数で一発回答ということも多いのです。
 しかし,関数を使うときには,今回紹介したように通常の状態で使えない関数があるわけですから,いま作っているものを誰が使うか,対象をある程度設定してどういう手法を使うかを考えて作る必要があります。自分だけが使うのなら自分さえわかればいいですが,人にも使ってもらおうとかいい仕事をしてもらおうと思えば考えておいた方がいいですね。
 せっかく自分で作ったものを人にも使ってもらおうと思ってもうまくいかないともったいないですから。

 今回のポイントです。
@「いろんなやり方があるはず」ということをいつも頭に置いておく。
Aマクロの中でも関数を使うとコードが簡単にできる。
Bエクセルの関数を活用する。
C誰が使うか,どういう手法を採るかを考える。

| hiroyuki.tank.support.site.Top | このページのTop | マクロ講座目次 | 前回 | 次回 |