• 締切済み

エクセルで、セルに値を入力して確定した時(フォーカスが隣に移動した時)に発生するイベントを教えてください!

値を入力した時点で、その値に従って、色々と処理をしたいのですが、その時のイベントが見つかりません。ご存じの方、教えていただけませんでしょうか。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

それは、次のコードに誤りがあるからです。 > Dim str As String > str = rngTarget.Value > MsgBox str #4 のコードでは A1、B1 ともに実行が許可されるセルとなってます。 つまり、A1:B1 を選択して Delキーを押せば、rngTarget には A1:B1 の 2つのセルが参照されています。  --> #5 のご回答2.の内容です。 この時、rngTarget.Value は A1 と B1 の2つの値を配列で返してますが、 それを受ける変数 str は、一つの値しか代入できない通常の文字列型変数 なので代入に失敗し、エラーになってます。 次のコードならエラーになりません。Address プロパティーは例え rngTarget が複数のセルであっても、「アドレスという一つの文字列データ」しか返さ ないからです。   str = rngTarget.Address #4 は複数セルの場合に対応させるコードで、Range コレクション という ものの理解が必須です。ちょっとイキナリ過ぎて、例示としては良くな かったですね。すみません。 まずは、単純に一つのセルのみで動作するコードを考えてみましょう。 ' Sample: A1 セルのときのみ実行する Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$A$1" Then     MsgBox Target.Value '<-- A1 単一セルであることが保証されている   End If End Sub とてもシンプルです。まずは、この使い方から理解を深めてみて下さい。 今後の話として説明しておきますが、このコードの場合、例えば A1:C10 セルに 対してデータの貼り付け、またはデータの削除などの操作を行った場合、A1 の 値が変化するにも係わらず、MsgBoxが実行されません。それは、Target.Address が A1:C10 となるので   If Target.Address = "$A$1" Then の論理式が False になる からですね。これでは困る場合、#4 のようなコードで対応することになります。

  • NCU
  • ベストアンサー率10% (32/318)
回答No.5

「フォーカスが隣に移動する」かどうかは入力後のセル移動設定の問題であり、本質ではありません。 Changeイベントは「隣に移動する」かどうかにかかわりなく、ワークシートのセルが変更されたときに発生します。 Changeイベントの認識する「Target」はあくまで変更されたセルです。移動先ではありません。念のため。 ここで注意すべきは、 1.セルの内容を削除した場合にも発生する。 2.セル範囲に対してコピーしたり削除した場合、セル範囲が「Target」と認識される。 3.Changeイベントのプロシージャ内でセルに変更を加えた場合にもイベントは発生するので、そのような処理をする場合は堂々巡りを回避する必要がある。(普通は一時的に EnableEvents プロパティの値を変更してイベントが発生しないようにする。) 以上。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

> フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント > があれば、安全なのだと思いますが‥。 いや、、、だからそのイベントが Worksheet_Change イベントですよ。使い方 の問題です。 #3 のご回答は、プログラムに不慣れな方が扱うにはある意味でその通りだと 思いますが、、 > こんなの自分で使う場合以外の人が使う例では使えないと思います。 そんなことはありません。Change イベントはごく一般的に使われますよ。 Change イベントに致命的欠陥があるわけではありませんし、意図通り動作 しない、エラーが発生するなどの多くの場合はプログラムに問題があるの であって、それを回避するコードを書くまでです。 #3 のご回答の真意は、「よくよくテストして下さい」だと思いますが、 それはどのようなプログラムであっても共通して言えることですしね。 Change イベント使い方のサンプルを提示しておきます。下記のソースコード ではセル A1,B:B,C1:D10,E1 以外が変化しても、コードの実行を終了させて 何事もなかったように振舞います。これは、 > フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベント と同意の動作ではないですか? ' シート上のセルの値が変化したとき発生 Private Sub Worksheet_Change(ByVal Target As Range)      ' 以下のコードの動作を許可するセルのアドレスを   ' カンマ区切りの文字列で定義しておきます   Const CELL_ADDRESS = "A1,B:B,C1:D10,E1"   Dim rngTarget As Range      ' Target には変化したセルが参照されていますので、   ' それを調べて、VBA コード動作させたいセル以外なら   ' 終了するようにします   ' また余計なセルが処理対象とならないように、   ' Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))   ' として Target を rngTarget に再定義します      Set rngTarget = Intersect(Target, Me.Range(CELL_ADDRESS))   If rngTarget Is Nothing Then Exit Sub        ' CELL_ADDRESS で定義したセルに対して実行させる処理を以下に記述   MsgBox "選択セル中、処理対象となったセルのアドレス:" & rngTarget.Address End Sub 余談ですが、ワークシート上で Enter イベントに相当するのは、 Selection_Change イベントですね。

