Top

hiroyuki.tank.support.site

簡単!マクロ講座

第21回〜一か月前のエラー処理〜

 前回は「難しい!」とご指摘をいただきました。
 確かに変数有り,マクロの中に関数有り,日付の操作有りと一気に盛りだくさんになったようで難しくなっています。いまは難しいかもしれませんが,少したって見直してみると「あっこのことだったのか!」となる日が来ます(はず)。継続は力なりです。引き続きのご愛読をお願いします。
 今回もちょっと難しい内容が続きます。

 前回,セルA1に日付を入れてマクロを実行すると1か月前の日付がセルB1に入るようになりました。
 それではセルA1に1月1日を入れてマクロを実行するとどうなるでしょう?やってみてください。
 「2002/0/01」という変なものが入ってしまいました。
 これは月から1減算しているから1-1=0となってしまったのです。
 これを防ぐためにはどうしたらよいでしょうか。

*********************************************************
1 Sub 一か月前2()
2 年月日 = Range("a1")
3 年 = Mid(年月日, 1, 2)
4 月 = Mid(年月日, 4, 2)
5 日 = Mid(年月日, 7, 2)
6 年2 = 年 + 2000
7 月2 = 月 - 1
8
9 If 月 = 1 Then
10 月2 = 12
11 年2 = 年2 - 1
12 End If
13
14 Range("b1") = (年2 & "/" & 月2 & "/" & 日)
15 End Sub
#########################################################

 9-12行目に注目してください。
9-もし月が1だったら--これは1月だったときのことです。
10-月2に12を入れる--月が1だったら12月にするという意味です。これにより7行目で処理したときの「月2 = 月 - 1」の結果の値「0」は上書きされます。
11-年2の値を1減算する--月2を12月にしたということは年2は前の年にならなければなりませんから1を引きます。
 このIF構文をいれることにより,1月にも対応できます。こういったいろいろなパターン(今回の例で行くと1月〜12月)に対応できるように,エラーが出ないようにすることを「エラー処理」などと呼んだりします。

 次に,1999年8月27日をセルA1に入れた場合はどうなるでしょう?
 「2099/7/27」という結果が出てしまいます。
 これは年の操作のところで2000を加え,「99+2000」の答えとしてこのような結果が出てしまいます。ここでまたエラー処理が必要になってきます。

上の13行目からのコードです。
*********************************************************
13
14 If 年2 > 2050 Then
15 年2 = 年 + 1900
16 If 月 = 1 Then
17 月2 = 12
18 年2 = 年2 - 1
19 End If
20 End If
21 Range("b1") = (年2 & "/" & 月2 & "/" & 日)
22 End Sub
#########################################################

14-もし年2が2050より大きかったら--2000を加えた数が2050より大きいということは,元の年は50より大きいということになりますから,2000年代ではないということになり,実質1900年代ということになります。(厳密にいうと違いますけどね)
15-年2に年に1900を加えたものを入れる--これで1900年代にしている。
16〜19行目は月が12月の時,1月にするための処理。

 このようにエラー処理も大変なのです。厳密にいうと1951年以前もうまくいきませんし,1929年以前では,これは前回説明した西暦の処理の問題で,「型が一致しません」といったエラーが出てしまいます。
 今はマクロの中だけのエラー処理を説明しましたが,実際にはエクセルの「入力規則」をつかったりするとセルに入力できる範囲を制限できるため,マクロでエラー処理をする必要がなくなったりします。
 エクセルの機能を使いながらも,どこまでマクロでエラー処理をするかというのも作り手の考え方が出るところです。

 実をいうと日付や時間の処理というのは本当に難しいのです。
 でも,基本的なことだけなら簡単ですし,エラー処理についてもいろいろな例がありますから解説のねたには事欠きません。「いろいろあるんだ」くらいな気楽な気持ちでお読み下さい。(おわりにいってすみません。実は次回もっとがっくりくることが!?)

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