- ベストアンサー
マクロDate関数の使用中にエラーが発生する理由と修正方法
- マクロの処理中に起算日に異なる情報が入っている場合、エラーが発生します。これは、前段階のマクロ処理で選択範囲にゼロが含まれている場合に起こります。
- 前段階のマクロを修正するか、以下のマクロを修正することで問題を解決することができます。
- 修正するマクロは、シートごとに周期到達日を繰り返し算出します。起算日に年、月、日を追加して計算しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
下記のマクロ2などのようにして、場当たり的な対処をするのは簡単ですが、履歴なしになった時に7行がクリアされていないのがイマイチですね。 sub macro1() dim c worksheets("一覧").select for c = 3 to cells(2, columns.count).end(xltoleft).column with cells(6, c) .formular1c1 = "=MAX(R8C:R10000C)" if .value = 0 then .value = "履歴なし" cells(7, c).clearcontents else .value = .value ’参考 ’cells(7, c) = dateadd("d", cells(5, c), dateadd("m", cells(4, c), dateadd("yyyy",cells(3, c), cells(6, c)))) end if end with next c end sub sub macro2() dim c worksheets("一覧").select for c = 3 to cells(2, columns.count).end(xltoleft).column if isdate(cells(6, c)) then cells(7, c) = dateadd("d", cells(5, c), dateadd("m", cells(4, c), dateadd("yyyy",cells(3, c), cells(6, c)))) end if next c end sub #参考 言わずもがなですが、周期を加算する作業を最初のマクロの中に組み込んでしまうのが、一番簡単そうに見えます。でもわざわざ分けたいのでしたら、もちろんご随意に。
その他の回答 (1)
- tsubuyuki
- ベストアンサー率45% (699/1545)
成り替わりまして。 > 『.value = .value』の記述がありますがどんな意味があるのでしょうか? With に呼応していることに着目しましょう。 ある種基本ですから、わからなかったらWeb検索するなり本を手繰るなりして調べましょう。 ~引用~ with cells(6, c) .formular1c1 = "=MAX(R8C:R10000C)" if .value = 0 then .value = "履歴なし" cells(7, c).clearcontents else .value = .value end if end with ~引用終了~ With ◎◎ で「ここから◎◎に対する処理」だということを宣言し、 .○○ で「◎◎.○○」のオブジェクト部分「◎◎」を省略しています。 End With で「◎◎に対する処理はここまで」とVBAに教えてやります。 つまり、「.value = .value」は「ws.cells(6, c).value = ws.cells(6, c).value」の略。 If文と併せて、「ws.cells(6, c).Value=0」のElse、 ws.cells(6, c)が0(ゼロ)じゃない場合、ws.cells(6, c)にはws.cells(6, c).Valueを入力。 要するに、「今あるセル内容をそのまま入力してくれ」の意味です。 > やっぱり一つにまとめた方がマクロの記述が短くなっていいですよね。 これはケースバイケースです。 今回は「一連の流れに組み込んで支障がない」ので、 「1つにまとめたほうが走らせるマクロが1つで済む」と言うだけです。 ここに人力、目による確認・手による微調整が加わるのであれば、 2つに分けた方がもちろんやりやすいでしょう。 1つのマクロがグダグダ長くなるのを嫌って、わざわざ複数に分ける人もいます。 これも書き方の一つだと思います。 > 周期を加算する作業を最初のマクロの中に組み込んでしまうのが、一番簡単そうに見えます。 > でもわざわざ分けたいのでしたら、もちろんご随意に。 keithinさんがおっしゃるこの言葉は、上記の意味だと思いますよ。 自分で調べて、書いた文の意味をしっかり覚えるのは大事ですよ。 人に聞くのは簡単ですが、すべてコピー貼り付けではなかなか身になりませんから。 私も勉強の途上で、他さまの回答を見て感心させていただきながら わかる範囲で偉そうに回答もどきを書いている身分です。 なので、あまり大きいことは言えませんけどね^^;; 頑張って完成させてくださいませ。 質問記事・回答記事を読ませていただきながらコッソリ応援させていただきます^^;; あ、あともう一つ蛇足ですが。 Do While ws.Cells(2, c).Value <> "" で次のセルを参照して繰り返すのも一つの手段として間違いありませんが、 これだと「データはZ列まであるのに、“F列が空白だから”もういいや」と VBAが誤った判断をする可能性があります。 無論、100%空白は存在しないという確証があるならOKですが。 keithinさんがご提示くださっている for c = 3 to cells(2, columns.count).end(xltoleft).column 'エクセルの有効最大列数から左に向かって最初に出会った入力されているセルの列番号まで つまり、2行目の16,384列目(2003以前は256列目)から Ctrl+←ボタンで戻った時に止まるセルまで繰り返す、 とした方が漏れなく見に行けるので、私もオススメです。 処理件数が多くなると、Forの方が若干早いですし。 本文への回答にはなっていません^^; 長々と失礼しました。^^;;;
お礼
『for c = 3 to cells(2, columns.count).end(xltoleft).column』 上記の記述の意味が解説を見て分かりました。事細かく説明して下さりありがとうございました。あと、「.value = .value」も前の文章を理解して見てたら分かる内容ですね。それを質問してしまう自分が恥ずかしいです。 それと、応援ありがとうございました。
お礼
やっぱり一つにまとめた方がマクロの記述が短くなっていいですよね。 未来の日付算出も()を使えば1つにまとめる事が可能と分かって勉強になりました。あと質問なんですが、『.value = .value』の記述がありますがどんな意味があるのでしょうか?