• 締切済み

ExcelでVBAを使って日付を自動表示したい

初めまして。エクセル初心者です。エクセル2000で日付を自動で表示したいのですが、どのようにVBAで作成すればよいか教えて下さい。 まず、シート1のセルE2に西暦・セルG2に月を入力するとセルE4   にG2の月・P4にG2の次の月が自動で表示されます。 次に、セルE5からセルO5までにE4の月の21日から31日、    セルE6からセルO6までにE4の月の21日から31日までの    曜日を自動で表示したい。    セルP5からセルAI5までにP4の月の1日から20日、    セルP6からセルAI6までにP4の月の1日から20日までの    曜日を自動で表示したい。 最後に、土日の列のセル5から25までを灰色にする。 セルE4の月によって30日まででセルO5何もなし、2月なら28日で29日から31日は表示しないようにしたいのですが。 何かいいマクロの組み方を教えて下さい。よろしくお願いします。     

みんなの回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

[回答番号:No.2] の DOUGLAS_ です。  先ず、 >E4とP4はセルの統合をしたいのですがマクロを実行すると統合が解除されちゃうんですね。 >セルの枠の線の消えちゃったので、もしよろしければそれもマクロでできるのですか?  大変失礼いたしました。  <(_ _)>  この点につきましては、Macro1 も Macro2 も Range("E4:AI25").Clear のところを Range("E4:AI25").ClearContents に変えてください。 -------------------------------------------------------------------  次に >マクロ1と2は一緒にできないものなのですか? についてですが、Macro1 と Macro2 は細かいところでの操作は異なりますが、結果的にはお望みのことができるようになっているはずです。  「一緒にできない」ものかどうかというのが、どの点を指していらっしゃるのか判然としませんが、VBE(Visual Basic Editor) で、適当な変数を ウォッチ式 に追加しておいて、[F8] キーを押下しながら、ウォッチ ウィンドウ やエクセルのワークシートも並べておいて並行して見ながら、ステップ イン デバッグ されたら、何がどうなっているのか、よくお分かりになると存じます。  例えば、 >セルE4にG2の月・P4にG2の次の月が自動で表示 に関しては、別にマクロに書かなくても、当該セルに適当な関数式でも入れておけばよいのですが、その点につきましては、 ・Macro1 では、当該セルの書式設定で "[DBNum3]0月" にしてから セルG2 の値を代入した変数 myMonth または、それ +1 を当該セルに入れております。 ・Macro2 では、直接 セルG2 の値に "月" を付け、それを全角にして、当該セルに入力しています。 というように、細かいところで、こういうヤリカタもあるかな、という例をお示しいたしました。  それぞれのマクロを1行ずつご覧になって、イイトコ取りしていただければ結構かと存じます。

  • kztk
  • ベストアンサー率53% (59/110)
回答No.3

マクロなしでできることとその限界が分かった上で、どうしてもマクロを使わないと実現できない場合にのみマクロを使うようにしたほうが良いと思います。今回質問された機能はあまりマクロ向きだとは思いません。 マクロを使わないならこんな感じになります。 >まず、シート1のセルE2に西暦・セルG2に月を入力するとセルE4にG2の月・ >P4にG2の次の月が自動で表示されます。 E4の式: =G2 P4の式: =IF(G2=12,1,G2+1) >セルE5からセルO5までにE4の月の21日から31日、 E5の式: =DATE($E$2,$G$2,21) F5の式: =DATE($E$2,$G$2,22)   :(以下L5までは3番目の引数を23,24・・・としていくだけ) M5の式: =IF(MONTH(DATE($E$2,$G$2,29))=$G$2,DATE($E$2,$G$2,29),"") N5の式: =IF(MONTH(DATE($E$2,$G$2,30))=$G$2,DATE($E$2,$G$2,30),"") O5の式: =IF(MONTH(DATE($E$2,$G$2,31))=$G$2,DATE($E$2,$G$2,31),"") セルの書式設定は「ユーザー定義」で"d"とすることで日付だけが表示されます。 >セルE6からセルO6までにE4の月の21日から31日までの曜日 E6の式: =E5  : O6の式: =O5 セルの書式設定は「ユーザー定義」で"aaa"とすることで曜日だけが表示されます。 >セルP5からセルAI5までにP4の月の1日から20日、 P5の式: =DATE($E$2,$G$2+1,1)   : AI5の式:=DATE($E$2,$G$2+1,20) セルの書式設定は「ユーザー定義」で"d"とすることで日付だけが表示されます。 >セルP6からセルAI6までにP4の月の1日から20日までの曜日 P6の式: =P5  : AI6の式: =AI5 セルの書式設定は「ユーザー定義」で"aaa"とすることで曜日だけが表示されます。 >最後に、土日の列のセル5から25までを灰色にする。 E5:AI25の範囲を選択して「書式」⇒「条件付き書式」を選び、 「数式が」「=OR(WEEKDAY(E$5)=1, WEEKDAY(E$5,1)=7)」 の書式を灰色の塗りつぶしにする。

