• ベストアンサー

エクセルの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週間くらいなので、なにぶんわからないことだからで、もしわかる方がいらしたら教えてください。

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

  • ベストアンサー
noname#60992
noname#60992
回答No.3

再度、(excel を使わないのではずしているかもしれませんが、) まず IsNumeric(Target) でエラーが出るのか Target.Value >100 でエラーが出るのか それを検証しましょう。 もしisNumericでエラーが出るなら、target(range型)はIsNumericの判定はできないということだと思います。(target.valueなど、適切なものに変える必要あるのかな?) Target.Value > 100 でエラーが出ているなら、 Target.value を数値型に変更(Val(Target.Value)>100)すればよいと思います。 あとは、どのようなrangeがtargetに入っているのかによって、 target.valueが取得できるかどうかが変わる可能性もあるのではないかと推測しますが、よくわかりません。  office系ソフトのほうで質問したらすぐ回答がつくと思いますよ。

mm13mm
質問者

お礼

ご親切にアドバイスありがとうございます。 office系の方で質問したと思います。 もし、また質問などでお世話になることがあったら、よろしくお願いします。

mm13mm
質問者

補足

お世話になっています。 IsNumeric(Target) でエラーが出るのか、Target.Value >100 でエラーが出るのか?という質問ですが、両方としてもエラーがでました。 (Val(Target.Value)>100)にしても、やっぱりダメでした。 16Augustのおっしゃる通り、office系の方で質問したいと思います。いろいろ親切にありがとうございました。

その他の回答 (2)

noname#60992
noname#60992
回答No.2

エクセルVBAを使ったことがないので、はずしているかもしれませんが "a" > 100 のような判定をしようとした場合(文字列と数値の比較) 「型が一致しません」というエラーがでると思います。 エラーが出たときの target.value は数値でしたか?

mm13mm
質問者

補足

target.valueですが、文字列として数字がエクセルの方へ取り込まれているようです。 16Augustさんのおっしゃる通り、文字列と数値では比較できないのかもしれません。こういう場合、文字列で出力されるデータを、マクロで数値へ変換しなければならないということでしょうか? 文字列を数値へ変換する場合、どのような方法があるのでしょうか? 文字列を数値に変換するというので、yahooの知恵袋の方で、文字列を数値へ変換するようなマクロがありまして、それをためしたのですが、やぱり、If IsNumeric(Target) And Target.Value > 100 Thenのところで、型が一致しませんとエラーがでてしまいまして、困っています。 参考URL:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413233289

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

質問のコードでよいように思いましたが、 >型が一致しませんとエラー?がでてしまいます、が再現できませんでした。 私の場合は英字を入れても 音が鳴りませんでしたので下記のように(ORに)しました Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then MsgBox IsNumeric(Target.Value) If IsNumeric(Target.Value) = False Or Target.Value > 100 Then For i = 1 To 10 Beep Next i MsgBox "範囲外です" End If End If End Sub をやってみてください。 エクセルでは、全角の数字の入力時には数値に強制修正されます。

mm13mm
質問者

補足

返事が遅くなりました。 会社の方で上述のマクロを入力してやってみたのですが、うまくいきませんでした。 エクセルの方へ出力されるデータが文字列で保存されるため、うまくいかないのではないと思います。

関連するQ&A

  • 警告音をならす方法

    こんばんは。 昨日まで、違うカテゴリーの方で質問をしていたのですが、こちらの方がよい回答が得られるのではないかということを教えていただき、こちらに再度質問をしたいと思っています。よろしくお願いします。 私はエクセル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について

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • エクセル VBAマクロ if文 はどうすれば?

    先ほど質問したのですが、さらにわからなくなったのでお願いします 先ほどの質問 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http://okwave.jp/qa/q7236338.html >変数と式の両立は難しいでしょうからどうすればよいのでしょう?  ⇒関数では出来無いのはエクセルの常識ですのでマクロ(VBA)組込みになります。 一例です。 対象シートタブ上で右クリック→コードの表示→以下のコード貼り付けてA1に枚数を入力して お試しください。 サンプルコード Private Sub Worksheet_Change(ByVal Target As Range) 単価 = 5 If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then  Application.EnableEvents = False  Target.Value = Target.Value * 単価  Application.EnableEvents = True End If End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↓変更&応用したのですが、、、、 EX:(セル)    セル番号  用紙種類1~3       用紙種類    C12   A3モノクロ1     D12  A3カラー1    C13   A3モノクロ2     D13  A3カラー2    C14   A3モノクロ3     D14  A3カラー3 ※金額の違いは、モノクロとカラーの値段が違うだけ  1~3は金額的な違いはない とあった場合、 ためしに先ほどのを応用して用いたのですが 変更点は、用紙サイズ、カラーの有無による金額        出力先セルの番号 Private Sub Worksheet_Change(ByVal Target As Range) を Private Sub A4_mono_1(ByVal Target As Range) Private Sub A4_mono_2(ByVal Target As Range) ・             ・            ・ と変更したのですがうまく動作しなかったのですが、 どういった点が悪かったのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最終的な質問↓ 上記のものはVBAマクロ文は基本1つのみなので、if文で作らなくてはいけないということが分かったのですが、そこでさらに疑問が浮かびました、 Private Sub Worksheet_Change(ByVal Target As Range) If or(target.columns = C12:C14) Then 単価1 = 7.6 If Intersect(Target, Range("C12:C14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価1 Application.EnableEvents = True単価1 = 7.6 elseif or(target.columns = D12:D14) Then 単価2 = 30.6 If Intersect(Target, Range("D12:D14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価2 Application.EnableEvents = True End If End Sub としたっ場合全く式になっていません どのようにすればよいのでしょう?

  • 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 と入力しています。 改善方法をどうかご教授願います。

  • 別の列のデータを検索してセルの色を変える

    Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column <> 1) And (Target.Column <> 5) Then Exit Sub If Not IsNumeric(Target.Value) Then Exit Sub Target.Offset(0, 1).Value = Now() End Sub 上記のスクリプトで 「1列目にナンバーを記入すると2列目に、5列目にナンバーを記入すると6列目に時刻が自動的にセルに入る」ようになっています。 これに追加で 「5列目にナンバーが記入されると、そのナンバーと同じものを1列目から探し出して、1列目のセルの色を薄い青にする。なければなしとアラートを出す」 ように改造したいのですが どうすればいいでしょうか? どうかお願いいたします。

  • Excel VBA の件で質問です

    照合システムを作ろうとネットを閲覧していたら次のコードが見つかりました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rr As Range If Not Intersect(Target, Range("C1:D10")) Is Nothing Then For Each rr In Intersect(Target.EntireRow, Range("C:C")) If Not IsEmpty(rr) And Not IsEmpty(rr.Offset(, 1)) Then Application.EnableEvents = False If rr.Value <> rr.Offset(, 1).Value Then Beep rr.Offset(, 2).Value = "NG" Else rr.Offset(, 2).Value = "OK" End If Application.EnableEvents = True End If Next End If End Sub このコードでいくと、C列とD列が同じであればE列にOK、間違っていればNGなのですが、C1とC2が同じであればE1にOK、間違っていればNG。次にC3とC4が同じであればE3にOK、間違っていればNG。…というふうにしたいのですが、どうすれば良いのでしょうか?

  • 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

  • 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ですが、どのようにして組み合わせれば良いのでしょうか?