Excel VBAで一定の数値以下で音を鳴らす方法とは?

このQ&Aのポイント
  • Excel VBAを使用して、一定の数値以下で音を鳴らす方法を知りたいです。現在の設定では、-2以下の数値を検知するとBEEP音が鳴るようになっていますが、なぜか1分ごとにしか鳴りません。
  • 質問者はExcelのVBAを使用して、一つのセルの数値が更新されるたびに音を鳴らす設定を行いたいと考えています。現在の設定では、-2以下の数値を検知するとBEEP音が鳴るように設定されていますが、なぜか1分ごとにしか音が鳴りません。
  • Excel VBAを使用して、一つのセル内の数値が-2以下になるとすぐにBEEP音が鳴る設定をしたいと考えていますが、なぜか1分ごとにしか音が鳴らない状況です。現在のモジュールは、標準モジュールに「Beep」という関数を宣言し、Sheet1には「Worksheet_Change」イベントを使用して音を鳴らす設定を行っています。
回答を見る
  • ベストアンサー

Excel VBA 一定の数値以下で音を鳴らす

一つのセル内の数値(VBAにより、1秒ごとに更新される流動的な数値です)において、-2以下になるとすぐにBEEP音が鳴る設定をしたいのですが、何故か1分ごとにしか鳴りません。 今のモジュールは、標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Sheet1に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Range("Q6") < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub と入力しています。 改善方法をどうかご教授願います。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.10

CommandButton2かどうかは分かりませんが以下のようにしてください。 今回、Callはなくてもいけると思いますが、無いと駄目な場合もありますのでその時のためにCallも覚えておいてください。 Private Sub CommandButton2_Click() Call 急騰急落告知 Call 急騰急落 End Sub

yamadai0720
質問者

お礼

できました。本当に助かりました。 いままで本当にありがとうございました。 もっと自分でも何とか改善できるよう勉強していきます。

その他の回答 (9)

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.9

No1 1秒ごとにA列のデータを更新しているのでしょうか。数式ではなくてです。 No3 ここに1秒ごとに更新されるセルもしくは列か行を指定してください。 これが前提です。これがないのでしたら話は変わります。 これがないのでしたら Sub 急騰急落告知()があるModule1に(Q6は適宜変更してください) 以下のコードを追加して実行してください。ただし、他の動作とバッティングして正常に動くかどうかは分かりません。 Sub 急騰急落() If Range("Q6") < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If Application.OnTime Now + TimeValue("00:00:01"), "急騰急落" End Sub 上記にしてWorksheet_Changeは不要です。 Worksheet_Changeはネットで検索するなどしてしてその動作を理解してください。 分かっていないのに中身を適当に変更しても思うようには動きません。

yamadai0720
質問者

補足

音が1秒ごとになるようになりました!ありがとうございます。 最後に可能でしたら、現在手動で起動するマクロが2つあり、 1分前の株価を表示するものと先ほどの1秒ごとにアラームかなるものがあります。 Sub 急騰急落告知() Range("E1:E300").Copy Range("F1:F300").PasteSpecial Paste:=xlPasteValues Application.OnTime Now + TimeValue("00:01:00"), "急騰急落告知", Now + TimeValue("00:02:00") End Sub Sub 急騰急落() If Range("L1") < -2 Then ←該当セルをL1にしましたが気にしないでください Call Beep(2000, 500) Call Beep(2000, 500) End If Application.OnTime Now + TimeValue("00:00:01"), "急騰急落" End Sub これを一つのボタン起動ですることはできますでしょうか?(DirectXのボタン) できなければメニューの「開発」内の「マクロ」の項目を1つにできたらなと思います。 最後の質問になりますが、よろしくお願いいたします。

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.8

> 標準モジュール3に > Private Sub Worksheet_Change(ByVal Target As Range) > Range("O1").Value = Range("M1").Value > End Sub Worksheet_Changeはそのコードが書かれているシートのセルを編集し終わったときに実行されます。 なので標準モジュールに記載しても意味がありません。 また、セルにデータを入れたらWorksheet_Changeは実行されるので、データを入れたら実行されるWorksheet_Changeを実行するためにWorksheet_Changeで代入しようとするのは堂々巡りですし、場合によっては永久ループになります。 1秒に一度変更されるのはどのセルですかそのセルを以下のO1のところに指定してください。 If Target.Address = Range("O1").Address Then RSSについては私にはその動作はわかりませんので、そこは無視した状態での回答になっています。

