- ベストアンサー
VBAで見積書の日付を作成する方法
- VBAを使用して見積書作成のための日付を入力する方法について質問したいです。
- ユーザーフォームで契約日と締め日を選択し、それに基づいて締められた日や経過日数、更新月を計算して記録したいです。
- 具体的なコードの一部も記載されていますが、エラーが発生してうまく動作しません。どこが間違っているか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 『Year』が『YEAR』の大文字へ変換となります。 推測ですが・・・ Dim YEAR As .... と記述しているところが、どこかにありませんか?もしくは Const YEAR = .... など。「YEAR」という変数または定数を定義していないでしょうか。「YEAR」という言葉を検索(Ctrl+F)で探してみて下さい。 一度、コンパイル(メニューから「デバッグ」「VBAProjectのコンパイル」をしてみて下さい。
その他の回答 (4)
- Cor_moriyan
- ベストアンサー率41% (92/221)
・・・おかしいですね?翌年の締め日にきちんとなりましたけど(^^; A2セルの値を30のままにせず「A1の年月の月末日」に置き換えれば、末日対応も上手くいくと思います。 末日の求め方は、A1セルの年月の1日(2011/12/10なら2011/12/1)にDayAdd関数で1ヶ月後(2012/1/1)を求め、そこから -1 すると前日(2011/12/31)が求められます。Day関数を使ってあげれば、31 をA2セルに入れられます。 'A2の値をA1の末日に置きかえる(A1の翌月1日から-1した日) If Range("A2").Value = 30 Then Range("A2").Value = Day(DateAdd("m", 1, CDate(Year(Range("A1").Value) & "/" & _ Month(Range("A1").Value) & "/1")) - 1) End If '締め日を求める If Day(Range("A1").Value) > Range("A2").Value Then Range("A4").Value = DateAdd("m", 1, Range("A1").Value) Else Range("A4").Value = Range("A1").Value End If Range("A4").Value = CDate(Year(Range("A4").Value) & "/" & _ Month(Range("A4").Value) & "/" & _ Range("A2").Value) どうでしょうか(^^;
お礼
すみません…たんだん高度になってきて… コピペでやってみたのですが、「引数が無効です」のエラー表示が出てしまいます。 黄色のエラーはここを指してきます。。。 Range("A4").Value = CDate(Year(Range("A4").Value) & "/" & _ Month(Range("A4").Value) & "/" & _ Range("A2").Value) またひとつ気になる事がありまして、上記のCDate(Year(Range("A4").Value) …の『Year』が『YEAR』の大文字へ変換となります。コレって何か問題がありますか。 何度修正しても『Year』⇒『YEAR』になってしまいます((+_+)) どうしたらいいのでしょうか。。。ホントに何度も申し訳ありません。 教えて下さい。
- Cor_moriyan
- ベストアンサー率41% (92/221)
訂正。 誤)If Day(Range("A1").Value > Range("A2").Value Then 正)If Day(Range("A1").Value) > Range("A2").Value Then テストしたわけじゃないので、丸呑みしないで下さいね(^^;
お礼
早々のご対応ありがとうございます!! ただ、、、コード入力して試させていただくと、 締め日が来年(2012)を超えても 2011年の12月締めが転記されてしまいます。 また、私の説明不足かと思いますが30日の締め日は月末を導きだしたいのですが… 色々とコード変更を試みましたがこんがらがってしまって… ホント、すみません。 ・年度を越えても締め日が転記されるように。 ・30日(Type30)選択した場合は月末が転記されるように。 上記、2点お教えいただけませんでしょうか。
- Cor_moriyan
- ベストアンサー率41% (92/221)
1) 契約日の「日」を取得し、締め日(10,20,30)と比較します。 2) 契約日の日が締め日を超えていれば、契約日の翌月の日付を算出します。 超えていなければ、契約日をそのまま使用します。 If Day(Range("A1").Value > Range("A2").Value Then Range("A4").Value = DayAdd("m",1,Range("A1").Value) Else Range("A4").Value = Range("A1").Value End If 3) 算出した日付の「年・月」と締め日を合わせた年月日を、算出します。 Range("A4").Value = CDate(Year(Range("A4").Value) & "/" & Month(Range("A4").Value) & "/" & Range("A2").Value) 上記でいかがでしょう? ちなみに。If Type10.~ は、Select Case で記述した方が見易いかも(^^; Select Case True Case Type10.Value Range("A2").Value = "10" Case Type20.Value Range("A2").Value = "20" Case Type30.Value Range("A2").Value = "30" Case Else MsgBox "日を入力して下さい。 例 10.20.30 日" Exit Sub End Select あと、日付入力の例が間違ってますよ~ 「例 yyyy/dd/mm」⇒「例 yyyy/mm/dd」 日付関数には DateDiff と言うものもあります。参考になるかな?
- siitakekonbu
- ベストアンサー率7% (1/13)
Range("A1").Valueの日付と Range("A2").Value を比較してのパターンが必要ですね。 IFだと長くなりすぎるので、配列に変えてみられてはどうでしょうか?
お礼
早々のご対応ありがとうございます。 IFからSelect Caseへ変えてスマートになりました。 ご指摘、ありがとうございます。これからも宜しくお願いします。
お礼
Cor_moriyanさーん(>_<) コードの中にはありませんでしたが、もしかしたらと思いuserfoam確認したらありました!!!コードの中はYEARの大文字ですが(大丈夫かしら?)やりたい事が出来ました! 有難うございました。 また、これからも分からない事が多々出てくるかと思いますが宜しくお願いします。 こんな私でも分かりやすい様にご教示いただき本当に感謝致します。