ELLの足跡

人は最後は一人だという…でも、…今は妻が傍にいてくれる…

Excel VBAと関数の組み合わせで日曜日だけ違う数字を入力

妻の出勤簿の時間給の入力画面に平日と休日の金額を一発で入力したいと考えてみました。

VBA初心者の私としてはこんなものかな・・・

では、説明しますね。

初めは、祝日・日曜日の赤色の箇所を休日金額にしたかったんです・・・が、

実は土・日曜日を条件付き書式設定で文字色を変えてるので無理やったんです・・・
  • 条件付き書式設定で色を付けていると色番号を認識させることが無理なんですよね


  1. そこで、日曜日だけでも入力させようと
    WEEKDAY関数で曜日の数字を割り出す

    条件付書式設定で指定していた数式WEEKDAY関数を使い

    先ず数字を引っ張り出したんです。

    この時、一週間を日曜日から始まる1に設定したんですね

    だから、日曜日の箇所は1と表示されるわけなんです。

    これを踏まえて、下の図のL列に応用したんです。
  2. 後はVBAを使用して
    1. まず、K列の前のデータを消去
      Range("K2:K32").Select
      Selection.ClearContents
      Range("K2").Select

    2. 次に、1の日曜日に980、その他の曜日に880を入力
      Dim セル範囲 As Range
      For Each セル範囲 In Range("L2:L32")
      If セル範囲.Value = "1" Then
      セル範囲.Offset(0, -1) = "980"
      Else
      セル範囲.Offset(0, -1) = "880"
      End If
      Next セル範囲

    3. ここで問題が起きました・・・
      選択範囲をL2:L32としているため、
      L30,L31,L32のそれぞれのセルが数式のエラー値である#VALUE!と表示され
      結果、マクロ自体が2月はエラーになってしまうんです。
    4. そこでL列の30、31、32(要するに、29日、30日31日にあたるセル)に関数
      =If(J30="","",WEEKDAY(J30))
      =IF(J31="","",WEEKDAY(J31))
      =IF(J32="","",WEEKDAY(J32))

      J30が空白ならばL30も空白、
      J31が空白ならばL31も空白、
      J32が空白ならばL32も空白という指図に関数変更
    5. 結局、このVBAで動作するようになりました。
      Sub 時給クリア()
      '
      ' 時給クリア Macro
      ' マクロ記録日 : 2007/2/6 ユーザー名 :
      '

      '
      Dim セル範囲 As Range
      Range("K2:K32").Select
      Selection.ClearContents
      Range("K2").Select
      For Each セル範囲 In Range("L2:L32")
      If セル範囲.Value = "1" Then
      セル範囲.Offset(0, -1) = "980"
      Else
      セル範囲.Offset(0, -1) = "880"
      End If
      Next セル範囲
      End Sub

※ただ、色指定で入力できたら、祭日も可能やったんですが・・・
 日曜日だけの変更で、祝日に関しては今まで通り手で直さなければなりません・・・*1


時給入力画面

*1:+_+