yamadai0720
質問者

補足

Private Sub Worksheet_Change(ByVal Target As Range) Range("O1").Value = Range("M1").Value End Sub を Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("O1").Address Then If Target < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) ※Range("O1").Valueはミスタッチです End If End If End Subと同じところに入れようとすると、Private Sub Worksheet_Change(ByVal Target As Range)の部分が重なってかエラーになります。 あと、単体でPrivate Sub Worksheet_Change(ByVal Target As Range) Range("O1").Value = Range("M1").Value End Subを入力しても、O1のセルに何も反映されませんでした。完全に行き詰っています。 (そもそもIf Target.Address = Range("L1").Address Then If Target < -2 Thenの部分を「値のみ対象にすればいいと思い。Range(”M1”).Value」にしてもだめでした) 基本的なことかもしれませんがご教授願います。。。 ちなみに楽天RSSは1秒ごとに自動で銘柄名称・売買代金・現在値が更新されます。

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.7

> Offset(0, 1).Value = "=RSS|'" & code & ".TJ'!銘柄名称"" > .Offset(0, 2).Value = "=RSS|'" & code & ".TJ'!現在値ティック" > .Offset(0, 3).Value = "=RSS|'" & code & ".TJ'!売買代金""" > .Offset(0, 4).Value = "=RSS|'" & code & ".TJ'!現在値" > が黄色くなりエラーになります。 回答に貼り付けしたときに「"」が最後に余分についたみたいです。各行の最後の「"」は一個にしてください。元の"=RSS・・・"の部分をコピペしたら間違いがないです。 > Private Sub Worksheet_Change(ByVal Target As Range) > If Target.Address = Range("該当のセルの範囲です").Address Then セルの範囲ではなく同時にその範囲が変更されるのならどれかセル一個にしてください。 一秒ごとに範囲のどれかのセルが更新されるのなら(範囲がX3:X9としたら) Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("X3:X9")) Is Nothing Then

yamadai0720
質問者

補足

一括登録はできました。ありがとうございます。 音の件ですが、H1~H300に「証券会社から取得したセル」を元に計算した「1分前の株価との騰落率」が入っており、M1に「その比率で一番小さい数字」が来るように数式が入っております。(=VLOOKUP(1,$A$1:$H$300,8,FALSE) M1に上記数式が入っていると、随時ブザーが鳴らないということで、 標準モジュール3に Private Sub Worksheet_Change(ByVal Target As Range) Range("O1").Value = Range("M1").Value End Sub を記載し、ブザーを対象とするセルを別にO1に設けました。 (M1と値は同じですが数式を入れないため)その後 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("O1").Address Then If Target < -2 Then Call Beep(2000, 500) Call Beep(2000, 500)Range("O1").Value End If End If End Sub を入力し、マクロを実行してもO1に値が反映されません。。 間違っている個所はどこになりますでしょうか?

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.6

> 急騰急落告知プロシージャ内に > Private Sub Worksheet_Change(ByVal Target As Range) > If Target.Column = 1 Then > If Range("Q6") < -2 Then > と追加入力すればいいのでしょうか? すみせんが何をもってそのような解釈になるのか意味が分かりません。

yamadai0720
質問者

補足

株価の動いている時などで、けんしょうしたのですが、まず Private Sub mGetData()内の .Offset(0, 1).Value = "=RSS|'" & code & ".TJ'!銘柄名称"" .Offset(0, 2).Value = "=RSS|'" & code & ".TJ'!現在値ティック" .Offset(0, 3).Value = "=RSS|'" & code & ".TJ'!売買代金""" .Offset(0, 4).Value = "=RSS|'" & code & ".TJ'!現在値" が黄色くなりエラーになります。 あと、音の部分ですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("該当のセルの範囲です").Address Then If Target < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub に変更しましたが、うまくいきません。。 また、http://masudahp.web.fc2.com/vb6/vb6api/vb6api01.htmlを参照にし、マネージャーを開くも、何も入っていませんでした。。。

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.5

