[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『土日祝日を除いた5日前を同じ行の別の列に表示し、背景色をつける』(dawny)
初めまして。
力及ばず書き込ませて頂きます。
Sheet1には「管理表」
Sheet2には「holiday」という名前がついています。
「管理表」のシートに上から6行目まで商品名や受付日などの項目があり、7行目からは1年分データが入り続けます。
6行目の項目名に以下があります。
U列(納品日)
W列(発送日)
【やりたいこと1】
U列に納品日を入れると、W列の発送日には土日祝日を除いた5営業日前の日付が入り、背景色がつくようにしたいのです。
【やりたいこと2】
U列の値を消すとWの値も消えるようにしたい
【課題1】
U列に日付を入れて「TAB」キー押下で実現できるのですが、
「Enter」キーですと、実行できなくなってしまいます。
不特定多数の人がこのファイルを操作するので、
どのような操作でもU列に値が入ったら同じ行のW列に発送日が入るようにしたいです。
【課題2】
U列を1セルのみ指定して削除する(Delete)と同じ行のW列の値も消えるのですが、U列を複数セル選んだ状態でDeleteすると、W列の値が残ってしまいます。
以下が実際のコードです。
'-----------------------------------------------------
標準 Module1
'-----------------------------------------------------
Function getWorkDay(day As Date, diff As Long) As Date
Dim holidaySht As Worksheet Set holidaySht = ThisWorkbook.Worksheets("holiday")
Dim lastRow As Long lastRow = getMaxRow(holidaySht, 1)
getWorkDay = Application.WorksheetFunction.WorkDay(day, diff, holidaySht.Range("A2:A" & lastRow))
Set holidaySht = Nothing
End Function
Function getMaxRow(sht As Worksheet, targetCol As Long) As Long
getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row 'holidayシートの最終行を取得
End Function
Sub test_getWorkDay()
Dim 納品日U As Date
Dim 出荷日W As Date
納品日U = Range("U" & ActiveCell.Row)
出荷日W = Cells(Selection.Row, 23)
Range("W" & ActiveCell.Row) = getWorkDay(納品日U, -5)
Range("W" & ActiveCell.Row).Select
With Selection.Interior
.Color = RGB(255, 204, 0) End With With Selection.Font .ThemeColor = xlThemeColorDark1 End With
End Sub
'-----------------------------------------------------
sheet1(管理表)
'-----------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Application.Intersect(Range("U7:U10000"), Target) Is Nothing Then Exit Sub
If .Count > 1 Then Exit Sub
If IsEmpty(.Value) Then
.Offset(, 2).Clear
Else
Call test_getWorkDay
End If
End With
End Sub
列の指定や削除の指定が間違っているのでしょうか。
お力添え頂けますと幸いです。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
(マナ) 2019/06/08(土) 19:03
(マナ) 2019/06/08(土) 19:05
関数ですと、excelに詳しくない管理対象外の作業者が勝手に行追加などを行った際、
条件付き書式が反映されなくなり、作業漏れが発生する事を懸念しております。
(また今後、W列に入った日付をダブルクリックすると本日の日付を記入し、定型文のメールを作成するように動作させるつもりです。)
(dawny) 2019/06/08(土) 19:22
複数セルとなると、休日リストデータの取得は1回だけにしたいなぁ。
そうすると、getWorkDay の存在意義がなくなりますかねぇ。。
test_getWorkDay のネーミングがピンと来ないんですが、下請けに出さないとならないんでしょうか? Changeイベント内で処理したくなっちゃいます。
すると、再利用できそうな標準モジュールのプロシージャとしては getMaxRow()だけしか残りませんが、それでいいですか?
'----------------------------------------------------- 'Sheet1 (管理表) '----------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim WSF As WorksheetFunction Dim aTgt As Range Dim holidaySht As Worksheet Dim HolidayList As Range Dim lastRow As Long
If Application.Intersect(Range("U7:U10000"), Target) Is Nothing Then Exit Sub
Set WSF = WorksheetFunction Set holidaySht = ThisWorkbook.Worksheets("holiday")
lastRow = getMaxRow(holidaySht, 1) Set HolidayList = holidaySht.Range("A2:A" & lastRow) 'ここで1回取得すればいい
For Each aTgt In Target If IsEmpty(aTgt.Value) Then aTgt.Offset(, 2).Clear Else With aTgt.Offset(, 2) .Value = WSF.WorkDay(aTgt.Value, -5, HolidayList) .Interior.Color = RGB(255, 204, 0) .Font.ThemeColor = xlThemeColorDark1 End With End If Next aTgt End Sub
'----------------------------------------------------- '標準 Module1 '----------------------------------------------------- Function getMaxRow(sht As Worksheet, targetCol As Long) As Long getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row 'holidayシートの最終行を取得 End Function
(半平太) 2019/06/09(日) 00:28
情報不足で申し訳ないです。
日付が変わっても5営業日前の日付が発送日に記載されるようにしたいのです。
納品日はコロコロ変わる可能性がありますので、U列は何度も書き変わります。
U列を一度消し、もう一度日付を入力すると、W列には「43619」のような書式になってしまいます。
また、他の列にも1次納品(AA)、1次発送(AC)、2次納品(AE)、2次発送(AG)というのがあり、
同じような動作を入れるような形になります。
「test_getWorkDay」のネーミングには深い意味はありません。
このファイルを外部に提出することもありませんので、変更も可能です。
(いろんな人がコードをいじって何年もつぎはぎで使っているので、このようになっていました)
(dawny) 2019/06/09(日) 14:22
>W列には「43619」のような書式になってしまいます。
> aTgt.Offset(, 2).Clear ↓へ変更 aTgt.Offset(, 2).ClearContents aTgt.Offset(, 2).Interior.Color = xlNone
>また、他の列にも1次納品(AA)、1次発送(AC)、2次納品(AE)、2次発送(AG)というのがあり、 >同じような動作を入れるような形になります。
・・と言われましても、何が問題なんですか? (1) 同じシートの(AA)列の話ですか? それとも別のシートの話? (2) 反映すべき右隣のセルの位置が2つの場合だけじゃないとか言う話ですか? (3) 計算すべき営業日数の違いの話ですか?
そう言う事が分からないとこちらでは対処しようがありません。 もしくは、 上のコードで、Enterでも、複数のセルのケースでも対応できるようになっていますので、 私の案を参考に、ご自身でアレンジしてください。
(半平太) 2019/06/09(日) 15:29
ありがとうございました、大変助かりました。
折角教えて頂いたのに適切に説明出来ず、
困惑させてしまったようで申し訳ないです。
勉強不足を痛感致しましたので、自分なりに調べてみようと思います。
(dawny) 2019/06/09(日) 15:41
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.