• 締切済み

エクセルのVBプログラムについて

インターネット上にあった 下記のVBプログラムをエクセルで使用しているのですが、 セルの変化を数値入力後、「エンター」を押さなければ認識しません。 『 ='Sheet2'!N13 』のように他のシートから数値を取り、その変化で、 メッセージボックスを起動させたいのですが、上手くいかないのです。 何方か、対処方法、宜しく御願いします。 : 次のサンプルは、値を変更したセルがセルA1~B5に含まれる場合にのみ、 メッセージボックスを表示します。 対象とするワークシートのシートモジュールに記述してください。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:B5")) Is Nothing Then Exit Sub Else MsgBox "セルの値が変更されました" End If End Sub

みんなの回答

回答No.3

こんばんは。 少し、質問に疑問があります。 >『 ='Sheet2'!N13 』のように他のシートから数値を取り、その変化で、 >メッセージボックスを起動させたいのですが、上手くいかないのです。 >セルの変化を数値入力後、「エンター」を押さなければ認識しません。 これって、Sheet2のN13が自動的に、値が変動するのでしょうか? 言い換えると、Enterなしで、イベントを感知するものではありませんか? 私の勘違いでなければ、かなり、昔からある質問です。Microsoft にも載っていた質問です。昔ですと、DDEから入ってくる値を監視するという類のものです。 今は、ActiveX コントロールにそういうものがありますね。 そういう場合は、Class 側から、新しいイベントを作ってあげ、APIタイマーで常に、セルを監視するそうです。しかし、古い方法(2000以降)の方法としては、=Now()を見えない所に置き、Worksheet_Calculateイベントを取ります。2000より以前ですと、OnCalculate メソッドを使っていました。 どういうものか、もう少し詳しく教えてください。 もし、私の書いている内容が的外れなら、無視して構いません。

kei0214
質問者

お礼

DDE、ActiveX コントロール、まだ、不勉強な未知の領域のものなので、 セルや値の変化をどのように処理しているのか、申し訳ない状態なのですが、 今回の事で、計算式によって起動するものと、セルの変化によって起動する ものがあることを理解しました・・・ 現状は、Worksheet_Change をWorksheet_Calculate に変化させ、 無事、起動しております。画面の左下の準備完了の表示が繰り返し、点滅するため、 プログラムが絶えずセル、計算式の変化の監視状態にあるのかもしれませんが、 この件に関しての不具合、負荷などがなければ何とかなりそうです。 コメントありがとうございました。

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.2

シート2のN13の値変更でシート1にメッセージを表示したいというのであれば下記方法で可能です。 sheet2のシートモジュールに下記をコピペで可能です。 シートモジュールと標準モジュールの違いを理解して下さい。 http://vbae.odyssey-com.co.jp/column/no15_1.html 上記サイトに記載していますが、VBAprojectのsheet2をWクリックするとsheet2のシートモジュールが表示さます。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("N13")) Is Nothing Then Exit Sub Else Worksheets("sheet1").Activate MsgBox "セルの値が変更されました" End If End Sub

kei0214
質問者

お礼

オブジェクト、フォーム、モジュール、それぞれの知識に曖昧な部分があり、いざ、プログラムを走らせるとデバックを必要とされることが多々あるのですが、参考となりました。このまま使用出来そうなので、助かりました。ありがとうございます。

  • weboner
  • ベストアンサー率45% (111/244)
回答No.1

Private Sub Worksheet_Changeで取得するTargetは実際に変更したセルになります 質問の内容であれば'Sheet2'!N13がTargetセルになります 参照元と参照先の関係はややこしいのですが http://veaba.keemoosoft.com/2012/12/233/ ↑ これが参考になれば

kei0214
質問者

お礼

大変参考になりました。 まだ、数式と値の変化の読み取りに関して、認識がなく 混乱しておりました。 ありがとうございます。