コードの場所はそのままで > もしよろしければ、非常に面倒かとと思いますが、1から入力の仕方『どのモジュールにどんな式で入れればいいか』教えていただけると助かります、、 「別のセルにおいて証券会社から1秒ごとに取得した値」が更新される(数式ではなく実際にデータを代入する)セルがX1だとしたら If Target.Column = 1 Then を If Target.Address = Range("X1").Address Then > あと銘柄登録ボタンも一括登録する事が可能ならば教えていただきたいです、、、 295銘柄がA1からA295まで連続してあるとしたら '1行ずらすとありますが実際のコードは1列ずれていってます。 現状のコードをいかし、Selectは省いて一部変更しています。 Private Sub CommandButton1_Click() Dim c As Range Application.ScreenUpdating = False For Each c In Range("A1:A295") c.Activate mGetData Next Application.ScreenUpdating = True End Sub Private Sub mGetData() Dim a_col As Long, a_row As Long, code As String a_col = ActiveCell.Column a_row = ActiveCell.Row code = Cells(a_row, a_col).Value If code <> "" Then With Cells(a_row, a_col) .Offset(0, 1).Value = "=RSS|'" & code & ".TJ'!銘柄名称"" .Offset(0, 2).Value = "=RSS|'" & code & ".TJ'!現在値ティック" .Offset(0, 3).Value = "=RSS|'" & code & ".TJ'!売買代金"" .Offset(0, 4).Value = "=RSS|'" & code & ".TJ'!現在値" End With End If End Sub

yamadai0720
質問者

補足

少しでも現状をシンプルにするために余分なセルを削除しました。 銘柄コードの入力セルをA1からA300に変更(監視数も295から300にしました) Sheet1コードが Private Sub CommandButton1_Click() Dim c As Range Application.ScreenUpdating = False For Each c In Range("A1:A300") c.Activate mGetData Next Application.ScreenUpdating = True End Sub Private Sub mGetData() Dim a_col As Long, a_row As Long, code As String a_col = ActiveCell.Column a_row = ActiveCell.Row code = Cells(a_row, a_col).Value If code <> "" Then With Cells(a_row, a_col) .Offset(0, 1).Value = "=RSS|'" & code & ".TJ'!銘柄名称""" .Offset(0, 2).Value = "=RSS|'" & code & ".TJ'!現在値ティック" .Offset(0, 3).Value = "=RSS|'" & code & ".TJ'!売買代金""" .Offset(0, 4).Value = "=RSS|'" & code & ".TJ'!現在値" End With End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("G1:G300").Address Then If Target < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub H列にRANK関数を移動しました。 Module1コードも Sub 急騰急落告知() Range("I7").Value = Now Range("J7").Value = Now + TimeValue("00:01:00") Range("E1:E300").Copy Range("F1:F300").PasteSpecial Paste:=xlPasteValues Application.OnTime Now + TimeValue("00:01:00"), "急騰急落告知", Now + TimeValue("00:02:00") End Sub に修正しました。

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.4

No3の 急騰急落告知()が再起呼び出しの件 は勘違いですので無視してください。

yamadai0720
質問者

補足

ありがとうございます。 本当に素人ですみませんが、最近VBAをかじった程度で、VBAの他の人のを参考にして我流でやっただけなので、ほとんど理解できてません、、 もしよろしければ、非常に面倒かとと思いますが、1から入力の仕方『どのモジュールにどんな式で入れればいいか』教えていただけると助かります、、 あと銘柄登録ボタンも一括登録する事が可能ならば教えていただきたいです、、、

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.3

