- ベストアンサー
VBA マクロについて
自作のカレンダーに自動で日付を判定、入力してくれる ロジックを作っていたのですが、 2、4、6、9、11月以外は31日分表示されるはずが。。。 表示されませんでした。 恐らくロジックがおかしくて i=31 が通っていないものと 思われますが、ちょっとよく分かりません。 初心者で低レベルな質問ですけど、どなたかお願いします。 Sub AutoCarender() '自動でカレンダーの日付を入力するプログラム Dim month, i As Integer '表示させたい月 month = 3 If (month = 2) Then i = 28 ElseIf (month = 4 Or 6 Or 9 Or 11) Then i = 30 Else i = 31 End If Dim tate, yoko As Integer Dim week As Integer week = (Weekday(2009 / month / 1, 2)) yoko = Choose(week, 1, 3, 5, 7, 9, 11, 13) tate = 3 For j = 1 To i '"シートの名前"を指定 Worksheets("Sheet1").Cells(tate, yoko).Value = j yoko = yoko + 2 If (yoko > 13) Then yoko = 1 tate = tate + 2 End If Next End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ElseIf (month = 4 Or 6 Or 9 Or 11) Then これでは期待する動作になりません このElseif では month=4 の評価と Or 6 の演算結果と Or 9 の演算結果と Or 11の演算結果で評価されます 仮に monthが3だった場合 month=4 False Or 6 True Or 9 True Or 11 True となり 結果はTrueになります 期待する結果を導きたいならば ElseIf (month = 4) or (month = 6) or (month=9) or (month=11) Then とすべきですよ
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
ついでに、、、日曜日から始まるカレンダーのサンプル。変数 firstWeek を vbMonday にすると、月曜日から始まります。 ■ 参考ソース Sub AutoCarender2() Dim yy As Integer, mm As Integer, dd As Integer Dim dtFirst As Date Dim dtValue As Date Dim iColor As Integer Dim tate As Long Dim yoko As Long Dim i As Long Dim firstWeek As VbDayOfWeek yy = Year(Now()) mm = InputBox("mm?", , Month(Now())) dd = 1 firstWeek = vbSunday ' // カレンダーの最初の曜日 ' // 月初の日付からカレンダーに記載する最初の日(開始日) ' // を求める dtFirst = DateSerial(yy, mm, 1) dtFirst = dtFirst - Weekday(dtFirst, firstWeek) + 1 ' // カレンダー記載の開始位置 tate = 3 yoko = 1 ' // カレンダー7日*6週分-->42マス ' // 0-41 で 42 マス分ループ For i = 0 To 41 ' // 記載日を 開始日+i で求める dtValue = DateAdd("d", CDbl(i), dtFirst) With Worksheets("Sheet1").Cells(tate, yoko) .Value = dtValue ' // 表示形式で日付だけ表示する .NumberFormat = "d" If Month(dtValue) = mm Then ' // 月内のフォント色を曜日別に求める Select Case Weekday(dtValue) Case vbSunday: iColor = 3 ' red Case vbSaturday: iColor = 5 ' blue Case Else: iColor = xlAutomatic End Select Else ' // 月外のフォント色 iColor = 15 ' glay End If .Font.ColorIndex = iColor .Font.Name = "Arial" End With yoko = yoko + 2 If ((i + 1) Mod 7) = 0 Then yoko = yoko - (2 * 7) ' // 2列*7日分戻す tate = tate + 2 ' // 2行下へ End If Next End Sub
お礼
色々とアドバイスありがとうございます♪ まだ始めたばかりで難しいところもありますが(汗 色々試しながらやってみようと思います。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 ■ ご提示のソースについて 1)yyyy 年 m 月 の月末日の求め方(変数 i) うるう年についても考慮する必要があるため、単純に2月なら 28 と は決め打ちできません。DateSerial 関数を使うと楽ですよ。 i = Day(DateSerial(yyyy, m, 0)) DateSerial 関数の3番目の引数に 0 を指定すると、yyyy 年 m 月 の 月末日がシリアル値で求まります。さらに、Day 関数で 日 を求めて います。 2)変数 month は予約語の Month 関数と同名ですから、別の変数名に した方が良いでしょう 3)ElseIf ~ 部は #1 ご回答のとおり 4)Weekday 関数の誤り week = (Weekday(2009 / month / 1, 2)) ↓ week = Weekday(DateSerial(2009, month, 1), 2) 余談: 日付リテラルは #2009/3/1# のように # で括ります。2009/3/1 の ように直接書いてしまうと。。演算されてしまいますよね? 2009 ÷ 3 ÷ 1 今回は月の指定に変数を使いますので、DateSerial 関数を利用する のが簡単です。 以上、気になった点です。
お礼
見やすい箇条書きでのアドバイスありがとうございます♪ 勉強になりました(´・ω・`)(´-ω-`))ぺこり
お礼
なるほど、理解しました! ピンポイントの回答ありがとうございました♪