chiichan7
質問者

お礼

遅くなりまして、すみませんでした。 お教えいただきましたコードで実行してみました。 Dim str As String str = rngTarget.Value MsgBox str としてみたのですが、おっしゃる通り、例えばA1とA2を一緒に選択してDeleteすると、 str = rngTarget.Value のコードのところで、”型が一致しません。”というエラーが出てしまいます。A1セルだけ選択してDeleteしても確かにエラーはでないのですが‥。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Enterイベントがないですね。 Changeイベントしかないが、Changeイベントは怖いですよ。 キャンセルやコピー貼り付けやDelete やよくテストしてください。 こんなの自分で使う場合以外の人が使う例では使えないと思います。 Application.EnableEvents=Falseを入れなければならない場合にも気をつけて。

chiichan7
質問者

お礼

経験のおありの方のご指導、ありがとうございました。本来は、フォーカスのセルの内容だけが変更・確定された場合にだけ起きるイベントがあれば、安全なのだと思いますが‥。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.2

特定のシートならシートのモジュールに Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Changed " & Target.Address End Sub ブック全体なら、ThsWorkBook のモジュールに Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) MsgBox "Changed Sheet " & Sh.Name & " " & Target.Address End Sub

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

シートモジュールの Worksheet_Change イベントです。

関連するQ&A

  • テキストボックスに値を入力し終わったらイベントを発

    エクセル2007を使用しています。 アクセスで言う「更新後処理」のAfterUpdateイベントは エクセルのActiveXコントロールのテキストボックスイベントにはないのでしょうか? 例えば、テキストボックスに「aiu」と入力し終わったらイベントを発生させたいのですが、 Private Sub TextBox1_Change() MsgBox "" End Sub にしすると 「a」を入力した時点で、MsgBox が表示されてしまいます。 テキストボックスに値を入力し終わったらイベントを発生させる方法はありますか? VBE画面でシートイベントを見ても AfterUpdateイベントは見当たりません。 ご回答よろしくお願いします。

  • 入力した値が不正というよりイベントが違いそうなので教えてください!

    入力した値が不正というよりイベントが違いそうなので教えてください! 今までの質問等で社員管理システムの社員マスタサブフォームのコードに 以下を入力することはできました。 Private Sub 開始日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(開始日) Then GoTo 終了処理 '『開始日』の前日の日付を『終了日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日" Resume 終了処理 End Sub Private Sub 終了日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(終了日) Then GoTo 終了処理 '『終了日』の翌日の日付を『開始日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "終了日" Resume 終了処理 End Sub これで終了日に日付を入力すると 2113:このフィールドに入力した値が不正です。 となるのを直したいです。 開始日と終了日は共に データ型 日付/時刻型 書式 yyyy/mm/dd です。 このイベントを作成する前はエラーにならなかったので 入力した値が不正というよりイベントが違いそうなので教えてください!

  • エクセルでセルに入力した値が消えてしまう

    1件質問させてください。 エクセル2013で時々発生するのですが、セルに値を入力したり、貼り付けたりした後、Enterキーを押すと入力した値が消えてしまうことがあります。 ちなみに、上の数式バーにはちゃんと入力した値が表示されていますので、入力自体はできているようなのですが、なぜかセルの部分には表示されないという現象に悩まされています。 確認したところ、文字が白に設定されている訳でもなく、表示形式も標準になっています。 セルがロックされていることもありませんでした。 さらに不思議なことに、この問題が起こったあと、別のソフト(例えばIEとかクロームとか・・・)を画面に出して、再びエクセルを画面に表示させると、消えていたセルの値がスーッという感じで湧き出るように表示されてくるのです。 その後はセルの値が消えることはないのですが。 なぜ、このような現象が起こるのでしょうか? 原因、対策をご存じの方いらっしゃいましたらご教示頂けると助かります。

  • テキストボックスに値入力でイベントが取得できない

    年月日テキストボックス(readonly)に、子ウインドウから値を選択して、表示させています。 可変で複数行あり、同じ値はエラーにしたいのですが、子ウインドウから値が入力された場合のイベント取得ができません。(onchangeは無視されます) なるべく入力をした時点でチェックしたのです。 よろしくお願いします。

  • Excelで、検索してヒットしたセルの隣のセルに値を入力したい

    Excelで、「検索してヒットしたセルのとなりのセルに、特定の値を 入力する」という作業をスムーズにできる方法を考えています。 具体的には在庫のチェックに使います。A列に品名が6000件ほどあって、 検索してヒットした品名の隣のセル(B列)に"●"を入力する作業です。 ただし、その隣のセル(B列)にはあらかじめ"○"が入力されています。 現在のところ、  ctrl+F で検索 → 該当するセルに"●"をペースト  で処理していますが、もっと効率的な方法をご存じないでしょうか。 少しでもマウスを動かしたりするのを減らしたいのです。 一つ考えているのは、以下のようにマクロを利用することです。 ユーザーフォーム  テキストボックス(検索する文字列の入力用)  コマンドボタン1(検索用)  コマンドボタン2(次を検索)  コマンドボタン3(前を検索)  ラベル(検索してヒットしたセルの値を確認する用)  コマンドボタン4("●"を該当セルに入力する用) ここまでたどり着いたのですが、お手上げになりました。 このような考えを実現するコードをお教えいただけないでしょうか。 あるいは、もっと楽なやり方があるということでしたら、それも お教えいただけないでしょうか。よろしくお願いします。

  • Excelのセルを入力できないようにしたいのですが・・・。

    Excelのあるセルを指定して、そのセルに何も入力できないようにしたいのです。 「データ-入力規制-全ての値」をチェックしてみたのですが、それではダメでした。 方法をご存知の方、教えてください!

  • Excelで一つのセルに複数の値を入力する方法

    Excelで一つのセルに複数の値を入力する方法はありますか? 現在の状況です↓ Seet1   A     B    C 1 項目1 項目2 項目3 2  Seet2   A    B   C 1 1/1  1/2   1/3 2  Sheet1のA2に1/1と入力するとSheet2のA2に項目1と入力され、 さらにSheet1のB2に1/1と入力すると Sheet2のA2に項目1項目2と二つの値が出るようにしたいのです。 今までは項目が二つだったため Aに1/1なら項目1 Bに1/1なら項目2 AとBに1/1と入力されていたら項目1項目2と出す というように無理やりIfで処理していたのですが、 項目名が増えてきたためすべての組み合わせをIfで処理できなくなってしまいました。 やはり関数では無理でしょうか?VBAは勉強し始めたばかりです。 どうか知恵をお貸しください。

  • エクセルでセルの値を同じにしたい時

    A1に入力された値が、B1に自動的に反映されるようにしたいのですが。 B1に入力する式を教えて下さい。

  • EXCELで入力セルの自動移動

     項目  値1 値2 値3 値4 値5  1 A1  B1 C1 D1 E2 F2 2 A2  B2 C2 D2 E2 3 A3 上記のような表で、横方向に入力の作業をする場合、0(ゼロ)を入力したら、次の行の項目セルに移動する方法はどのようにしたらよろしいのでしょうか。 F2に0を入力したらA2に、E2に0を入力したらA3にということですが。 よろしくお願いします。

  • richtextで入力文字列確定時にイベント

    VB6ですが、 RichTextBoxで文字列を入力し、変換終了後Returnキーにて、確定をした時のイベントを取得したい。 KeyPressイベントやkeydownイベントは変換確定時には、IMEに占有されていてイベントが起きないのです。 具体的にどんなソフトを作っているのかというと、 1.入力済みの文字列の一部(例えば「AB」)を反転して選択。 2.そして新しい文字列を入力(例えば「あいうえお」)。 3.Returnキーで確定時に反転していた文字列を新しく入力した文字列の「あいうえお」の「うえ」の間に挿入した文字列を入れたい。 4.結果は、「あいうABえお」と入力される。 というもの 入力時にイベントを起こせれば、自力で何とかなると思うのですが…… 文章下手で申し訳ありません。 よろしくお願いします。

専門家に質問してみよう