Sub 急騰急落告知() これで1秒に1度A1のデータを更新してますので Private Sub Worksheet_Change(ByVal Target As Range) このChangeイベントの If Target.Column = 1 Then が真になって(.Columnの 1 はA列) If Range("Q6") < -2 Then 以降が1秒ごとに実施されていると思われます。 ですので If Target.Column = 1 Then ここに1秒ごとに更新されるセルもしくは列か行を指定してください。 「別のセルにおいて証券会社から1秒ごとに取得した値」が更新されるセル を指定すればいいのではないでしょうか。 あと 急騰急落告知() が再起呼び出しになっていますが Application.OnTimeで呼び出すモジュール(セルに記載する部分)は別にした方がいいような気もします。

yamadai0720
質問者

補足

急騰急落告知プロシージャ内に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Range("Q6") < -2 Then と追加入力すればいいのでしょうか?

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

Column = 1 すなわちA列の、どれかの行かのセルの値が変化したとき、このイベント(If Range("Q6") < -2 Then以下)が実行されますが、それと判別に用いている、セルQ6との関係はどうなっているのですか。 A列の変化ーー>Q6セルの値変化が巻数などで変化するのか、 Q6セルも、システムから入るデータで変化するのか、 よくわからないのだが。 ====== 標準モジュールに(API関数は標準モジュールに置くのだと思うが) ーー http://masudahp.web.fc2.com/vb6/vb6api/vb6api01.html >標準モジュールにコピーする。 ーー Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long ーー Sheet1のシートモジュールで、Changeイベントを指定し、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Target < -2 Then  ’<--ここを質問とは変えてやってみた Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub でA列に(小生のテストで、キーボードより)-23など入れると、2回ピーピーなりましたが。 == 関係ない、のかもしれないが、システムが更新するのは、下の空白行に、新しいデータを追加していくのではないのですか? 株銘柄の株価ボードのように、銘柄により表示位置が決まっていて、そこが随時値が変わるのか、スつ問では、く説明が必要ではないか?

yamadai0720
質問者

補足

すみません、明日の昼まで仕事ですので、また明日調べて返信しますので、少しお待ち下さい! 申し訳ないです。。

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.1

1秒ごとにA列のデータを更新しているのでしょうか。数式ではなくてです。

yamadai0720
質問者

補足

