dポイントプレゼントキャンペーン実施中!

エクセルに為替の数値をリアルタイムで入るようにしております。(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 のところが黄色くなっています。
デバッグではなく終了と押すと普通に作動はするのですが、
毎回実行時エラーになるので辛いです。
どの部分を訂正すればよいのでしょうか。
よろしくお願いいたします。

A 回答 (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
こんな感じでも良いかもしれませんね。
    • good
    • 1

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 …
    • good
    • 1

方が一致しないとは、数値で比較したいのに、セルの中身が片側が数値、片側が文字となっている。

あるいは、片側が空白か未設定(まったく何も入力していない)かの時に起こります。

まず、先ず、クイックウォッチで止まった状態のときのセルの中身を確認してみてください。
    • good
    • 0

例えばシート1のセルA1の値をシート2のセルB2にコピーする場合は以下のように記述します。


Worksheets("Sheet2").Range("B2").Value = Worksheets("Sheet1").Range("A1").Value

セルの値を参照なので、
例えば Range("D1") ではなく、
Range("D1").Value
または
Worksheets("シート名").Range("D1").Value
でエラーが出なくなると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!