• ベストアンサー

VBAでスケジュール表を作成しています

業務短縮化のために、VBAを使って社内のスケジュール管理ファイルを制作しています。 つくろうとしているのは、こんな感じです。 1、まず、罫線だけのマスター用紙があります。 2、別シートに設置した「スケジュール作成」ボタンをクリックすると、マスター用紙がコピーされ、新しいシートが作成されます。 この新しいシートの「A」列に、自動的にカレンダーが入力されます。 この2の部分をVBAで自動化したいと考えています。 すでにボタン押下→シートをコピーするところはできました。 カレンダーを作るには、月の最終日の日にちと曜日をとればいいのかな?とか予想はしているのですが。。。 手掛かりなどありましたらお願いします

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

関数でもできるので参考に A1=2007、B1=12 A2に=DATE($A$1,$B$1,1) A2に =IF(A2="","",IF(A2+1>DATE($A$1,$B$1+1,0),"",A2+1)) 以下32行目まで式を複写する。 これで1か月分の日付が出る。 ーー VBAでこの部分は(ついでに曜日も出した) Sub test01() y = Cells(1, "A") m = Cells(1, "B") For i = 2 To 32 Cells(i, "A") = DateSerial(y, m, i - 1) Cells(i, "B") = Format(DateSerial(y, m, i - 1), "aaa") If DateSerial(y, m, i - 1) = DateSerial(y, m + 1, 0) Then End Next i End Sub ーー 人により色々なコードの組み方がありそう。 上記での、ポイントは終了脱出条件のDateSerial(y, m + 1, 0) で月末日を出している0の部分です。

nepa-aiko
質問者

お礼

お二人の間をとって、 Sub Sheet_Copy() Worksheets("ワークシート").Copy After:=Worksheets("ワークシート") y = Cells(3, "C") m = Cells(3, "D") For i = 1 To 31 Cells(i + 7, "A") = DateSerial(y, m, i - 1) Cells(i + 7, "B") = Format(DateSerial(y, m, i - 1), "aaa") If DateSerial(y, m, i - 1) = DateSerial(y, m + 1, 0) Then End Next i End Sub というふうにしてみました。 (シート内の「3C」に作成したい予定表の年を入力、「3D」に月を入力します) すると一応指定したセル内に日付が収まるんですが・・。 例えば、2007年の11月を指定すると、1行目が10月31日になってしまいます。。。(水曜日?なのに) あと、スケジュール帳は部内で共有するため、 >(シート内の「3C」に作成したい予定表の年を入力、「3D」に月を入力します) ↑の部分をできれば「スケジュールの作成」ボタンとともに別ワークシートに設定したいと思います。(このワークシートは後ほど、管理者しか見られないように設定します) そこでy = Cells(3, "C","sheet1")と指定したら、コンパイルが通らずにエクセルから怒られてしまいました。。。(当たり前でしょうか)

nepa-aiko
質問者

補足

すみません。補足です。 日付の入力するのはA6からです。 あと、12月中に1月のカレンダー・・・というように、基本的に1ヵ月先のものを制作します。 教えていただいたものだと、「DateSerial」を使って作成日の日付をとって・・という感じでしょうか? 正解に近づけそうなのに悔しいのでがんばります!

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

このような質問は実際のシートが見えないので回答しにくいですが、できるだけ汎用的な方法で回答します。ヒント程度に考えてください。 マクロは以下でよいでしょう。カレンダの開始セルはA3としています。 Sub Macro1()  Worksheets("Master").Copy After:=Worksheets("Master")  ActiveSheet.Name = Format(Date, "YYYY") & "年" & Format(Date, "MM") & "月"  ActiveSheet.Range("A3").Value = Date - Day(Date) + 1 End Sub マスタシートのA4セルには  =IF(MONTH($A$3+ROW(Z1))=MONTH($A$3),$A$3+ROW(Z1),"") を貼り付けて、下方向に30行分コピーして、セルの書式を日付形式にします。 マクロを実行するとA3セルと同じ月の日付列が生成されるはずです。

nepa-aiko
質問者

お礼

お二人の間をとって、 Sub Sheet_Copy() Worksheets("ワークシート").Copy After:=Worksheets("ワークシート") y = Cells(3, "C") m = Cells(3, "D") For i = 1 To 31 Cells(i + 7, "A") = DateSerial(y, m, i - 1) Cells(i + 7, "B") = Format(DateSerial(y, m, i - 1), "aaa") If DateSerial(y, m, i - 1) = DateSerial(y, m + 1, 0) Then End Next i End Sub というふうにしてみました。 (シート内の「3C」に作成したい予定表の年を入力、「3D」に月を入力します) すると一応指定したセル内に日付が収まるんですが・・。 例えば、2007年の11月を指定すると、1行目が10月31日になってしまいます。。。(水曜日?なのに) あと、スケジュール帳は部内で共有するため、 >(シート内の「3C」に作成したい予定表の年を入力、「3D」に月を入力します) ↑の部分をできれば「スケジュールの作成」ボタンとともに別ワークシートに設定したいと思います。(このワークシートは後ほど、管理者しか見られないように設定します) そこでy = Cells(3, "C","sheet1")と指定したら、コンパイルが通らずにエクセルから怒られてしまいました。。。(当たり前でしょうか)

nepa-aiko
質問者

補足

すみません。補足です。 日付の入力するのはA6からです。 あと、12月中に1月のカレンダー・・・というように、基本的に1ヵ月先のものを制作します。 教えていただいたものだと、「Date」を使って作成日の日付をとって・・という感じでしょうか? 正解に近づけそうなのに悔しいのでがんばります!