EXCELでマクロで2つの作業をしたいのですが、「コンパイルエラー 名前が適切ではありません。Worksheet_Change」とエラーメッセージが表示されます。
やりたい事は下記の通りとなります。
マクロの知識が乏しく、ご教授いただきますようお願い致します。
1.F列~I列のセルを更新すると(新規入力、削除 ※具体的には●を表示する、しないのどちらかです)、E列に更新日付が表示される。
EX.F3セルを更新するとE3セルに更新日付が表示される。F4セルを更新するとE4セルに更新日付が表示される。
2.L列~N列のセルを更新すると(新規入力、削除、更新 ※具体的には日付や文字列の入力、削除、更新です)、K列に更新日時が表示される。
EX.L3セルを更新するとK3セルに更新日付が表示される。L4セルを更新するとK4セルに更新日付が表示される。
2つ目のPrivate Sub Worksheet_Change(ByVal Target As Range)の部分の記載を変更すればよいのと思いますが、どのような記載にすればよいのか分かりません。
VBA画面では11行目のEnd Subの下に横線が自動で表示されています。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("F:I")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Row > 2 And .Value <> "" Then
With Cells(.Row, "E")
.Value = Date
.NumberFormatLocal = "yyyy/mm/dd"
End With
End If
End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("L:N")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Row > 2 And .Value <> "" Then
With Cells(.Row, "K")
.Value = Date
.NumberFormatLocal = "yyyy/mm/dd"
End With
End If
End With
End Sub
No.5
- 回答日時:
こんにちは。
書いた人は、一応、VBAの分かる方のようですが……。
なお、同じ目的のイベントは、全部で大雑把に4つありますが、そんなバカなことをする人はいないのです。管理しにくくなるからです。95時代の標準モジュール・イベント、通常のシート・イベント、ワークブックイベント、残りはクラスイベントです。いずれは、クラスに淘汰されると思います。
>.Value = Date
>.NumberFormatLocal = "yyyy/mm/dd"
これは、一般的には逆ですね。たぶん、これでも問題ないだろうという所なのでしょうが、書式は先にします。
それから、書き方ですが、除外条件を最初に羅列してしまうのが良い方法です。
条件の受け入れ度の大きいほうから、順番にします。それと、なるべく同じコードは書かないというのが、原則です。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Long
If Target.Count > 1 Then Exit Sub
If Target.Row < 3 Then Exit Sub
If Not Intersect(Target, Range("F:I")) Is Nothing Then
cl = 5
If Trim(Target.Value) <> "●" Then Exit Sub
ElseIf Not Intersect(Target, Range("L:N")) Is Nothing Then
cl = 11
End If
Application.EnableEvents = False '入力がイベントをコールするから
With Cells(Target.Row, cl)
.NumberFormatLocal = "yyyy/mm/dd"
.Value = Date
End With
Application.EnableEvents = True
End Sub
No.4
- 回答日時:
No.3 修正です。
(直さなくても動きますが…)「Select Case Target.Column」を「Select Case .Column」にして下さい。
No.3
- 回答日時:
簡単に言えば「Private Sub Worksheet_Change(ByVal Target As Range)」が2つあるのでエクセルがどちらを実行していいか判らないのでエラーが出ているだけです。
内部で処理を分岐させれば良いと思います。具体的には以下のような感じです。
---------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Count > 1 Then Exit Sub
If .Row < 2 Then Exit Sub
If .Value = "" Then Exit Sub
Select Case Target.Column
Case 6 To 9
Cells(.Row, 5).Value = Date
Cells(.Row, 5).NumberFormatLocal = "yyyy/mm/dd"
Case 12 To 14
Cells(.Row, 11).Value = Date
Cells(.Row, 11).NumberFormatLocal = "yyyy/mm/dd"
End Select
End With
End Sub
---------------------------------------------------------------------------
※ 列の指定は列記号ではなく列番号を使っています。
ご丁寧に教えていただき有難うございます。
続けて教えていただきたいのですが、後の方の処理ですが、
Case 12 To 14
Cells(.Row, 11).Value = Date
Cells(.Row, 11).NumberFormatLocal = "yyyy/mm/dd"
12~14を更新したら更新日付を表示するのではなく、●を表示したい場合はどのようにしたらよろしいでしょうか?
よろしくお願い致します。
No.2
- 回答日時:
11行目と12行目を消せばいけそうな気がします。
理由はNo1の方が書かれている通りで、WorksheetのChangeイベントが同じシート内に2つあるからかと。
1つのChangeイベント内にTargetが("F:I")の場合と、("L:N")の場合の分岐で処理があればよいので
11行目:End Sub
12行目:Private Sub Worksheet_Change(ByVal Target As Range)
を消せば1つのChangeイベント内にそれぞれ分岐された記述になるかと思います。
No.1
- 回答日時:
「Private Sub Worksheet_Change」
は、おそらく他のファイルやシートからコピーしたものですね。
このプロシージャは、シートが変化したときに発生するイベント用に準備されている物で、1つのシートに1つしか存在できません。
同じ名前の物が2つあるから、「名前が変ですよ!」って怒られているんです。
>1.F列~I列のセルを更新すると(新規入力、削除 ※具体的には●を表示する、しないのどちらかです)、E列に更新日付が表示される。
EX.F3セルを更新するとE3セルに更新日付が表示される。F4セルを更新するとE4セルに更新日付が表示される。
>2.L列~N列のセルを更新すると(新規入力、削除、更新 ※具体的には日付や文字列の入力、削除、更新です)、K列に更新日時が表示される。
EX.L3セルを更新するとK3セルに更新日付が表示される。L4セルを更新するとK4セルに更新日付が表示される。
を条件で分離して、
「Private Sub Worksheet_Change」
内に記述しないとだめですね。
if 条件1 then
(1つ目の処理)
>With Target
>If .Row > 2 And .Value <> "" Then
>With Cells(.Row, "E")
>.Value = Date
>.NumberFormatLocal = "yyyy/mm/dd"
>End With
>End If
>End With
elseif 条件2 then
(2つ目の処理)
>With Target
>If .Row > 2 And .Value <> "" Then
>With Cells(.Row, "K")
>.Value = Date
>.NumberFormatLocal = "yyyy/mm/dd"
>End With
>End If
>End With
else
end if
のような形になりますが、条件の決定はお任せします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
同じシート内にイベントプロシージャが二つある時
Excel(エクセル)
-
Excel マクロ VBA プロシージャが大きすぎます のエラー対処方法
Visual Basic(VBA)
-
-
4
EXCEL あるセルに数字が入力されれば既存マクロ実行させたい
Excel(エクセル)
-
5
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
6
エクセルマクロPrivate Subを複数にする方法
Excel(エクセル)
-
7
エクセルVBA シートモジュールにチェンジイベントを複数設定する方法を教えて下さい。 例えば、B列に
Visual Basic(VBA)
-
8
End Sub が必要です。
Access(アクセス)
-
9
VBA マクロ実行時エラー’1004RangeクラスのPasteSpecialメソッドが失敗
Access(アクセス)
-
10
エクセルVBAが対応できるプログラムの大きさ
その他(Microsoft Office)
-
11
EXCEL VBA 複数のシートに同じイベントプロシジャを書く場合
Excel(エクセル)
-
12
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
13
エクセル ダブルクリック入力の範囲が複数の場合
Excel(エクセル)
-
14
Vba初心者です。下記のコード助けてください Loopに対するDoがありませんと表示されます Sub
オープンソース
-
15
【vba】指定範囲の中に任意の文字があるときの条件分岐
Excel(エクセル)
-
16
エクセルマクロ セルをクリックするたびに記号を入力
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで、A2のセルにA3...
-
エクセル1行おきのセルを隣の...
-
SUMIF関数で、「ブランク以外を...
-
文字列から英数字のみを抽出す...
-
エラー「#REF」の箇所を置き換...
-
Excel 特定の倍数の個数を数え...
-
AVERAGE関数とINDIRECT関数を使...
-
自分の左隣のセル
-
最大値となるセルの絶対番地を...
-
EXCELでマイナス値の入ったセル...
-
Excel2003でif関数を使う...
-
絶対参照
-
Excel 分を時間で表示したい
-
EXCELのcountif関数での大文字...
-
セルを結合した時のエクセル集...
-
【Excel】4つとばしで合計する方法
-
EXCELのVLOOK 関数で「#N/...
-
エクセル シート全体の項目をカ...
-
エクセルに入力後、別シートの...
-
エクセル(英語リスト)で大文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SUMIF関数で、「ブランク以外を...
-
文字列から英数字のみを抽出す...
-
エクセル1行おきのセルを隣の...
-
自分の左隣のセル
-
エクセルで、指定の値よりも大...
-
excelで、空白を除いてデータを...
-
セルを結合した時のエクセル集...
-
EXCELでマイナス値の入ったセル...
-
エクセルで、A2のセルにA3...
-
エクセルで特定のセル内にだけ...
-
EXCELのcountif関数での大文字...
-
エクセルに入力後、別シートの...
-
同一セル内の重複文字を削除し...
-
【Excel】4つとばしで合計する方法
-
条件付き書式の色付きセルのカ...
-
【Excel】IF文「ある文字を含ん...
-
エクセルで年月日から月日のみへ
-
エクセルでエンターを押すと任...
-
エラー「#REF」の箇所を置き換...
-
Excelで大量のセルに一気に関数...
おすすめ情報