• ベストアンサー

VBA:イベントの使い方

ActiveXというのを使って、ある測定器から測定値をPC(エクセルシート)に取込んでいます(GPIB)。測定値は一行おきにエクセルに示されます。測定値を取り込んだ瞬間、作成したマクロによってそのときの時刻を隣の列に示したいのですがうまく表示できません。といいますかまずイベントが機能しません。どこが悪いのか教えてください。 Private Sub worksheet_change(ByVal target As Range) i = i + 1 Cells(4 + i, 1).Value = Now End Sub シート内に自動的に測定値が記述されるため、記述されることをイベントとして記述されたことで発生するマクロを記述したつもりです。

  • e-l
  • お礼率45% (158/349)

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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

e-l
質問者

お礼

分かりやすいご説明大変感謝しております。有難う御座いました。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

シート名のタブを右クリックして、コードの表示を選び出てきた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

e-l
質問者

補足

有難う御座います。私のコードでは、不十分でした。もし宜しければ、コードの意味を教えて頂きたいです。特に If r.Column = 2 Then です。rが範囲なので、2列目に新しく記述されればNowを表示はわかるのですが、その記述を私のような素人の思考では思いつきません。どのような、思考でこのような記述を考えてらっしゃるのでしょうか?もちろん経験が大きなことは承知しておりますが。宜しければ、是非お願い致します。

回答No.2

ツール→マクロ→Visual Basic Editorを選んで、Visual Basic Editorを起動してください。 左上のプロジェクトウィンドウに、Microsoft Excel Object というフォルダがあり、そこにシート名の書かれたアイコンがあると思います。 それをダブルクリックして、現れたウインドウの左上のドロップダウンから、Worksheetを選び、右上のドロップダウンからChangeを選んでください。 上記の手順で、イベントプロシージャができますので、先の回答に記したコードを書いてください。 できましたら、当該シートに戻り、シートに文字を打ってください。 この手順でも、イベントは発生しませんか?

e-l
質問者

お礼

有難う御座います。イベント発生いたしました。本当に助かりました。

回答No.1

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 を追加してみてください。

e-l
質問者

補足

ご回答有難う御座います。しかし、無理でした。実行[F5]が表示されてもいませんでした。なので、シートに文字を打って、イベント発生を試みましたが無理でした。なぜでしょうか?「正しいシート」ではないのでしょうか。ただ、通常の Sub A() Msgbox "通過" End Sub は、きちんと機能します。宜しければよろしくお願いいたします。

関連するQ&A

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • エクセルマクロのchangeイベントについて

    こんばんわ changeイベントを使ってみようと思い、下記のマクロを作ってみたのですが、どうしても動きません。 Private Sub Worksheet_Change(ByVal Target As Range) Set Target = Range("b4") Application.DisplayAlerts = False Dim i As Long Workbooks.Open Filename:="c:\osaruPKsarch\sarch.xls"  For i = 1 To 5 Step 1   Cells(3, i + 50) = Cells(7, i + 50)  Next i End Sub なぜ動かないのかもわかりませんToT アドバイスの程よろしくお願いいたします。

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- 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 イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

  • VBAのchangeイベントについて

    初質問&VBA初心者のため記述が変なところがあると思いますがご了承ください。 現在changeイベントを使用してイメージした通りに動いてくれている(中身はぐちゃぐちゃですが・・・)のですがこれをすべてのシートでも機能するようにしたいのですが何かいい方法はないでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub rc = MsgBox("納車日を更新してもよろしいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then MsgBox "納車日を更新しました" RID = ActiveSheet.Name Set b = Worksheets("シート名").Cells.Find(What:=RID) RID_height = Worksheets("シート名").Cells.Find(RID).Row RID_width = Worksheets("シート名").Cells.Find(RID).Column ThisWorkbook.Worksheets("シート名").Cells(RID_height, 10).Value = Date Else MsgBox "処理を中断します" End If End Sub

  • エクセルVBA/シートのチェンジイベントを発生させない方法?

    Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "イベント発生" End Sub このワークシートがアクティヴになってるときに手入力された場合以外、チェンジイベントを発生させなくするにはどのような方法があるでしょうか? 標準モジュール記載の他のマクロでセルが変更された場合を無視したいのです。 よろしくお願いします。

  • ステップモードの動作確認方法

    エクセルマクロ初心者です。 シート1にPrivate Sub Worksheet_Change(ByVal Target As Range) イベントを書き込みました。 ステップモードで動作確認したいのですが、どうすればいいのでしょうか? どなたか教えてください!お願いします! (Excel2003です)

  • シートのイベント VBA

    シートをクリックしたらシートをクリアしたいのですが クリックするセルがA1の場合は、マクロを実行させたくないのですが 下記のコードだとエラーになってしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Target.Range = Range("a1") Then Cells.Clear End If End Sub ”Range("a1")でなければ、Cells.Clearする” にはどうすればいいですか?

  • エクセルVBAのイベントについて教えてください。

    エクセルVBA初学者のです。 "C9"にいれるとchangeイベントが発生するコードなんですが、 "C9"のほかに"D1"においてもchangeイベントを発生させたいのですが 下記のコードに続けて書いてもイベントが発生しないのですが どのように書けばよいのでしょうか? private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub Range("H14:H56").Interior.ColorIndex = 2 If Intersect(Target, Range("D1")) Is Nothing Then Exit Sub Range("G14:G56").Interior.ColorIndex = 2 End Sub よろしくお願いします。

  • EXCEL VBA Worksheet Chang

    EXCELのシートが変更されたらWの列に更新Timeスタンプをセットします。 Worksheet_Changeイベントに以下のように配置して動作させています。 Private Sub Worksheet_Change(ByVal Target As Range) Cells(Target.Row, "W") = Now End Sub この場合、行の挿入、削除の場合、挿入前、削除後の行が更新されてしまいます。 行の挿入、削除の場合に上記コードを実行させないようにするにはどうすればよいでしょうか? よろしくお願いします。

  • VBA:イベントの準備を別のイベントにより行いたい。詳しくは↓↓↓↓↓↓↓↓↓↓↓↓↓

    VBAのイベントについて質問です。イベント1と勝手に私が定義したイベント処理があると致します。通常は、ある動作の後イベント1が発生する仕組みですが、これを例えばKYE[t]を押すという動作により始めて、イベント10が起動できる準備に入り、さらにある別の動作に入ると初めてイベント1が動作するというようにしたいです。 私は大まかには以下の二つの連結で成立つと考えています。宜しくお願い致します。 1.Application.OnKey "^{t}", "イベント1" 2.Private Sub Worksheet_Change(ByVal Target As Excel.Range) '⇒例としてこれをイベント1とする。