新規無料会員登録で1000名様に電子コミック1000円分が当たる!!

いつもお世話になっています。

色々しらべて試してみたんですが、うまくいかないんで教えてください。


CHANGEイベントに複数のイベントを書き込みたいんですが。

今現在、問題なく動いている以下のイベントがあります。

(1)
Private Sub Worksheet_Change(ByVal Target As Range)



Dim rang3 As Range
Dim rang4 As Range
Dim ■■ As String
Dim LastRow1 As Long

LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row
Set rang4 = Worksheets("○○").Range("b:I" & LastRow)
Set rang3 = Range("h4")

If Intersect(Target, rang3) Is Nothing Then Exit Sub


On Error Resume Next

■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0)
If Err.Number > 0 Then
MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"



Range("h4").Select


Else

Application.EnableEvents = False

Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False)
Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False)
Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False)
Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False)
Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False)

Application.EnableEvents = True



Range("K4").Select



End If



End Sub


このシートにもう一つ、イベントを入れたいのですが。

(2)
If Target.Count > 1 Then Exit Sub

If Intersect(Target, Range("E4")) Is Nothing Then

Exit Sub


Else

If Range("e4").Value = "1" Then
Target.Offset(0, 19).Value = "☆"

End If

どこに入れればいいのかわかりません。


(3)

