[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAのシートモジュールに2つのプロシージャを記載』(たしぷ)
エクセルでマクロを組んでいるのですが、
VBAのページでシートモジュールに2つのプロシージャを記載すると
1つ目は動いてくれますが、2つ目のプロシージャが動いてくれません。
シートモジュールに2つのプロシージャを記載するのはNGなのでしょうか?
教えてください。
< 使用 Excel:unknown、使用 OS:unknown >
いくつプロシジャを書いてもOKですが、『同じ名前のプロシジャ』は1つしか書けません。
その1つのプロシジャのなかで、やりたい2つのことを、それぞれ処理できるようにコーディングする必要があります。 (β) 2016/11/25(金) 21:03
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng1 As Range Dim Rng2 As Range Dim Tokuisaki
Set Rng1 = Columns("E") '得意先コードを入力する列を指定 Set Rng2 = Worksheets("得意先コード").Range("A1:B500") '得意先コードの範囲を指定
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Rng1) Is Nothing Then Exit Sub
Application.EnableEvents = False Tokuisaki = Application.VLookup(Target.Value, Rng2, 2, 0) If TypeName(Tokuisaki) <> "Error" Then Target.Offset(, 1) = Tokuisaki Else MsgBox "その得意先はありません" Target.ClearContents Target.Activate End If Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change2(ByVal Target As Range)
Dim Rng1 As Range Dim Rng2 As Range Dim Hinsyu
Set Rng1 = Columns("G") '品種コードを入力する列を指定 Set Rng2 = Worksheets("品種コード").Range("B1:D500") '品種コードの範囲を指定
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Rng1) Is Nothing Then Exit Sub
Application.EnableEvents = False Hinsyu = Application.VLookup(Target.Value, Rng2, 2, 0) If TypeName(Hinsyu) <> "Error" Then Target.Offset(, 1) = Hinsyu Else MsgBox "その得意先はありません" Target.ClearContents Target.Activate End If Application.EnableEvents = True
End Sub
(たしぷ) 2016/11/25(金) 21:23
これではだめです。
Worksheet_Change というプロシジャ名は、エクセルVBAで定められたプロシジャ名です。 そのシート上のセルに変更が加えられた時点で、エクセルVBAは、このプロシジャを動かします。 動かすプロシジャ名は 『Worksheet_Change』です。『Worksheet_Change2』なんてプロシジャがあっても エクセルVBAから見れば、Private Sub 花子(ByVal Target As Range) と書いてあるのと同じ。 エクセルVBAのイベント処理の対象外の、何かわからないプロシジャ という扱いになります。
あくまで、『1つの』Private Sub Worksheet_Change(ByVal Target As Range) の中で 2つの処理を行う必要があります。
コードの内容は精読していませんが、現在の、それぞれの
If なんとか なら Exit Sub
なんとかじゃない場合の処理
これを
If なんとかじゃない Then なんとかじゃない場合の処理 End If
If なんとかじゃない Then なんとかじゃない場合の処理 End If
といった形で組み合わせます。
テーマには関係ないのですが、Changeイベントで If Target.Count > 1 Then Exit Sub という処理、 βとしては、データ不整合の原因になり、書くべきではないと思いますが、これは、そのままにしてあります。
以下は組み合わせの一例です。コードの中身はそちらのコードのままです。
Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng1 As Range Dim Rng2 As Range Dim Tokuisaki Dim Hinsyu
If Target.Count > 1 Then Exit Sub
Set Rng1 = Columns("E") '得意先コードを入力する列を指定 Set Rng2 = Worksheets("得意先コード").Range("A1:B500") '得意先コードの範囲を指定 If Not Intersect(Target, Rng1) Is Nothing Then '★1
Application.EnableEvents = False Tokuisaki = Application.VLookup(Target.Value, Rng2, 2, 0) If TypeName(Tokuisaki) <> "Error" Then Target.Offset(, 1) = Tokuisaki Else MsgBox "その得意先はありません" Target.ClearContents Target.Activate End If Application.EnableEvents = True
End If '★1
Set Rng1 = Columns("G") '品種コードを入力する列を指定 Set Rng2 = Worksheets("品種コード").Range("B1:D500") '品種コードの範囲を指定
If Not Intersect(Target, Rng1) Is Nothing Then '★2
Application.EnableEvents = False Hinsyu = Application.VLookup(Target.Value, Rng2, 2, 0) If TypeName(Hinsyu) <> "Error" Then Target.Offset(, 1) = Hinsyu Else MsgBox "その得意先はありません" Target.ClearContents Target.Activate End If Application.EnableEvents = True
End If '★2
End Sub
(β) 2016/11/25(金) 21:51
もう1つの記述例。
Private Sub Worksheet_Change(ByVal Target As Range) Proc1 Target Proc2 Target End Sub
Private Sub Proc1(ByVal Target As Range)
現在の、そちらの Worksheet_Change プロシジャの中身をそのまま記述
End Sub
Private Sub Proc2(ByVal Target As Range)
現在の、そちらの Worksheet_Change2 プロシジャの中身をそのまま記述
End Sub
(β) 2016/11/25(金) 21:58
ご丁寧なアドバイス誠にありがとうございました。
(たしぷ) 2016/11/25(金) 22:07
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.