tokiwa7219
質問者

お礼

上手くできました。ありがとうございました。またよろしくお願いします。

tokiwa7219
質問者

補足

ありがとうございます。この方法でも一度やってみます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>どのようにVBAで作成すればよいか教えて下さい。  細かい記述や操作の方法がいろいろあって面白い教材かとは存じますが、[ツール(T)] - [マクロ(M)] - [新しいマクロの記録(R)] でお書きの通りの操作をしてみられたら、ある程度のコードが得られますので、それを普遍性のある内容に書き換えられたらよいかと存じます。  ただ、セルの選択は矢印キーではなくてマウスでクリックか ジャンプメニュー から行なうのがよいですね。  とりあえず、こんな感じでできるかなというような例ですが。。。 Sub Macro1()  Application.ScreenUpdating = False  Dim myYear As Integer  Dim myMonth As Byte  Dim myDay As Byte  Range("E4:AI25").Clear  Range("E5:AI25").Interior.ColorIndex = xlNone  Range("E4", "P4").NumberFormatLocal = "[DBNum3]0月"  Range("E5:AI5").NumberFormatLocal = "D"  Range("E6:AI6").NumberFormatLocal = "AAA"  myYear = Range("E2").Value  myMonth = Range("G2").Value  Range("E4") = myMonth  Range("P4") = myMonth + 1  For myDay = 21 To 31   If Month(DateSerial(myYear, myMonth, myDay)) <> myMonth Then Exit For   Cells(5, myDay - 16).Resize(2) = DateSerial(myYear, myMonth, myDay)  Next  For myDay = 1 To 20   Cells(5, myDay + 15).Resize(2) = DateSerial(myYear, myMonth + 1, myDay)  Next  For myDay = 1 To 31   Cells(6, myDay + 4).Select   If Selection.Text = "土" Or Selection.Text = "日" Then    Selection.Offset(-1).Resize(21).Interior.ColorIndex = 15   End If  Next  Range("E2").Select  Application.ScreenUpdating = True End Sub Sub Macro2()  Application.ScreenUpdating = False  Dim myDay As Byte  Range("E4:AI25").Clear  Range("E5:AI25").Interior.ColorIndex = xlNone  Range("E4") = StrConv(Range("G2") & "月", vbWide)  Range("P4") = StrConv(Range("G2") + 1 & "月", vbWide)  For myDay = 21 To 31   If Month(DateSerial(Range("E2"), Range("G2"), myDay)) <> Range("G2") Then Exit For   Cells(5, myDay - 16) = myDay   Cells(6, myDay - 16) = Format(DateSerial(Range("E2"), Range("G2"), myDay), "AAA")   If Cells(6, myDay - 16) = "土" Or Cells(6, myDay - 16) = "日" Then    Cells(5, myDay - 16).Resize(21).Interior.ColorIndex = 15   End If  Next  For myDay = 1 To 20   Cells(5, myDay + 15) = myDay   Cells(6, myDay + 15) = Format(DateSerial(Range("E2"), Range("G2") + 1, myDay), "AAA")   If Cells(6, myDay + 15) = "土" Or Cells(6, myDay + 15) = "日" Then    Cells(5, myDay + 15).Resize(21).Interior.ColorIndex = 15   End If  Next  Range("E2").Select  Application.ScreenUpdating = True End Sub

tokiwa7219
質問者

お礼

上手く出来ました。ありがとうございます。あと3点ほど教えていただけるとありがたいのですが、E4とP4はセルの統合をしたいのですがマクロを実行すると統合が解除されちゃうんですね。あとセルの枠の線の消えちゃったので、もしよろしければそれもマクロでできるのですか?マクロ1と2は一緒にできないものなのですか?よろしくお願いします。

tokiwa7219
質問者

補足

ありがとうございます。一度やってみます。また、ご報告します。

  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

マクロにする必要性を感じないのですが、マクロで作るのは前提条件でしょうか? 標準の関数と条件付書式だけでよいような気がしますが。

tokiwa7219
質問者

補足

そうなんですか?関数でもよいのですが、できれば今後の為にVBAで作ってみたいのです。どんなマクロにすればいいのかさっぱりわかりません。ぜひお願いします。

関連するQ&A