アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (6件)

No.3 のお礼について



「Cells(.Row, 11).Value = Date」を「Cells(.Row, 11).Value = "●"」
「Cells(.Row, 11).NumberFormatLocal = "yyyy/mm/dd"」を「Cells(.Row, 11).NumberFormatLocal = "@"」
にそれぞれ直せば良いです。
    • good
    • 0
この回答へのお礼

早速ご回答いただき有難うございました。
解決出来ました。
有難うございました。

お礼日時:2017/01/17 12:17

こんにちは。



書いた人は、一応、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
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただき有難うございました。

お礼日時:2017/01/17 12:18

No.3 修正です。

(直さなくても動きますが…)

「Select Case Target.Column」を「Select Case .Column」にして下さい。
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただき有難うございました。

お礼日時:2017/01/17 12:19

簡単に言えば「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
---------------------------------------------------------------------------
※ 列の指定は列記号ではなく列番号を使っています。
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただき有難うございます。
続けて教えていただきたいのですが、後の方の処理ですが、
Case 12 To 14
Cells(.Row, 11).Value = Date
Cells(.Row, 11).NumberFormatLocal = "yyyy/mm/dd"

12~14を更新したら更新日付を表示するのではなく、●を表示したい場合はどのようにしたらよろしいでしょうか?

よろしくお願い致します。

お礼日時:2017/01/17 11:59

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イベント内にそれぞれ分岐された記述になるかと思います。
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただき有難うございました。

お礼日時:2017/01/17 12:46

「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

のような形になりますが、条件の決定はお任せします。
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただき有難うございました。

お礼日時:2017/01/17 12:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A