• 締切済み

エクセルで音を鳴らす

エクセルに為替の数値をリアルタイムで入るようにしております。(D1とします。) そして、その数値がA1以下、またはB1以上になった時、ビープ音が なるようにしたかったので、初心者なりに下記のように入れてみました。 Private Sub Worksheet_Calculate() If Range("D1") >= Range("B1") Or Range("D1") <= Range("A1") Then Call Beep(500, 200) End If End Sub これでエクセルを起動すると「実行時エラー13 型が一致しません」 と出てしまいます。 デバッグを押すとIf Range("D1") >= Range("B1") Or Range("D1") <= Range("A1") Then のところが黄色くなっています。 デバッグではなく終了と押すと普通に作動はするのですが、 毎回実行時エラーになるので辛いです。 どの部分を訂正すればよいのでしょうか。 よろしくお願いいたします。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

>為替の数値をリアルタイムで... 楽天RSSのようなDDE機能を使ったものでしょうか。 これはBookオープン時、初回計算時に『#NAME?(エラー 2029)』を一瞬返すようです。 DDEの仕様のような気もします。 回避方法が別にあるのかもしれませんが、取り敢えず Option Explicit Private Declare Function Beep Lib "kernel32" ( _                ByVal dwFreq As Long, _                ByVal dwDuration As Long) As Long Private Sub Worksheet_Calculate()   Dim x      x = Range("D1").Value   If IsNumeric(x) Then     If x >= Range("B1").Value Or x <= Range("A1").Value Then       Call Beep(500, 300)     End If   End If End Sub これで。 ただ、DDEエラー発生時にもBeep音鳴らしたい場合もあるのではないかと。 その場合、初回だけ鳴るのを許容して Private Sub Worksheet_Calculate()   Dim x      x = Range("D1").Value   If IsNumeric(x) Then     If x >= Range("B1").Value Or x <= Range("A1").Value Then       Call Beep(500, 300)     End If   Else     Call Beep(100, 300)   End If End Sub こんな感じでも良いかもしれませんね。

  • tgook
  • ベストアンサー率48% (96/198)
回答No.3

No.1です。追記です。orz (1)VBAの挿入(I)->標準モジュール(M) (2)標準モジュールのフォルダ内にModule1があると思うのでダブルクリック。 (3)以下をModule1にこぴぺ Declare Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long (4)作成したプログラムを修正。 修正前 → Call Beep(500, 200) 修正後 → Call ApiBeep(500, 200) 私の環境ではこれで音が出ました。

参考URL:
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1214596572
  • nza49739
  • ベストアンサー率46% (29/62)
回答No.2

方が一致しないとは、数値で比較したいのに、セルの中身が片側が数値、片側が文字となっている。あるいは、片側が空白か未設定(まったく何も入力していない)かの時に起こります。 まず、先ず、クイックウォッチで止まった状態のときのセルの中身を確認してみてください。

  • tgook
  • ベストアンサー率48% (96/198)
回答No.1

例えばシート1のセルA1の値をシート2のセルB2にコピーする場合は以下のように記述します。 Worksheets("Sheet2").Range("B2").Value = Worksheets("Sheet1").Range("A1").Value セルの値を参照なので、 例えば Range("D1") ではなく、 Range("D1").Value または Worksheets("シート名").Range("D1").Value でエラーが出なくなると思います。

関連するQ&A