また、(2)のイベントの他に、
(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。



(2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。
(3)については、まったくわかりません。

マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。


どなたか、教えてください。
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

No.3です。


こんなのでしょうか?
参照する"△△"シートを"Sheet2"としています。
>マクロがあるシート(△△)への入力は、4行目にE~X(左から右)へと順に入力していきます。
>E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合は、どうすればいいですか?
E4またはH4が変更された時にY4を変更する条件と値はわかりましたが、その前の「EからXに順に入力して・・・」の文の意味が、VBAで何かをして欲しいのか何もしないくていいのかわかりません。

それとシートの値を変更する条件が増えてゆくと、条件によってはWorksheet_Changeが多重にかかる場合が起きてくるので、今は不要ですが、Application.EnableEventsでの制御が必要になってくる可能性が出てくるかもしれません。


Private Sub Worksheet_Change(ByVal Target As Range)
changeH4 Target
changeE4 Target
End Sub

'(1)の処理
Sub changeH4(ByVal Target As Range)
Dim rng As Range
'処理条件
'変更されたセルがH4セルで値があったら実行 (それ以外は終了)
If Target.Address <> "$H$4" Then Exit Sub 'H4以外のchangeイベントなら終了
If Target.Value <> "" Then '空白でなく
'"△△"シート(Sheet2)のB列から探してなかったらエラーメッセージ出してH4選択
Set rng = Worksheets("Sheet2").Columns("B").Find(Target.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not rng Is Nothing Then
Range("I4").Value = rng.Offset(0, 1).Value
Range("J4").Value = rng.Offset(0, 2).Value
Range("K4").Value = rng.Offset(0, 6).Value
Range("L4").Value = rng.Offset(0, 7).Value
Range("M4").Value = rng.Offset(0, 4).Value
Range("K4").Select
checkY4 '転記した場合の追加イベント
Exit Sub
End If
MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"
End If
Range("H4:M4").Value = ""
Range("H4").Select
End Sub

'(2)の処理
Sub changeE4(ByVal Target As Range)
'E4が変更されたとき
If Target.Address <> "$E$4" Then Exit Sub
'1ならE4を右に19移動したセル(X4)を☆
If Target.Value = "1" Then
Range("X4") = "☆"
checkY4 '☆を書いた場合の追加イベント
Else
Range("X4") = ""
End If
End Sub

'(3)の処理
Sub checkY4()
Dim y4 As String
y4 = ""
'(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたい。
If Range("H4").Value <> "" Then
If Range("E4").Value = "1" Then
y4 = Range("H4").Value
End If
End If
'E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合
If Range("E4").Value = "" Then
If Range("H4").Value <> "" Then
y4 = Range("H4").Value
End If
End If
Range("Y4").Value = y4
End Sub
    • good
    • 0
この回答へのお礼

>EからXに順に入力して・・・」の文の意味が、VBAで何かをして欲しいのか何もしないくていいのかわかりません。

どのセルから入力していくか、という説明が必要かと思い、書かせていただきました。
わかりにくいことを書いてしまい、申し訳ありませんでした。

こちらの回答で、思った通りのことができました。
本当にありがとうございました。

お礼日時:2010/12/22 21:07

#2の回答者です。



>おっしゃる通りです。
というように反応されても、どういうイベントをさせるのか、コードの説明まで書いても、きちんちした説明をしていただけなったようです。私は、単に分からないということを伝えただけにすぎません。もともと、イベントを置くシートすら、明示されていません。

私は、他人のマクロをみて直すほど、みっともないことはしたくありませんが、どうやら、E4をイベントにしているようです。ただ、直接、お返事がいただけなかったということで、一応、こちらでは、訂正はせずに、そのまま様子見に切り替えさせていただきます。

それは、また、イベントですから、同種の違った種類のコードを入れることは、トラブルの元にもなります。

>(1)の処理に「もし、E4が空白だったら・・・・」の処理を入れればいいと思うのですが・・・。
If Range("E4").Value ="" Then

ということでも、それは、全体に関わる問題なのか、それとも、部分的なものなのか、はっきりしません。何か、同じ繰り返しになってしまうように思います。このような初歩的なマクロでは、きちんとした説明をまとめて、分かるようにしていただければ、長引くことはないはずです。
    • good
    • 0
この回答へのお礼

>このような初歩的なマクロでは、きちんとした説明をまとめて、分かるようにしていただければ、長引くことはないはずです。

自分のしたいことがうまくまとめられず、すいません。

不愉快な思いをさせていたら、申し訳ありません。
最初に回答をいただけて、嬉しかったです。
ありがとうございました。

お礼日時:2010/12/22 20:48

一体いくつのシートを使っているのかわからないのですが、プログラムではこのVBAがあるシートと"○○"シートと"△△"シートの3枚のようだけれど、チェックしてデータを持ってくる"○○"シートと"△△"シートは同じシートでなければチェックの意味が無いような気もします。


一体いくつのシートを使っているのでしょう?
一応3つのシートを使っていて、このVBAがあるシートをSheet1、"○○"シートをSheet2、"△△"シートをSheet3としています。


Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Change1 Target
Worksheet_Change2 Target
End Sub

'(1)の処理
Sub Worksheet_Change1(ByVal Target As Range)
Dim rng As Range
'処理条件
'変更されたセルがH4セルで値があったら実行 (それ以外は終了)
If Target.Address <> "$H$4" Then Exit Sub
If Target.Value = "" Then Exit Sub
'"○○"シート(Sheet2)のB列から探してなかったらエラーメッセージ出してH4選択
Set rng = Worksheets("Sheet2").Columns("B").Find(Target.Value, LookIn:=xlValues, LookAt:=xlWhole)
If rng Is Nothing Then
MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"
Range("h4").Value = ""
Range("h4").Select
Exit Sub
End If
'"△△"シート(Sheet2)のB列から探してあったらその行の値をコピー
Set rng = Worksheets("Sheet3").Columns("B").Find(Target.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not rng Is Nothing Then
Range("I4").Value = rng.Offset(0, 1).Value
Range("j4").Value = rng.Offset(0, 2).Value
Range("k4").Value = rng.Offset(0, 6).Value
Range("l4").Value = rng.Offset(0, 7).Value
Range("m4").Value = rng.Offset(0, 4).Value
Range("K4").Select
additional_event '転記した場合の追加イベント
Else
Range("h4").Value = ""
Range("h4").Select
End If
End Sub

'(2)の処理
Sub Worksheet_Change2(ByVal Target As Range)
'E4が変更されたとき
If Target.Address <> "$E$4" Then Exit Sub
'1ならE4を右に19移動したセル(X4)を☆
If Target.Value = "1" Then
Range("X4") = "☆"
additional_event '☆を書いた場合の追加イベント
Else
Range("X4") = ""
End If
End Sub

'(3)の処理
Sub additional_event() '星を書いた場合の追加イベントif
If Range("H4").Value = "" Then Exit Sub
If Range("E4").Value <> "1" Then Exit Sub
Range("Y4").Value = Range("H4").Value
End Sub
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

>一体いくつのシートを使っているのかわからないのですが

文章がわかりづらく、すいません。

シートは、マクロがあるシート(△△)と、もう一枚(○○)の2枚です。
が、作っていただいたコードを転記したところ、希望道理の結果になりました。

ありがとうございます。


また、もうひとつ、お聞きしたいことがあるのですが・・・。

マクロがあるシート(△△)への入力は、4行目にE~X(左から右)へと順に入力していきます。
E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合は、どうすればいいですか?

最初の質問にないことで申し訳ないのですが、教えていただけますか?

(1)の処理に「もし、E4が空白だったら・・・・」の処理を入れればいいと思うのですが・・・。

申し訳ありません。
お願いします。

お礼日時:2010/12/21 12:29

>(3)についてが、動きません。



言葉の解釈通りなら、間違いないはずです。位置関係の問題だろうと思いますから、
以下のコードの説明を読んで修正してください。

動きませんと言われても、マクロは可動していますから、こちらでは確認できません。

>(3)
>また、(2)のイベントの他に、
>(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。

しかし、この文章が、(2)に連動しているのではなく、(1)側のマクロに連動しているのか、または、まったく別のキーのイベントというならは、これは、話が違います。思惑と違うというのは、説明が抜けているのかと思います。

  'E4を対象とする。
 ElseIf Not Intersect(Target, Range("E4")) Is Nothing Then '(2)
   'E4 に1を入れる
  If Target.Value = 1 Then 
   'X4に☆が入る
   Target.Offset(0, 19).Value = "☆"
   'もし、H4に値が入っていれば、
   If Target.Offset(0, 3).Value <> "" Then '(3) 
   'Y4にH4の値が入る
    Target.Offset(0, 20).Value = Target.Offset(0, 3).Value
   End If
  End If
 End If
    • good
    • 0
この回答へのお礼

遅くなり、申し訳ありません。
回答、ありがとうございます。

>(3)
>また、(2)のイベントの他に、
>(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。

しかし、この文章が、(2)に連動しているのではなく、(1)側のマクロに連動しているのか、または、まったく別のキーのイベントというならは、これは、話が違います。思惑と違うというのは、説明が抜けているのかと思います。

おっしゃる通りです。
すいません。

(1)(2)(3)とも、値が変わった時、CHANGEイベントで発生させたいと思っておりました。
説明が足りず、申し訳ありませんでした。

お礼日時:2010/12/21 12:04

私は、最後まで回答できないかもしれませんが、それだけはご了解ください。


私個人は、以下のような書き方はしませんが、一応、書き換えた部分は見てください。
細かな注意点を書こうかとは思いましたが、やめることにしました。

If Target.Count > 1 Then Exit Sub
これは、その目的の意味にもよりますが、通常、Changeイベントにするなら、先頭においてもよいかと思います。本来は、それとともに、その次の行に、If Target.Value ="" Then Exit を入れます。

おそらく、「実は、これはH列とE列を対象にしています」というかもしれませんが、それは、なるべくご自身で考えてください。ある程度は対応するように考えています。

'//
Private Sub Worksheet_Change(ByVal Target As Range)
 'Dim rang3 As Range '不要
 Dim rang4 As Range
 Dim rang5 As Range '加入
 Dim sText As Variant
 'Dim LastRow1 As Long '不要
 If Target.Count > 1 Then Exit Sub
 Application.EnableEvents = False
 If Not Intersect(Target, Range("H4")) Is Nothing Then
  With Worksheets("○○")
   Set rang4 = .Range("B1", .Cells(Rows.Count, "B").End(xlUp).Offset(, 7))
  End With
  On Error Resume Next
  sText = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0)
  If Err.Number > 0 Then
   MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"
   Range("H4").Select
   Set rang4 = Nothing
  Else
   With Worksheets("△△")
     Set rang5 = .Range("B1", .Cells(Rows.Count, "B").End(xlUp).Offset(, 7))
   End With
   Range("J4").Value = WorksheetFunction.VLookup(Target.Value, rang5, 3, False)
   Range("K4").Value = WorksheetFunction.VLookup(Target.Value, rang5, 7, False)
   Range("L4").Value = WorksheetFunction.VLookup(Target.Value, rang5, 8, False)
   Range("M4").Value = WorksheetFunction.VLookup(Target.Value, rang5, 5, False)
   Range("K4").Select
   Set rang5 = Nothing
  End If
 ElseIf Not Intersect(Target, Range("E4")) Is Nothing Then '(2)
  If Target.Value = 1 Then
   Target.Offset(0, 19).Value = "☆"
   If Target.Offset(0, 3).Value <> "" Then '(3)
    Target.Offset(0, 20).Value = Target.Offset(0, 3).Value
   End If
  End If
 End If
 Application.EnableEvents = True
End Sub

この回答への補足

ありがとうございます。
後ほど、確認の上、報告させていただきます。

補足日時:2010/12/20 10:04
    • good
    • 0
この回答へのお礼

遅くなり、申し訳ありません。
回答、ありがとうございます。

元からあるVBAについても、きれいに書き直していただき、ありがとうございます。


(2)については、問題なく動きました。ありがとうございます。

ですが・・・。
(3)についてが、動きません。


もしよろしければ、教えていただきたいです。

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

お礼日時:2010/12/20 17:00

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル イベントマクロ Changeイベントを複数作りたい

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub

以下マクロの内容

End Sub

これでセルA1が変わるとイベントマクロが発生しますが
セルB1が変わると別のマクロが発生し
セルC1が変わるとまた別のマクロが発生し…とするには
どうすればよいのですか
単純に並べて書いたらだめみたいだったんですけど

Aベストアンサー

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$A$1"
 A1のマクロ文
Case "$B$1"
 B1のマクロ文
Case "$C$1"
 C1のマクロ文
・・・・
End Select
End Sub
こんな感じでは?

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

QExcel VBAでのWorksheet_Changeが動作しない原因

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = Falseを入れてあります。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C3")) Is Nothing Then
Exit Sub
Else
Application.EnableEvents = False
Call test
Application.EnableEvents = True
End If
End Sub

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = ...続きを読む

Aベストアンサー

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かします。そしてマクロが、正しく動いているかチェックします。そして、そのマクロが、再び、戻ってくるかどうか、様子をみます。
ただし、今回のマクロは途中で止めると、Application.EnableEvents = True に戻っていないことがありますから、イミディエイトウィンドウあたりで、設定を戻したほうがよいです。

また、初心者ならでは失敗は、Test プロシージャが、標準モジュールか、そのシートモジュールのどちらかに置いていないのが原因だったりします。

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かし...続きを読む

QEXCEL あるセルに数字が入力されれば既存マクロ実行させたい

ボタン等のグラフィックオブジェクトのマクロ実行は簡単なのですが、
ある位置のセルにデーターが入力されれば、
既存のマクロを自動実行させることできますか?

Aベストアンサー

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range(ある位置) <>"" then call 既存のマクロ名
End Sub

ある位置と既存のマクロ名を変更して使ってみてください。
あと このVBAは 操作するワークシートのほうに記述します。

Qエクセルvba  (ByVal Target As Range)について

シートのイベントプロシージャーが
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
となりますが
(ByVal Target As Range)部分は何なのでしょうか?
何のためにあるのかわかりません。

Private Sub Worksheet_SelectionChange()
End Sub
としたらエラーが返ってきました。

理由を教えてください。
よろしくお願いします。

Aベストアンサー

こんにちは
>Target=ActiveCell
>と言う認識でよろしいでしょうか?
#5でKenKen_SPさんが説明されていますが、補足です。

セルを一つだけ選択したときには、

Target=ActiveCell
と考えても問題ありません

しかし、複数の範囲を選択したときは、
Target=ActiveCell
はなりません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
です。

注!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
成り立っていますが、そうでない場合もあります。
Selectionは「選択されている物」という意味です。
そのために、場合によって内容が異なります。
例えば、オートシェイプが選択されているときには、Selectionは選択されているオートシェイプになります。


以下のコードを試してみてください。
上段にTargetのアドレス
中段にActiveCellのアドレス
下段にSelectionのアドレス
が表示されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address & Chr(13) & ActiveCell.Address & Chr(13) & Selection.Address
End Sub

こんにちは
>Target=ActiveCell
>と言う認識でよろしいでしょうか?
#5でKenKen_SPさんが説明されていますが、補足です。

セルを一つだけ選択したときには、

Target=ActiveCell
と考えても問題ありません

しかし、複数の範囲を選択したときは、
Target=ActiveCell
はなりません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
です。

注!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
成り立...続きを読む

QExcelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。

タイトルの通りです。
Excelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。
ご存知の方がいらっしゃいましたら教えて下さい。

Aベストアンサー

WorksheetのChangeイベントで出来ます。
イベントの引数で値の変わったセルのRangeオブジェクトがわたってくるので、マクロを実行させることができます。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qworksheet_changeがループする

worksheet_change イベントでの質問です。シートに文字が入力された時に、他のセルに値をコピーしたいのですが、一つ目の値を代入した時点で、再びchangeイベントが発生して、この関数の頭に戻ってしまいます。実行中は、changeイベントを発生しないようにできないのでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i, j As Integer

j

Aベストアンサー

下記ページの「Changeイベント」が参考になります。

Excel(エクセル) VBA入門:ワークシートのイベント
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。


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

このカテゴリの人気Q&Aランキング