🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

573閲覧

VBA:SheetChangeイベント 特定の列でDeleteボタンを押してもセルの中身が削除されない

Atsukinov

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/11/28 02:43

編集2019/11/28 02:45

前提・実現したいこと

指定の列(T,V,X)に、入力列(R,S,U,W)に日付を打ち込んだら、10営業日、20営業日、30営業日と日付を計算させるマクロイベントを作成しております。 (例)R列に今日の日付を入力したら、T列は10営業日後の日付、V列は20営業日後の日付、X列は30営業日後の日付が自動で入力される。 R列を削除(空白)にしたら、以降の列も自動的に削除

以下、コード

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3Dim Yasumi 4Dim i 5Dim j 6Dim k 7Dim Rng As Range 8 9Set Yasumi = ThisWorkbook.Worksheets(2) 10 11'各営業日ごとの日付を計算 12i = Application.WorkDay(Target.Value, 10, Yasumi.Range("A2:A81")) 13j = Application.WorkDay(Target.Value, 20, Yasumi.Range("A2:A81")) 14k = Application.WorkDay(Target.Value, 30, Yasumi.Range("A2:A81")) 15 16Application.EnableEvents = False 17 18For Each Rng In Target 19 20'R列に予定日が入ったら、T列に10営業日後の日付を入れる。 21If IsDate(Rng.Value) = True And Rng.Column = 18 And Rng.Row <> 1 Then 22 Rng.Offset(0, 2).Value = i 23 Rng.Offset(0, 2).NumberFormatLocal = "yyyy/mm/dd" 24'R列の日付が消されたらT列の日付も消す 25 ElseIf Rng.Value = "" And Rng.Column = 18 And Rng.Offset(0, 2) <> "" And Rng.Row <> 1 Then 26 Rng.Offset(0, 2).Value = "" 27 Rng.Offset(0, 4).Value = "" 28 Rng.Offset(0, 6).Value = "" 29End If 30 31'S列に実績日が入ったら、T列に10営業日後の日付を入れる 32If IsDate(Rng.Value) = True And Rng.Column = 19 And Rng.Row <> 1 Then 33 Rng.NumberFormatLocal = "YYYY/MM/DD" 34 Rng.Offset(0, 1).Value = i 35 Rng.Offset(0, 1).NumberFormatLocal = "yyyy/mm/dd" 36'S列の日付が消されたら、T/V/W列の日付も消す(R列の日付は消さない) 37 ElseIf Rng.Value = "" And Rng.Column = 19 And Rng.Offset(0, 1) <> "" And Rng.Row <> 1 Then 38 Rng.Offset(0, 1).Value = "" 39 Rng.Offset(0, 3).Value = "" 40 Rng.Offset(0, 5).Value = "" 41End If 42 43 44'T列に予定が入ったら、V列に20営業日後を入れておく 45If IsDate(Cells(Rng.Row, "T")) = True And Rng.Row <> 1 Then 46 Cells(Rng.Row, "V").Value = j 47 Cells(Rng.Row, "V").NumberFormatLocal = "yyyy/mm/dd" 48'T列の日付が消されたら、V/W列の日付も消す 49 ElseIf Rng.Value = "" And Rng.Column = 20 And Rng.Row <> 1 Then 50 Rng.Offset(0, 2).Value = "" 51 Rng.Offset(0, 4).Value = "" 52End If 53 54 55'U列に実績日が入ったら、V列に20営業日後を入れておく 56If IsDate(Cells(Rng.Row, "U")) = True And Rng.Row <> 1 Then 57 Cells(Rng.Row, "V").Value = j 58 Cells(Rng.Row, "V").NumberFormatLocal = "yyyy/mm/dd" 59'U列の日付が消されたら、V/X列の日付も消す 60 ElseIf Rng.Value = "" And Rng.Column = 21 And Rng.Row <> 1 Then 61 Rng.Offset(0, 1).Value = "" 62 Rng.Offset(0, 3).Value = "" 63End If 64 65 66'V列に予定日が入ったら、X列に30営業日後を入れておく 67If IsDate(Cells(Rng.Row, "V")) = True And Rng.Row <> 1 Then 68 Cells(Rng.Row, "X").Value = k 69 Cells(Rng.Row, "X").NumberFormatLocal = "yyyy/mm/dd" 70'V列の日付が消されたら、X列の日付も消す 71 ElseIf Rng.Value = "" And Rng.Column = 22 And Rng.Row <> 1 Then 72 Rng.Offset(0, 2).Value = "" 73End If 74 75 76'W列に実績日が入ったら、X列に30営業日後を入れておく 77If IsDate(Cells(Rng.Row, "W")) = True And Rng.Row <> 1 Then 78 Cells(Rng.Row, "X").Value = k 79 Cells(Rng.Row, "X").NumberFormatLocal = "yyyy/mm/dd" 80'W列の日付が消されたら、X列の日付も消す 81 ElseIf Rng.Value = "" And Rng.Column = 23 And Rng.Row <> 1 Then 82 Rng.Offset(0, 1).Value = "" 83End If 84 85Next 86 87Application.EnableEvents = True 88 89End Sub 90

発生している問題

V列でDeleteボタンを押した際、X列も自動的に削除されるはずだが、なぜか日付が入ってしまう。 その日付は本日時点でV列が"1900/1/27"、X列が"1900/2/10"となっている。 X列でDeleteボタンを押しても削除されず、上記日付が入ったままとなっている。

該当のソースコード

VBA

1'V列に予定日が入ったら、X列に30営業日後を入れておく 2If IsDate(Cells(Rng.Row, "V")) = True And Rng.Row <> 1 Then 3 Cells(Rng.Row, "X").Value = k 4 Cells(Rng.Row, "X").NumberFormatLocal = "yyyy/mm/dd" 5'V列の日付が消されたら、X列の日付も消す 6 ElseIf Rng.Value = "" And Rng.Column = 22 And Rng.Row <> 1 Then 7 Rng.Offset(0, 2).Value = "" 8End If

試したこと

例えばU列でDeleteボタンを押すと問題なく動くし、それ以前の列(Rなど)でも問題なく削除動作はされる。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Youbun

2019/11/28 03:52

Worksheet_Changeイベントしか記入がありませんが、 肝心のDeleteボタンで呼び出す関数も記入してもらえると 原因を考えれると思います。
guest

回答1

0

ベストアンサー

「T列に予定が入ったら」以降、条件式にRng.Column = xxがないですね。

投稿2019/11/28 04:28

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Atsukinov

2019/12/03 06:45

ありがとうございます、一つずつ処理するようにコードを変えたらうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問