いつもお世話になっております。
下記のVBAのプログラムは私が書籍を参考に【I列】にデータが
入力された際、【L列】に日付を反映させるプログラムになりますが、
こちらに複数セルデリートの処理を加えたく質問させていただきました。
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Column
Case 9 'I列の入力時、L列に日付を入力
If Target.count > 1 Then Exit Sub
If Target.Value = "" Then '(複数セル選択時のエラー対策)
Cells(Target.Row, 12) = "" 'I列のデータをクリアするとL列もクリア
Else
Cells(Target.Row, 12) = Format(Now(), "YYYY/MM/DD")
End If
End Select
End Sub
Cells(Target.Row, 12) = ""
こちらの構文ではI列のデータを消した際、L列のデータも消えるのですが
処理が1セルずつのため複数セルを一度にデリートなどの構築は可能なのでしょうか?
色々お調べしたところTargetの指定に対し複数セルが選ばれた際にエラーとなる為、
セルが1以上だった場合に処理を止める If Target.count > 1 Then Exit Sub
こちらの構文が複数セルをデリートしても消せない原因だと思うのですが
私の知識不足によりこれ以上のことが分からず困っている次第です。
ご教示いただけると幸いです。
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
おはようございます
申し訳ないです。;;
色々な選択の仕方を考えすぎました。。
こちらでどうでしょう。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each c In Selection
Select Case c.Column
Case 9
'I列の入力時、L列に日付を入力
If Target(1).Value = "" Then '(複数セル選択時のエラー対策)
Cells(c.Row, 12) = "" 'I列のデータをクリアするとL列もクリア
Else
If Target.Column = 9 And Target.Value <> "" Then
Cells(Target.Row, 12) = Format(Now(), "YYYY/MM/DD")
GoTo EndLabel
End If
End If
End Select
Next
EndLabel:
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Qchan1962さんが作成していただいたこちらの
VBAで理想の処理が叶い活用させていただきます。
この度はありがとうございました。
今後も何かとこちらにお世話になるかと存じますが、
その際は何卒よろしくお願いいいたします。
No.3
- 回答日時:
#1,2です。
連続投稿申し訳ありません。自身で書いたものが気に食わなく、サンプルを再提示いたします。
原型を大分変えてしまいました。
入力時、削除時共に単セルまたは、複数セルを選択した場合を想定しています。
参考程度に
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each c In Selection
Select Case c.Column
Case 9
'I列の入力時、L列に日付を入力
If Target(1).Value = "" Then '(複数セル選択時のエラー対策)
Cells(c.Row, 12) = "" 'I列のデータをクリアするとL列もクリア
Else
If c.Value <> "" Then
Cells(Target.Row, 12) = Format(Now(), "YYYY/MM/DD")
GoTo EndLabel
End If
End If
End Select
Next
EndLabel:
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
ステップ実行(デバッグ)により途中で終了した場合、
Application.EnableEvents = Trueが実行されず、イベントが実行されなくなります。
念のため下記を実行すれば、シートイベントを復旧出来ます。
Sub a()
Application.EnableEvents = True
End Sub
Qchan1962さん回答ありがとうございます。
サンプルを構築してくださりありがとうございます。
早速ですがこちらのプログラムを使わせていただいたところ、
I列にデータを入力した際のL列の挙動について質問がございます。
I列に値を入力した際にはL列の日付はまだ反映はされず、
もう一度I列に戻り値を入力した際ここでL列に入力が
行われるのですが、こちらは何か私の設定が間違っているのでしょうか?
度々の質問となり申し訳ございませんが、よろしくお願いいたします。
No.2
- 回答日時:
#1です
ごめんなさい。サンプルには、バグがあります。
下記の様に修正してください。
バグ
If Target.Count > 1 Then Exit Sub '入力時
修正
If Target.Count > 1 Then GoTo EndLabel
追加
End Select の下
EndLabel:
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
No.1
- 回答日時:
こんばんは、
If Target.count > 1 Then Exit Sub は確かにトリガーセルが1つでないと実行から抜けるものだと思いますが、Targetが1つであっても処理範囲は1つとは限りませんね。繰り返し処理や.Reziseで範囲を広げる事が可能です。
あと、ご質問と少し違う部分ではありますが、
Worksheet_Changeでは
Application.EnableEvents = Falseを実行して
処理を行い、処理を終了したら
Application.EnableEvents = True
するようにした方が良いでしょう。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
Select Case Target.Column
Case 9 'I列の入力時、L列に日付を入力
If Target(1).Value = "" Then '(複数セル選択時のエラー対策)
If Target.Count >= 1 Then
For i = 0 To Selection.Count - 1
If Selection(i + 1).Column = 9 Then '横方向選択時の対処
Cells(Target.Row + i, 12) = "" 'I列のデータをクリアするとL列もクリア
End If
Next
End If
Else
If Target.Count > 1 Then Exit Sub '入力時
Cells(Target.Row, 12) = Format(Now(), "YYYY/MM/DD")
End If
End Select
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
少し分かり難いところもあると思いますが、
調べながら作成したのであれば、サンプルを辿りながら調べれば
分かると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
複数処理 Worksheet_Change(ByVal Target As Range)
Visual Basic(VBA)
-
Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる
Visual Basic(VBA)
-
-
4
Private Sub Worksheet_Change が複数
Excel(エクセル)
-
5
ExcelのVBAでエラー13が出てしまいます。(泣き)
Excel(エクセル)
-
6
エクセルVBAのDeleteキーによるエラー
Excel(エクセル)
-
7
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
8
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
worksheet_changeがループする
PowerPoint(パワーポイント)
-
11
教えて For Each R In Target
Excel(エクセル)
-
12
Worksheet_Change(ByVal Target As Range)の下に複数範囲
Excel(エクセル)
-
13
エクセルマクロPrivate Subを複数にする方法
Excel(エクセル)
-
14
エクセルVBA シートモジュールにチェンジイベントを複数設定する方法を教えて下さい。 例えば、B列に
Visual Basic(VBA)
-
15
Worksheet_Changeの内容を標準モジュールから実行するには?
その他(プログラミング・Web制作)
-
16
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
17
エクセルVBA セルの入力後「Delete」キーを押したか判断するプログラム
Excel(エクセル)
-
18
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
19
UserForm1.Showでエラーになります。
工学
-
20
【VBA】Worksheet_changeイベントで特定のキーが押されたときだけ無効にしたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列の結合を空白行まで実行
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
【VBA】2つのシートの値を比較...
-
B列の最終行までA列をオート...
-
Changeイベントでの複数セルの...
-
VBAを使って検索したセルをコピ...
-
エクセルでフォームのチェック...
-
VBA 値と一致した行の一部の列...
-
VBAで、特定の文字より後を削除...
-
VBAで10行おきにセルの下に罫線...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
マクロ 最終列をコピーして最終...
-
VBAのFind関数で結合セルを検索...
-
rowsとcolsの意味
-
空白セルをとばして転記
-
追記する列を増やしたい 2つの...
-
【VBA】複数行あるカンマ区切り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報