- 締切済み
Excelのマクロについて教えて下さい。
公休一覧表を作ったのですが加えたい機能があります。 2の行に1~31日の日付があり、 Bの列に30人の作業員名が入力されています。 休んだ日の所に都度、公休の公という文字を打っていき その月に何回休んでるかを シート右のAIの列に表示しています。 加えたい機能というのは、 B1の作業員の6日に公を入力したら 一週間後の13日に自動で×(印になるようなもの) を入力させたいです。 B1の作業員の7日に公を入力すると 13日の印が消え、7日の一週間後の14日に印が付く。 というような形で30人分自動で一週間後に印を付けたいです。 VBAなどマクロなど関数なども含め、何か手があれば初心者にもわかるよう 詳しく教えていただけると助かります。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- akito0417
- ベストアンサー率20% (55/266)
すいません、画像選択したはずがついていないみたいです。 もう1回添付します。(これでつかなかったら申し訳ないですが、実行結果はあきらめてください。)
- akito0417
- ベストアンサー率20% (55/266)
Private Sub Worksheet_Change(ByVal Target As Range) Dim day As Long ' 公と入力した日付 Dim tCell As Long ' ×を入れる対象位置 Dim nRow As String ' 公と入力した行 Dim nCol As Long ' 公と入力した列 Dim i As Long ' ループカウンタ Dim tRow As String ' ×を入れる対象行 Dim tCol As String ' ×を入れる対象列 Dim sIdx As Long ' 公と入力した1週間後の開始位置 Dim nAddress As Variant ' 公と入力したアドレス Dim tAddress As Variant ' ×を入れるアドレス ' 複数セルの値を同時に変えるとバグるので、複数セルを同時に変えた場合は対象外 If InStr(Target.Address, ":") = 0 Then ' マクロを実行するタイミングは、公と入力した場合のみ If Target.Cells.Value = "公" Then ' 公と入力した位置を取得(例えばC4) nAddress = Split(Target.Address, "$") ' 公と入力した行を取得(上記例だとC) nRow = nAddress(1) ' 公と入力した列を取得(上記例だと4) nCol = nAddress(2) ' 公と入れた日付を取得 day = Range(nRow & 2).Value ' 公と入力した1週間後の日付を算出 tCell = day + 7 ' 公と入力したセルから×を入力するセルに移動 Range(nRow & nCol).Offset(0, tCell - day).Select ' ×と出力する位置を取得(例えばJ4) tAddress = Split(ActiveCell.Address, "$") ' ×と出力する行を取得(上記例だとJ) tRow = tAddress(1) ' ×と出力する列を取得(上記例だと4) tCol = tAddress(2) ' 公と入力したセル(例えばC4)から1週間分の×を削除する為の位置の決定 If day >= 1 And day <= 7 Then ' 1日~7日なら8日(例えばJ4) sIdx = 10 ElseIf day >= 8 And day <= 14 Then ' 8日~14日なら15日(例えばQ4) sIdx = 17 ElseIf day >= 15 And day <= 21 Then ' 15日~21日なら22日(例えばX4) sIdx = 24 ElseIf day >= 22 And day <= 31 Then ' 22日~31日なら29日(例えばAE4) sIdx = 31 End If ' 公と入力したセルから1週間分の×を削除する For i = 0 To 6 If Cells(tCol, sIdx + i).Value = "×" Then Cells(tCol, sIdx + i).Value = "" End If ' 処理したセルから次のセルに移動(例えばJ4→K4) ActiveCell.Offset(0, 1).Select Next i ' 公と入力した日付から1週間後の日付に×を入れる Range(tRow & tCol).Value = "×" Range(nRow & nCol).Select End If End If End Sub 補足が来る前に完成してしまったので一応。。。 1週間分に×が1個しかない前提で作ってあります。 質問した部分以外は望んでる事が出来ているかなーと思います。 実行結果を添付として載せてあります。 ただ、添付画像を見てわかるとおり、日付の開始位置やその他が添付画像が荒く判断しかねる為、こちらで勝手に決めました。 もし、開始位置等が違う場合は恐れ入りますが、ソースの数字をあれこれいじってください。 いじる必要のある数値は、sIdxのみだと思っています。(他をいじるとバグります。) ※文字間を開けるため、半角スペースを全角スペースに置換しています。 実行される場合、全角スペースを半角スペースに置換しなおしてください。 ソースの貼り付け先ですが、 Excel起動→Alt+F11キーでエディタを開きます。 何もいじっていなければ(恐らく)画面左側にSheet1、Sheet2、Sheet3・・・等出ているので、 作業したいシート(恐らくSheet1?)をダブルクリック→画面右側の白い部分を選択→貼り付け→保存 で、どこかのセルに公と入れれば動くかと思います。 サンプルですので、エラー処理等入れてありません。(複数セル同時値変更だけ入れました) 必要に応じて実装してください。 変数名は適当ですw
- akito0417
- ベストアンサー率20% (55/266)
今マクロ組んでますが、疑問点があるので、補足お願いします。 >B1の作業員の6日に公を入力したら 一週間後の13日に自動で×(印になるようなもの) を入力させたいです。 B1の作業員の7日に公を入力すると 13日の印が消え、7日の一週間後の14日に印が付く。 というような形で30人分自動で一週間後に印を付けたいです。 公と入力した1週間後の×の印は必ず1個しかない認識ですか?
- KURUMITO
- ベストアンサー率42% (1835/4283)
マクロを使わない限り手で入力することが有るセルに関数などを使って×などを表示させることはできませんね。 その代わりに1週間後のセルには赤色の表示をさせるといったができるようにしてはどうでしょう。 条件付き書式を設定します。 図にお示しの場合でしたら次のようにします。 C4セルからAG50セルまでを範囲として選択します。C4セルがアクティブ状態のセルとなっています。 「ホーム」タブの「条件付き書式」から「新しいルール」で「数式を設定して…」にチェックをし、数式の窓には次の式を入力します。 =AND(COLUMN(A1)-7=MATCH("ー",$C4:C4),OFFSET(C4,0,-7)="公") 上の式でMATCH関数の中のーは必ずひらがなモードで最後に入力してください。半角英数モードで-になっていないことを確認してください。 同じ画面の「書式」をクリックして「塗りつぶし」のタブで赤色を指定してOKします。 なお、表の中では行の最も右側の文字が公になっていることが必要です。
補足
ご尽力頂きありがとうございます。 教えて頂いた通りやった所、 1週間後に印を付けることができました。 心から感謝しています。 しかし1つ問題が発生してしまいした。 公休表ではなく乗務割表に変更してとの指示を受けたため、 逆に1~31に最初から全て出勤の「出」の字を打ち、 休みの日は「出」の字を消すというシステムに なってしまいました。 教えて頂いた関数をいじってなんとか自力で 完成させようと思ったのですが、 私一人ではどうにもうまくいきませんでした。 一番左の空白から右に6マスの所に印が付けば 同じものになるかと思ったのですが、 それでは連休の時に簡単にずれてしまいますし、 まず空白セルから右に印を付ける事もできませんでした。 もしよろしければ、もう一度力を貸して下さい。よろしくお願いします。
補足
ご尽力頂きありがとうございます。 最初の回答者様の説明を見て試行錯誤していたため、 返信が遅くなってしまいまして申し訳ございませんでした。 初心者にも分かりやすく教えて頂きありがとうございます。 説明の通りやってみた所私が望んでいたものが こちらも完成させることができました。感謝しています。 しかし1つ問題が発生してしまいした。 公休表ではなく乗務割表に変更してとの指示を受けたため、 逆に1~31に最初から全て出勤の「出」の字を打ち、 休みの日は「出」の字を消すというシステムになってしまいました。 教えて頂いたマクロをいじって完成させようと思ったのですが、 マクロに関しては全くの初心者なため、どうにもいうまくいきませんでした。 もしよろしければ、もう一度力を貸して下さい。よろしくお願いします。