- ベストアンサー
VBA:イベントの使い方
ActiveXというのを使って、ある測定器から測定値をPC(エクセルシート)に取込んでいます(GPIB)。測定値は一行おきにエクセルに示されます。測定値を取り込んだ瞬間、作成したマクロによってそのときの時刻を隣の列に示したいのですがうまく表示できません。といいますかまずイベントが機能しません。どこが悪いのか教えてください。 Private Sub worksheet_change(ByVal target As Range) i = i + 1 Cells(4 + i, 1).Value = Now End Sub シート内に自動的に測定値が記述されるため、記述されることをイベントとして記述されたことで発生するマクロを記述したつもりです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です。 > どのような、思考でこのような記述を考えてらっしゃるのでしょうか? えっと、そんな深い思考とかではなくこの場合はこう書くって経験だけです。 Change イベントは引数の Target に Rangeオブジェクト が渡されます。 これは Target を調べれば変更のあった Rangeオブジェクト が解かると言う事です。 Target で渡される Rangeオブジェクト は1つとは限りません。「A1」もあれば「A1:A10」や「A1とB10:C20」のように連続した範囲であったり、バラバラの範囲であったりします。(複数範囲を選択してからセルに入力し、Ctrl+Enterで確定した場合など) 例えば卵のパックを Target とします。卵のパックは 6個入りも8個入りも10個入りも売っていて卵のパックと言うだけでは中身が卵だと解かるだけで、含まれる個数や個々の卵が割れていないかや、赤玉か白玉か等は不明です。 こういった場合にFor Each...Next ステートメントを使うと個々の要素を取り出して、どんな状態か調べたり、操作したり出来るのです。 先の例では Private Sub Worksheet_Change(ByVal Target As Excel.Range) 'r はRangeだよと宣言 Dim r As Range 'Target(複数かも知れない Rangeオブジェクト)の一つを r に代入 For Each r In Target 'もし r の列が 2(B列)なら If r.Column = 2 Then 'r の行は同じ(0)で、一つ前の列(2-1=1でA列)に Now を代入 r.Offset(0, -1).Value = Now End If '次の r を調べてね Next r End Sub って感じです。 Targetの要素を個別に調べる必要がなければ単純に Target を使っても良いです。 Private Sub Worksheet_Change(ByVal Target As Excel.Range) MsgBox "対象セルは " & Target.Address & " ですね" End Sub
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
シート名のタブを右クリックして、コードの表示を選び出てきたVBE画面に書きます。 B列に入力されるとA列日時が表示されるハズです。 Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub
補足
有難う御座います。私のコードでは、不十分でした。もし宜しければ、コードの意味を教えて頂きたいです。特に If r.Column = 2 Then です。rが範囲なので、2列目に新しく記述されればNowを表示はわかるのですが、その記述を私のような素人の思考では思いつきません。どのような、思考でこのような記述を考えてらっしゃるのでしょうか?もちろん経験が大きなことは承知しておりますが。宜しければ、是非お願い致します。
- space_needle
- ベストアンサー率48% (174/362)
ツール→マクロ→Visual Basic Editorを選んで、Visual Basic Editorを起動してください。 左上のプロジェクトウィンドウに、Microsoft Excel Object というフォルダがあり、そこにシート名の書かれたアイコンがあると思います。 それをダブルクリックして、現れたウインドウの左上のドロップダウンから、Worksheetを選び、右上のドロップダウンからChangeを選んでください。 上記の手順で、イベントプロシージャができますので、先の回答に記したコードを書いてください。 できましたら、当該シートに戻り、シートに文字を打ってください。 この手順でも、イベントは発生しませんか?
お礼
有難う御座います。イベント発生いたしました。本当に助かりました。
- space_needle
- ベストアンサー率48% (174/362)
Private Sub worksheet_change(ByVal target As Range) MsgBox "通過" i = i + 1 Cells(4 + i, 1).Value = Now End Sub まず、これを試してみてください。 "通過"というメッセージが出なければ、イベントが発生していません。 正しいシートにイベントプロシージャを書いているかどうか、Visual Basic Editorで確認してみてください。 あと、変数iが宣言されていないのが気になります。 どこかグローバル変数で宣言されているのでしょうか。 もし宣言されて無いのでしたら、イベントプロシージャのはじめに Static i As Long を追加してみてください。
補足
ご回答有難う御座います。しかし、無理でした。実行[F5]が表示されてもいませんでした。なので、シートに文字を打って、イベント発生を試みましたが無理でした。なぜでしょうか?「正しいシート」ではないのでしょうか。ただ、通常の Sub A() Msgbox "通過" End Sub は、きちんと機能します。宜しければよろしくお願いいたします。
お礼
分かりやすいご説明大変感謝しております。有難う御座いました。