• ベストアンサー

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

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

> 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 とすべきですよ

marulak
質問者

お礼

なるほど、理解しました! ピンポイントの回答ありがとうございました♪

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

ついでに、、、日曜日から始まるカレンダーのサンプル。変数 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

marulak
質問者

お礼

色々とアドバイスありがとうございます♪ まだ始めたばかりで難しいところもありますが(汗 色々試しながらやってみようと思います。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 ■ ご提示のソースについて  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 関数を利用する     のが簡単です。 以上、気になった点です。

marulak
質問者

お礼

見やすい箇条書きでのアドバイスありがとうございます♪ 勉強になりました(´・ω・`)(´-ω-`))ぺこり

関連するQ&A

専門家に質問してみよう