関連するQ&A

  • VBA シートプログラムでRangeエラー

    いつもお世話になっております。 Excel2003を使用しております。 シートに直接プログラムを書いています。 (例として、Sheet1とします) シートの内容が変わったときに、色々プログラムを実行していこうと思っているのですが、 Private Sub Worksheet_Change(ByVal Target As Range) のTargetが上手く取得できていない気がします。 今までは上手く動いていたのですが、 急にTargetの値に数値(セルに入力した値)が入ってしまうようになり 上手く組めなくて困っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 開始1 As Range Dim 終了1 As Range Dim 開始2 As Range Dim 終了2 As Range Set 開始1 = Range("D5:D63") Set 終了1 = Range("E5:E63") Set 開始2 = Range("F5:F63") Set 終了2 = Range("G5:G63") If ThisWorkbook.ActiveSheet.ProtectContents Then '保護かかってたら End '強制終了 End If If Not Application.Intersect(Target, 開始1) Or Application.Intersect(Target, 実績日開始2) Is Nothing Then Call 開始(Target, 開始1, 開始2) ElseIf Not Application.Intersect(Target, 終了1) Or Application.Intersect(Target, 終了2) Is Nothing Then Msgbox "テスト!" End If End Sub '----------------------------------------------- Sub 開始(ByVal Target As Range, 開始1 As Range, 開始2 As Range) If Not Application.Intersect(Target, 開始1) Is Nothing Then MsgBox Target.Row End If If Not Application.Intersect(Target, 開始2) Is Nothing Then MsgBox Target.Row + 1 End If End Sub 全部シートに書いています。 まだ、テスト段階のため適当なプログラムしか書いておりません。 (指定範囲が変更された場合に、Msgboxを出したりなど 単純なことしかしていません) どこが悪いのか、教えて頂けないでしょうか? よろしくお願い致します。

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • エクセルのマクロについて

    エクセル2003を使用しています。もしよかったら教えてください。 【例】 エクセルシートを2つ使うことを前提として、 Sheet1にはA1:F50の6列範囲セルに対して1~60の範囲内の数字が決められた背景色とフォント色に従い元々ランダムに入っております。 次に新たにSheet2を作り、そのE1:J50の6列範囲セルに値を他からコピーしてきた数字がランダムに入っています。 上記Sheet1セル範囲とSheet2セル範囲を比較して、それぞれのセル範囲内の数字がそれぞれ一致した場合、Sheet2のセル群をSheet1のセルの背景色とフォントカラーを同一に変更するマクロがわかりませんでした。 また1~60範囲外数値であれば処理しません。 調べても、数値入力した時点で他のセルの背景・フォント色を同一に変更する方法しか無かったので、For Eachを使い、試してみたのが下記のマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim v, c As Range '//変更されたセル範囲・値をチェックして、関係なければ処理をしない If Target.Count > 1 Then Exit Sub If Intersect(Range("E1:J50"), Target) Is Nothing Then Exit Sub v = Target.Value If Not IsNumeric(v) Or v < 1 Or v > 60 Then Exit Sub '//参照するシートの範囲について順にチェック '//値が同じだったら、フォントカラーと背景色を同じにして終了 For Each c In Worksheets("sheet1").Range("A1:F50") If c.Value = v Then Target.Interior.ColorIndex = c.Interior.ColorIndex Target.Font.ColorIndex = c.Font.ColorIndex Exit For End If Next c End Sub これで実行するとSheet2に数値を新たに入力してうまくいきます。 ただ、Sheet2へ他からコピーしてきた数値のセル背景・フォント色を変更することができないです。 上記の作業を次から次へと新規で対応しなければならず、数値の入力に疲れてきております。 うまくいくマクロありますでしょうか?

  • ExcelのVBで、Rangeの範囲に任意のセル値を使うには

    VB初心者で行き詰っております。 前任者の作成したVBコードで、特定のセルの入力をテンキーで入力できるようにしています。 VBのコードについては、下記の通りとなっております。 Private Sub Worksheet_Change(ByVal Target As Range) Dim crng As Range Dim ttarget As Range Application.EnableEvents = False Set ttarget = Application.Intersect(Target, Range("C6:AG35")) If Not ttarget Is Nothing Then ttarget = Application.VLookup(ttarget, Worksheets("入力").Range("A1:B10"), 2,False) For Each crng In ttarget If IsError(crng) Then crng.Value = "" End If Next End If Application.EnableEvents = True End Sub ここで、シート内の範囲が変更となる(対象となる行が増減される)ことが発生します。 Set ttarget = Application.Intersect(Target, Range("C6:AG35")) ※この部分がRange("C6:AG37")や、Range("C6:AG33")などに変更となるということです。 その都度、VBの変更をかけると可能なのですが、より効率的にするため、入力という名前のシートに ある空きセルをうまく活用したいと考えております。 Range("C6:AG35")の部分で、任意のセルを参照する変数を利用するには、 どのように記述したらよろしいでしょうか? また、別法として、常に行数をカウントできる方法でも可能なのかもしれません。 最初の行に値するセルがC6から始まり、最終行よりも下は空白セルとなります。 とすれば、行数をカウントして変数に組み込むことも一つなのかもしれませんが、技術がないため、 思いつくだけにとどまっております。 アドバイスをいただければと思います。よろしくお願いします。

  • Excel VBA 他のシートに演算結果を入れたい

    例えば、A~Dというシートのいずれかのo1セルに数値を入力すると、演算結果がp1に入る場合。 A~Dのどのシートでもo1に入力したら、Z!p1にp1の値を放り込みたいのです。 で、以下のようなコードを書いたのですが、上手くいきません。 因みに、セルの移動方向はオプションで「右方向」に設定してあります。 ※結果としてセルの移動を認識していないのか、まったく無反応です。 ※Range("Z!$P$1") =… の行にブレークポイントを設定しても、引っかかりません。 何が悪いのかお教え頂ければ幸甚です。 >違うシートには代入できない… ってことでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$P$1" Then Range("Z!$P$1") = Range("$P$1") End If End Sub ※なお、出典元のSubは以下の様なもので、正常に動作していました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then Range("B1") = Range("B1")+1 End If End Sub

  • worksheetchangeイベント

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng As Range Set myRng = Application.Intersect(Target, Range("A1:D2,A4:D6")) If myRng Is Nothing Then Exit Sub If WorksheetFunction.CountA(myRng) = 0 Then myRng.Value = "-" ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then Range("B1:D1").Value = "-" End If End Sub A1:D2範囲とA4:D6範囲内で、アクティブセルでDELETEキーを押した場合、"-"がセルに挿入されるようにコードを書きました。 さらに、A1セルの値がドロップダウンリストで139.8に変更された場合、B1、C1、D1に"-"を入力するようにしました。 A1セルの値を変更した場合の処理がうまくいかず四苦八苦しています。 ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then ここを、 Range("A1").value = "139.8" Then にしてしまうとA1の値が139.8の状態ではB1、C1、D1へ数値を入力しても"-"となってしまいます。 A1からD1まで連動したリストがリアルタイムで動作するようにコードを書きたいのですが・・・なんとか教えていただけませんでしょうか・・

  • エクセル マクロについて

    エクセルでネットの情報(為替の値動き)を自動更新で取得しています。自動更新前の情報を同一シート(同一シートが無理な場合は別シートでもいいのですが…)にコピペし一覧にするマクロはありますか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then         'A1のセルの値が変化したら・・・ n = Cells(Rows.Count, "B").End(xlUp).Row + 1  ’B列の最終行を探しその次の行に・・・ Range("B" & n).Value = Range("A1").Value    ’A1の値を貼り付けていく End If End Sub これだと手動セルを上書きした時しか動いてくれませんでした。検索もしたのですが見当たらなくて困っています。お力を貸してください。

  • エクセル:Targetの列番号を英字で出す

    Private Sub Worksheet_Change(ByVal Target As Range)   MsgBox Target.Column End sub このコードを書いたシートでセル"B1"の値を変更すると、 メッセージボックスで 2 と出ますが、 B と出したい(列番号ではなく、列の英字で)場合はどのように書けばよいでしょうか。 Left関数やMid関数を使ってTarget.Addressから英字部分を抜き出す、というコードも組んでみましたが、 そんなことしなくても出そうな気がするので、 そのような書き方がありましたら教えてください。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセルにてダブルクッリクしたときの動作

    エクセルにて特定のセルをダブルクリックをした時に日付を表示させたくて以下のマクロを組みました。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range,Cancel As Boolean) If intersect(Target, Range("A1")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Format(date, "yyyy") Cancel = True End If End Sub この場合A1セルをダブルクリックした時のみ西暦が入力されるようになっていますが、他のセルで、例えばB1セルでは月、C1セルでは日にちをダブルクリックで入力させるにはどうしたら良いでしょうか? If intersect(Target, Range("A1")) Is Nothing Then Exit Sub のTarget, Rangeを書き換えて複数このマクロを書き込んだのですがうまく動作しなくて。 知恵を貸していただけると助かります。

専門家に質問してみよう