- ベストアンサー
エクセルのマクロでこんなことできませんか?
「あるひにちの横のセルに○印を入れると5日後の横のセルに△印が記入されるマクロを作りたいのです。」 ただし・・・。 その「5日」とはは「5営業日後」つまり土日や祝日を除いた5日なんです。 土日は条件付書式とかで色をつければ土日の認識ってできないのですか? その場合祝日は手動で色をつけようと思います。 それって無理ですか? VBAとかいうのを使わないとダメですか? 何か案がありましたら私でもわかるように詳しくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 私でもわかるように詳しくおねがいします。 VBAを使用しますが、バッチリ解るように詳し~く説明します。 「ある日にちの横のセルに○印を入れると」とありますので、多分○印を 入れる範囲の左側列に日付けデータの列があるものと解釈します。 まず、日付データが A2 からあるとして、そのセルを選択し、「条件付き書式」で 「数式が」にして式を =WEEKDAY(A2)=1 に設定し、フォント色を[赤]にします。 条件2 に「数式が」=WEEKDAY(A2)=7 を設定し、[青]に設定します。 先頭セルに日付けを入力し、必要分、下へフィルドラッグします。 (※ この土、日の色は、動作に関係しません。VBAの中で処理しています。) ただ、祝日は手動でフォントに任意の色を着けます。( ○印を入れる前に) ※ 色が着いていないと祝日と認識されません。 【VBA設定手順】 ・使用しているシートのシート名タブを右クリックして「コードの表示」を 指定します。 ・開いたコードウィンドウに下記コードをコピーして貼り付けます。 必要により、3行目の「○印を付ける範囲」を変更します。 (現在は、日付がA列、○印を付けるのがB列になっています。) ・Alt+ Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。 ・メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を 「中」にして[OK]します。 ・以上で設定完了です。 ちょっと仕様を書いておきます。 ・範囲を選択状態で"○"を入れ、Ctrl+Shift+Enterで一気に複数入れても対応します。 ・フィルドラッグコピーにも対応します。 ・○を消した場合は、該当する△も消えます。 ・土、日、祝日に ○を入れることは、無いと思いますが、もし入れた場合も同じように △を表示しますが、もし、直近の平日に○が入っていると、その△は、どちらのものか 区別つかないことになります。(当然ですが・・・) 従って、どちらかの○を消すと該当する△は、消えます。 (残っている方の○を付け直します。) たぶん、これで要望どおりの動作かと思いますが、如何でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) '--------------------- Const ChkCol = "B:B" '<---○印を付ける範囲指定する '---------------------(この左側列(A)に日付形式のデータがあること) Dim R As Range Dim Rng As Range Dim OfstRng As Range Dim N As Integer Set R = Application.Intersect(Range(ChkCol), Target) If R Is Nothing Then Exit Sub Application.EnableEvents = False For Each Rng In R N = 0 For Each OfstRng In Rng.Offset(1).Resize(10) If Weekday(OfstRng.Offset(, -1).Value) > 1 And _ Weekday(OfstRng.Offset(, -1).Value) < 7 Then With OfstRng.Offset(, -1).Font If .ColorIndex <= 1 Then N = N + 1 If N = 5 Then If Rng.Value = "○" Then OfstRng.Value = "△" Else OfstRng.Value = "" End If Exit For End If End If End With End If Next OfstRng Next Rng Application.EnableEvents = True Set R = Nothing End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
これぐらいになるとVBA(マクロ)を使わないと無理でしょう。△を入れる位置を決めるのが関数式では難しいでしょう。 A列に名前、第1行に月中の日付け(A2:A32)が入っているとする。必ず○は入っているとする。 翌月に△が行くことがあるが、十分は考慮してないが、来月の日をオートフィルで、適応日数作れば自動的に翌月日付に続くので、下記で対処可能かと思う。 Sub test02() For i = 2 To 5 '何名分か適当行数に '---- For j = 2 To 40 '31日+5日+アルファ If Cells(i, j) = "○" Then s = j + 1 Exit For End If Next j '---- d = 0 For k = s To s + 20 '20日内に5日営業日がないはないだろう d1 = Cells(1, k) wk = WorksheetFunction.Weekday(d1) If wk = 6 Or wk = 7 Then Else 'ここへ祝日・特別休日処理を入れること d = d + 1 End If If d = 5 Then Exit For Next k '------- Cells(i, k) = "△" Next i End Sub 上記では手抜きして土・日だけを5営業日に省いています。上記の「祝日」の所へ、月中の祝日等の日付を配列等に入れ、比較して、該当なら5日に数えない様にすれば良い。面倒なのでここでは略。
- kusokuzeshiki
- ベストアンサー率13% (46/348)
土日の認識はよく使うのでその部分は自信あります。仮にA1 セルに日付が入っているとすれば、=text(A1,"ddd")で SatとかSunという曜日が返ってきます。私は、これを 条件書式にいれてそのセルをText関数で変換した値が Satなら青、Sunなら赤でセルを塗りつぶすことを よくやります。 5営業日の方ですが、5日前をIF文でSatかSunでないか 調べて、そうならその条件が外れるまでさかのぼるみたい な式を5回くらいネストしてすべてのセルにいれて、○が入っていないかチェック すればマクロなしで出来そうな気がします。土日以外の祝日 も手で入れれば、同じ式でスキップできると思います。 (こちらはアイディアだけで実施していないので あしからず)
- Hageoyadi
- ベストアンサー率40% (3145/7860)
年末ですし、得意先への受注日と納品日の連絡をしなければなりませんよね。 だとすれば受注日の行や列と納品日の行や列は別にした方がいいと思います。 で、その場合はマクロ機能を使わなくてもWORKDAY関数を使えば何とかなると思います。土日のみでなく、祝日や運送状の理由でお休み扱いにしたい日も反映させることができます。 http://arena.nikkeibp.co.jp/qa/other/gaz/oth_79/ を参考に。 VBAを使わないマクロについてはわかりません。