素人ですみません。。一からの説明になりますが、まず295銘柄の情報を取得するために、 同シート内に一覧表を作り、セルに銘柄番号を入力しボタン押下すると各情報が表示されるようにします(今は1銘柄ずつボタン押下することにより取得できますが、300近く押下する必要があり、本当はワンクリックで一括入力できるようにしたいんです。。 Sheet1に Private Sub CommandButton1_Click() a_col = ActiveCell.Column a_row = ActiveCell.Row code = Cells(a_row, a_col).Value If code <> "" Then Selection.Offset(0, 1).Select '1行ずらす Selection.Value = "=RSS|'" & code & ".TJ'!銘柄名称" Selection.Offset(0, 1).Select '1行ずらす Selection.Value = "=RSS|'" & code & ".TJ'!現在値ティック" Selection.Offset(0, 1).Select '1行ずらす Selection.Value = "=RSS|'" & code & ".TJ'!売買代金" Selection.Offset(0, 1).Select '1行ずらす Selection.Value = "=RSS|'" & code & ".TJ'!現在値" End If End Sub  ※改行は省略 及び同モジュール内に先ほどのChengeイベントを記載 これでB6~300に銘柄番号を入力すると、(C~Eの数値及び)F6~300に各銘柄の現在値が表示されるので、右隣セル(ここでいうG6~300)に1分前の株価が1分間固定で出るよう Sub 急騰急落告知() Range("A1").Value = Now Range("B1").Value = Now + TimeValue("00:01:00") Range("F6:F300").Copy Range("G6:G300").PasteSpecial Paste:=xlPasteValues Application.OnTime Now + TimeValue("00:01:00"), "急騰急落告知", Now + TimeValue("00:02:00") End Sub を入力しました。 続いてH列に現在値が、1分前株価の何%騰落したのか表示するために、各セルに =IFERROR((F6/G6*100)-100,"0")を入力(6行目を例示) A列に急落ランキングが出るように=RANK(H6,$H$6:$H$300,1)(6行目を例示)を入力 この一覧表のQ列に、一番下落している銘柄の比率を表示 =VLOOKUP(1,$A$6:$H$300,8,FALSE)←最初の数字を2.3と変更し3位までをQ6からQ8までに表示してます。 Q値は、別のセルにおいて証券会社から1秒ごとに取得した値を独自で計算し、ランキング化たものを見やすくするために数式を再入力したものになります。 現在でも、-2以下の数値を入力した直後は音が鳴りますが、あくまで、「1分以内に-2%以下になった銘柄があったら、00秒ごと(1分スパン)で鳴るだけ」なのです。音で急落をすぐに察知せきません。 長々と失礼いたしました。。

関連するQ&A

  • BEEP音を再生したい

    下のドレミを再生したいのですが具体的にどのようにどこへ記載すれば再生できますか? Private Sub? Declare Function Beep Lib "kernel32" ( _           ByVal dwFreq As Long, _           ByVal dwDuration As Long _           ) As Long 上記のコードをSUB に記載するとエラーになります。 これがないとCALL Beepもエラーになります。 '=============================== Sub Test()  Call Beep(262, 500)  Call Beep(294, 500)  Call Beep(330, 500)  Call Beep(349, 500)  Call Beep(392, 500)  Call Beep(440, 500)  Call Beep(494, 500)  Call Beep(523, 500) End Sub VBA初心者です分かりやすくお願いします。

  • 特定のセルの表示が変わったら音を鳴らしたい!

    例えばですが、 BOOK1シートのA1のセルの位置に「テスト」という文字が入ったら音を鳴らしたいんですが、下記でうまくいきません。 音は鳴るんですが、BOOK1のすべてのセルの何かが変われば音が鳴ります、、、 A1のみに対して音を鳴らしたいんです。 皆さん、どうかご教授お願いします! 1. 標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long 2. シートモジュールのChangeイベントに Private Sub Worksheet_Change(ByVal Target As Range) If Cells(A1).Value >= "テスト" Then Shell "mplay32.exe /play /close c:\サウンド\テスト.wav" End Sub

  • 別々のセルで音を鳴らせる設定

    皆さん、すいません、4つ下ぐらいのところで質問をした者ですが、 もう一つだけご教授ください。 先ほどは、 BOOK1の中で セルA1にテストという文字が入ったらテスト.wavが鳴る というものをしたくて教えてもらって、うまくいったのですが、 本当にやりたいのは下記のようなことなんです。 ※一つ教えてもらったら、応用していけると思ったんですが、力不足、知識不足で無理でした、、 BOOK1の中で セルA1にテストという文字が入ったらテスト.wavが鳴る セルA2にトマトという文字が入ったらトマト.wavが鳴る セルA3にバナナという文字が入ったらバナナ.wavが鳴る セルA4にブドウという文字が入ったらブドウ.wavが鳴る ご教授できましたら、お願いします。 ----------↓先ほど教えてもらったものです↓--------- (1)標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long (2)シートモジュールのChangeイベントに Private Sub Worksheet_Change(ByVal Target As Range) With Target '変化したセルがA1以外ならExit If .Address <> "$A$1" Then Exit Sub '変化した値に"テスト"が含まれていなければExit If Not .Value Like "*テスト*" Then Exit Sub End With Shell "mplay32.exe /play /close c:\サウンド\テスト.wav" End Sub

  • エクセルのVBAで、音をならす方法

    こんばんは。私はエクセル2000を使用しています。 現在やろうとしていることは、 実験の測定データをエクセルに取り込み(測定データは文字列としてエクセルに取り込まれます)、D列の数字が100以上になったら音をならして知らせるようにしたいと考えております。 それで、以下のマクロを組んでやってみました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then If IsNumeric(Target) And Target.Value > 100 Then Beep    MsgBox "範囲外です" End If End If End Sub しかし、If IsNumeric(Target) And Target.Value > 100 Thenのところで、型が一致しませんとエラー?がでてしまいます。 まだ、VBAを勉強しはじめて2週間くらいなので、なにぶんわからないことだからで、もしわかる方がいらしたら教えてください。

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • Excel:列中に特定の文字列を表示するセルが出たらBeep音を鳴らす

    商品の品番の確認作業にエクセルを使っています。 作業の効率化にエクセルVBAを使いたいのですが、うまくいきません。 具体的な使用目的は以下の通りです。  納品された商品には製造メーカーのバーコードがついています。それをエクセルに読み込んで予定通りの商品であるか確認作業を行います。  まず、エクセルシートのA列にメーカーコードを入力しておきます、B列のセルをアクティブにした状態でメーカーのバーコードを読み取ります。するとセルにメーカーコードが自動入力されます。この文字列がA列の文字列と一致した場合にはC列のセルにOKの文字が出るように設定しています。コードが一致しない場合はNGが出ます。  現在はOKかNGかを目で確認しているのですが、商品数が多いので、NGの場合にBeep音が出るようになっていれば作業が早くなります。  過去の質問例を調べて、VBAのAMI関数を使うとBeep音を鳴らせることはわかりました。たとえば、セルC1にNGと表示された場合にBeep音を鳴らす、というところまではできたのですが、列CのいずれかのセルにNGと表示された場合にBeep音を鳴らす、という設定ができません。  わかる方アドバイスお願いします。  ちなみに、セルC1にNGと表示された場合にBeep音を鳴らすには以下のように設定しました。 標準モジュール Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long シートのモジュール Private Sub Worksheet_Change(ByVal Target As Range) If Range("C1") = "NG" Then Call Beep(2000, 500) End If End Sub

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • エクセル2010のvbaについて

    Sheet1に挿入したイメージ(ActiveX)をクリックすると数字が上がって 実行中にもう一度同じイメージをクリックすると止まるようにしたいのですが 数字が上がったまま止まりません(上限はあるのでオーバーフローはしません) Worksheet_SelectionChangeで(ActiveXのイメージがもう一回押されて) 選択セルが変わったら停止としたかったのですが反応しません イメージをクリック(実行)してもう一回押すとクリックしている間は止まりますが離すと再開されます コードにクリックされた回数がわかるようにしましたが増えません 説明が分かりにくかったら追記します 回答お願いします クラスモジュールのコード(イメージの名前によって少し処理を変えるためです) Private Sub myImg_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Integer, a, b, C As POINTAPI, obj As OLEObject i = myImg.Index - 1 Call GetCursorPos(C) Set obj = ActiveWindow.RangeFromPoint(C.X, C.Y) b = Range("A1") Range("A1") = obj.Name Range("A2") = Range("A2") + 1    'クリックされた回数が分かるようにするため追加 If Range("A2") = 2 Then Range("C1").Select End If Range("A3") = "B1" If obj.Name = 2 Then Range("A3") = "B3" Range(Range("A3")).Select End Sub Sheet1のコード Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Address <> Range(Range("A3")).Address Then Exit Sub Do While ActiveCell < Range("A4") * 100 If ActiveCell.Address <> Range(Range("A3")).Address Then Exit Do End If DoEvents ActiveCell = ActiveCell + 1 Loop End Sub

  • 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を出したりなど 単純なことしかしていません) どこが悪いのか、教えて頂けないでしょうか? よろしくお願い致します。

  • EXCEL 異なるVBA

    教えて下さい、EXECL以下の異なるVBA (A>,B>)が2つあります、同じシートでそれぞれ動くようにさせたいです1つに合わせる事は出来ないでしょうか? 当方初心者の為わかりません教えて下さい。 A> Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Address(0, 0, xlA1, 0) <> "A1" Then Exit Sub With Range("F9:I9,K17:K36").Borders(xlDiagonalUp) If Left$(Target.Value, 1) = "S" Then .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic Else .LineStyle = xlNone End If End With End Sub B> Private Sub Worksheet_Change(ByVal Target As Range) With Sheet2 Select Case Target.Address Case Is = "$D$1" .Range("A1").Insert Shift:=xlDown .Range("A1").Value = Target.Value Case Is = "$D$2" .Range("B1").Insert Shift:=xlDown .Range("B1").Value = Target.Value End Select End With End Sub

専門家に質問してみよう