- ベストアンサー
vba 指定した日付範囲でセルの色を塗る
急遽、エクセルVBAを組んでくれと頼まれたのでわかる方、教えていただけますか? 開始日時(A行)と終了日時(B行)があり、 開始と終了の範囲でC以降日付になっており 指定の範囲内でセルの色が塗られるいうものなのですが なにせ急ぎとVBAがほとんどわからないのでなるべくわかりやすく 教えていただけるとありがたいです。 ちなみにsheetにコードを記入するのとmoduleにコードを記入するのでは どう違うのですか?わからないまでも一応、色が塗られるところまでは できたのですがどうやってセルの時間を取得して範囲を指定すれば 良いのかなどがわかりませんどうかよろしくお願い致します。 下記は作成途中ですが・・・ Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim row As Integer Dim line As Integer row = 5 line = 9 Set objR = Range("A1").Resize(1, 4).Offset(1, 2) objR.Interior.ColorIndex = 8 End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 予定表とのことですので、下記のようなものをイメージしました。 (全ての行に日付が入っているのではなく、タイトル行にのみ日付が入っている?) そのつもりで回答致します。 A B C D E F ・・・ 1 開始日 終了日 4/1 2 3 4 ・・・ 2 2008/4/10 2008/4/20 (ここのセルに色をつけたい) 3 2008/4/14 2008/4/21 (ここのセルに色をつけたい) ・・・以下複数行 まず日付項目(C1から右)を全て日付形式で入力します。 これをセルの書式設定でユーザー定義サイズ"m/d"にすると「4/1」 "d"にすると「1」となります。 直接1と入力すると、Excelは1900/1/1と判断しますので 必ず日付形式で入力して、書式設定で表示を変えるようにします。 次に色をつけたい範囲(C2から右)を全て選択して「条件付き書式」で 「数式が」「=AND($A2<=C$1,$B2>=C$1,WEEKDAY(C$1,2)<=5)」の場合 「セルのパターンを(任意の色)」と設定します。 これでC列以降の1行目(タイトル行)が同じ行のA列の日付以上、 同じ行のB列の日付以下、土日以外である場合に該当セルに色がつきます。 土日以外の休み(祝祭日)まで対応となるとややこしくなりますので とりあえずはこのくらいで。
その他の回答 (4)
- nda23
- ベストアンサー率54% (777/1416)
3列目以降の書式がはっきりしませんが、こんな感じでやってみてください。 Dim Y, X, T, D, S, E For Y = 1 To Cells(1, 1).CurrentRegion.Rows.Count S = Cells(Y, 1).Value '開始日 E = Cells(Y, 2).Value '終了日 For X = 3 To Cells(Y, 1).CurrentRegion.Columns.Count T = Cells(Y, X).Text 'セル内容を表示されている形式で取得 If Not IsDate(T) Then '日付形式でなければ編集する T = Year(S) & "/" & Month(S) & "/" & CStr(T) End If Select Case CDate(T) '日付に変換して範囲チェック Case S To E '開始日~終了日の間 Select Case Weekday(D) '曜日を確かめる Case 2 To 6 '月~金の間 'セル内部を指定した色で着色する Cells(Y, X).Interior.Color = &HC0D0E0 End Select End Select Next Next End Sub 色は適当に変更してください。 また、Cells(Y, X).Interior.ColorIndex = 2 のような指定もできます。尚、当然ではありますが土日以外の休日は処理できません。
お礼
VBAってすごいですね!!! ありがとうございます!! 助かりました!!!
- fumufumu_2006
- ベストアンサー率66% (163/245)
ANo.2に間違いがありました。 誤:このC1を、C2:AG1(AGは最大31日なので)にコピーします。 正:このC1を、D1:AG1(AGは最大31日なので)にコピーします。 誤:で、1日以外は日だけなのでC2:AG1を選択して 正:で、1日以外は日だけなのでD1:AG1を選択して
お礼
返事が遅くなって申し訳ないです。 参考になりました。ありがとうございます。
- fumufumu_2006
- ベストアンサー率66% (163/245)
こんなのではどうでしょうか? C1に以下を設定します。 =IF($A1<>"",IF(MONTH(DATE(YEAR($A1),MONTH($A1),COLUMN(A1)))=MONTH($A1),DATE(YEAR($A1),MONTH($A1),COLUMN(A1)),""),"") [書式][セル][セルの書式設定]の[表示形式]を、[ユーザー定義]で[種類]を m/d にします。 [書式][条件付き書式][条件付き書式の設定]で、[数式が][=(C1>=$A1)*(C1<=$B1)*(WEEKDAY(C1,2)<=5)] 書式:フォントの色[赤] このC1を、C2:AG1(AGは最大31日なので)にコピーします。 これでA1とB1の日付の間の土日以外を赤にします。 で、1日以外は日だけなのでC2:AG1を選択して [書式][セル][セルの書式設定]の[表示形式]を、[ユーザー定義]で[種類]を d にします。 C1:AG1を必要なだけ行方向にコピーすれば、行方向にも増やせます。
- don9don9
- ベストアンサー率47% (299/624)
見当外れの回答でしたら申し訳ないですが、 「どこかのセルに期間を入力して、それに合致するセルに色をつけたい」 であれば、わざわざVBAでなくても条件付き書式でよいかと思います。 色をつけたい範囲全てを選択した状態で書式>条件付き書式で 「セルの値が」「次の値の間」で期間の開始と終了のセルの間 と設定すればよいかと思います。 差し支えなければ具体的なデータの例を挙げていただければ より的確な回答がしやすいのですが。
補足
すいません、返事が遅れました。 don9don9さん返事ありがとうございます。 エクセルもよくわからないのでVBAを使用しなくても出来るならそのほうが良いのですが・・・ 例えば、予定表を作る際に開始日時に2008/4/10(A1)と入力し終了日時に2008/4/18(B1)と入力したらC1以降に1・2・3と日付のindexがあったとしたら10~18日までの間のセルの色(何色でも良いです)が変わるといったものを作成したいのです。ただ、土・日は色を塗りたくないので 休みの日は色を変更しないといった感じにしたいのです。 indexは月初めだけ4/1と表示されていてその他は2・3・4という感じになります。 こんな感じわかりますか? どうかよろしく御願い致します。
お礼
ありがとうございます!!! 参考になりました!! 関数のみでこんなことが出来るんですね~ 勉強になりました!!