• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA ! 教えて下さいっ)

VBAで見積書の日付を作成する方法

このQ&Aのポイント
  • VBAを使用して見積書作成のための日付を入力する方法について質問したいです。
  • ユーザーフォームで契約日と締め日を選択し、それに基づいて締められた日や経過日数、更新月を計算して記録したいです。
  • 具体的なコードの一部も記載されていますが、エラーが発生してうまく動作しません。どこが間違っているか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

> 『Year』が『YEAR』の大文字へ変換となります。 推測ですが・・・   Dim YEAR As .... と記述しているところが、どこかにありませんか?もしくは   Const YEAR = .... など。「YEAR」という変数または定数を定義していないでしょうか。「YEAR」という言葉を検索(Ctrl+F)で探してみて下さい。 一度、コンパイル(メニューから「デバッグ」「VBAProjectのコンパイル」をしてみて下さい。

cocoruru1211
質問者

お礼

Cor_moriyanさーん(>_<) コードの中にはありませんでしたが、もしかしたらと思いuserfoam確認したらありました!!!コードの中はYEARの大文字ですが(大丈夫かしら?)やりたい事が出来ました! 有難うございました。 また、これからも分からない事が多々出てくるかと思いますが宜しくお願いします。 こんな私でも分かりやすい様にご教示いただき本当に感謝致します。

その他の回答 (4)

回答No.4

・・・おかしいですね?翌年の締め日にきちんとなりましたけど(^^; 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) どうでしょうか(^^;

cocoruru1211
質問者

お礼

すみません…たんだん高度になってきて… コピペでやってみたのですが、「引数が無効です」のエラー表示が出てしまいます。 黄色のエラーはここを指してきます。。。 Range("A4").Value = CDate(Year(Range("A4").Value) & "/" & _ Month(Range("A4").Value) & "/" & _ Range("A2").Value) またひとつ気になる事がありまして、上記のCDate(Year(Range("A4").Value) …の『Year』が『YEAR』の大文字へ変換となります。コレって何か問題がありますか。 何度修正しても『Year』⇒『YEAR』になってしまいます((+_+)) どうしたらいいのでしょうか。。。ホントに何度も申し訳ありません。 教えて下さい。

回答No.3

訂正。 誤)If Day(Range("A1").Value > Range("A2").Value Then 正)If Day(Range("A1").Value) > Range("A2").Value Then テストしたわけじゃないので、丸呑みしないで下さいね(^^;

cocoruru1211
質問者

お礼

早々のご対応ありがとうございます!! ただ、、、コード入力して試させていただくと、 締め日が来年(2012)を超えても 2011年の12月締めが転記されてしまいます。 また、私の説明不足かと思いますが30日の締め日は月末を導きだしたいのですが… 色々とコード変更を試みましたがこんがらがってしまって… ホント、すみません。 ・年度を越えても締め日が転記されるように。 ・30日(Type30)選択した場合は月末が転記されるように。 上記、2点お教えいただけませんでしょうか。

回答No.2

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 と言うものもあります。参考になるかな?

回答No.1

Range("A1").Valueの日付と Range("A2").Value を比較してのパターンが必要ですね。 IFだと長くなりすぎるので、配列に変えてみられてはどうでしょうか?

cocoruru1211
質問者

お礼

早々のご対応ありがとうございます。 IFからSelect Caseへ変えてスマートになりました。 ご指摘、ありがとうございます。これからも宜しくお願いします。

関連するQ&A