Top

hiroyuki.tank.support.site

簡単!マクロ講座

第20回〜一か月前の手順〜

 手順を書いてみましたか?答え合わせをしましょう。
 自分が書いたものと違う!という方も心配しないでください。人によって少しくらい違うものですし,「これが絶対だ」というものも決まっていません。

【手順】
1.セルA1をみる
2.セルA1の値を取得
3.取得した値を年と月と日に分割
4.月から1を減算する
5.月を一か月前にした後で年と月と日を結合させる
6.セルB1に入れる

 それでは手順が書けたら今度はコードを書いてみましょう。
*********************************************************
1 Sub 一か月前()
2 年月日 = Range("a1")
3 年 = Mid(年月日, 1, 2)
4 月 = Mid(年月日, 4, 2)
5 日 = Mid(年月日, 7, 2)
6 年2 = 年 + 2000
7 月2 = 月 - 1
8 Range("b1") = (年2 & "/" & 月2 & "/" & 日)
9 End Sub
#########################################################

【解説】
1-「一か月前」というプログラム名
2-「年月日」という変数にセルA1の値を入れる
3-「年」という変数に○○をいれる
 ここはちょっと今までにない形ですね。
 エクセルの関数をよく使う方はおわかりでしょうが,MID関数という関数があります。
 3行目で説明すると,「年月日」の1番目から2つをとるということになります。
 変数「年月日」の中には8/13のエクセルでの値(02/08/13)が入っていて,その値の1番目から2つをとって変数「年」に入れろ!と命令しているわけです。
4-「月」という変数に「年月日」の4番目から2つをいれる
5-「日」という変数に「年月日」の7番目から2つをいれる
7-「月2」という変数に「月」からの1減算した数をいれる
8-セルB1に今まで計算した値を合わせて入れる
9-終わり

 手順どおりですね。
 6行目を除くと手順どおりに書いていますが,ただ手順どおりではうまくいきません。一筋縄ではいかないのです。(そのために6行目の処理をしています)
 これ以降の説明はちょっと難しいかもしれませんが,一筋縄ではいかないということがわかっていただけたらいいので読み流してください。

 どこが一筋縄ではいかないかですが,「年月日」という変数の中になにが入っているかというと「02/08/13」という値が入っているのです。
 3行目の変数「年」は「02」という値が入ります。
 エクセルでセルに「02/08/13」と入力すると「8月13日」と表示されるのでこれでいいということになりますが,マクロでセルに「02/08/13」という値を入れようとすると,日/年/月という順番で入ってしまうのです。ということは「2013/02/08」とわけのわからない日付になってしまうのです。
 これは西暦の年を2桁で処理するか4桁で処理するかという問題に起因します。人の目で見たところわかりませんから,通常は意識することはありませんが,マクロで値を操作しようとするとこのような問題点が起こります。こういった問題点を解決するためにいろいろなエラー処理という処理をすることがあります。エラー処理については次回解説します。

 これをなんとかするために6行目で工夫をしています。
6-変数「年2」に変数「年」に「2000」を加えた値をいれる
 これにより,変数「年2」は2000+02で2002となり,いまからセルB1に入れようとする値は「2002/07/13」となるのです。
 これで無事一か月前がセルB1に表示されます。

【ポイント】
 ここでおさらいポイントです。次の事項をどれもおろそかにしないこと!
1.状況の分析(どうなっているか)
2.問題点の洗い出し(目的のためにはなにが問題となるか)
3.解決策のための考察(どうしたら問題点を解決できるか)
4.手順(解決のためにはどういった手順(手段)をとるか)
5.実行(実現のための行動)

【追記-WindowsMeやXPをお使いの方へ】
 実は6行目の処理も弱点があったのです。興味がない方はとばしてもOKです。
 前回分を公開した後に「添付のマクロがうまく動かない」という指摘があり,調べてみるとその方のOSはWindowsMeだったのです。
 ご存知のとおりWindows95や98はその名のとおり1995年,1998年に発売されています。ところが,WindowsMeやXPは2000年以降に発売されています。
 この2000年を境にOSの日付を管理する方法に若干の変更があったようです。2000年より前に発売されたOSではエクセルで日付を処理する際に特に指定をしない限りは西暦を2桁で処理し,2000年以降に発売されたOSでは4桁で処理しているようです。(全ての場合がこうなるとは限りませんが,少なくともエクセルでの操作上はこうなります。)
 このことにより,今回添付のマクロをWindowsMe上で動作しているエクセルで実行すると,「型が一致していません。」というエラーになります。これは西暦を4桁で管理しているため,3行目の年 = Mid(年月日, 1, 2)というところで年月日は「2002/08/13」となっているにもかかわらず最初の2文字(20)を年という変数に入れようとするため,それ以降の月,日にも影響を及ぼしエラーとなるわけです。
 この話をお話しすると長くなりますのでこの辺で終わりますが,興味のある方はWindowsのヘルプで「日付」というキーワードで検索してみてください。
 WindowsMeでもちゃんと動くようにするためには次のようにしたらよいのではないかという情報をいただきましたので紹介します。

***********************************************
 3-6行目を次の4行に書き換える
3 年月日=Format(Range("A1"),"yyyy/mm/dd")
4 年2=Mid(年月日,1,4)
5 月=Mid(年月日,6,2)
6 日=Mid(年月日,9,2)
###############################################

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