プロが教えるわが家の防犯対策術!

ここで尋ねることが適切かどうか判りませんが、詳しい方お願いします。
現象の説明です。
約4MbyteのプログラムをエクセルVBA(2000pro.sp4)
で動作させています。コードを追加してCall命令を変更したら、下記のような現象に遭いました。
1)Call 先に飛ぶところで実行時エラー2004で止まる。
2)そのままデバッグ画面でF8キーを押すと進む。
3)その際、散布図コードはまだ利用していないのに、散布図の画面が表示
  されている。(F8キーを押して後ですが、散布図利用ははるか先で
  そこまで行く前でこの現象がおきる)
4)他のコードを外してプログラムを軽くしてもダメ。
5)コードを追加前に戻したら今度は追加前と変わらずきちんと動作する。
6)Yahooの添付メールを利用して自己へのメールを送ると、ウィルスチェ
  ックはパス。当方のウイルスソフトもパス。(ウィルスはいない)
7)ハードデイスク容量は約700Mbyte空いている。

ところで、クリップボードを空にするコードはどのように書きますでしょうか。

ご存知、経験のある方、ご教示お願いします。

A 回答 (2件)

こんにちは。



>Call 先に飛ぶところで実行時エラー2004で止まる。

2004ではなく、'1004'でしようけれども、そのエラーでは、ローカルモジュール内のエラーなので問題が特定できません。

VBAのスクリプト自体のエラーは、一旦、コンパイルされ、一時ファイルとしてキャッシュに、バイナリとしてありますから、スクリプト自体のエラー箇所のコードの先も後もありません。ただし、実行時エラーは、この限りではありません。

コードをみて '1004'のエラーを特定するのは、複雑なものは、かなりの経験を積まないと無理です。
いずれにしても、コードを見せていただかないと答えができないと思います。

>7)ハードデイスク容量は約700Mbyte空いている。
ところで、やけに少ないですね。それは、もうパンクする状態に来ていませんか?

>行列演算がシート一杯に広がる可能性もあるので
もしかして、多次元(5?次元以上)の配列演算や、一度にセル5,500以上の配列の演算ではありませんか。
Excel 2000では、ヘルプには書かれていませんが、5,500以上の配列演算が、事実上不可能なはずです。制限の解除されたのは、Excel 2002以上だと思います。
また、演算がシート一杯になる場合は、メモリの制限を超えていることがあります。
それから、メモリ制限というか、演算が楽になったのは、Excel 2007 からのはずですね。

それ以下のバージョンでは、Excelの Info関数 -- =INFO("memavail") でチェックが可能です。(Excel 2007 では不可)私のほうでは、およそ、50M を割った時点で、一応、中止するようにしています。(Info関数は、揮発性関数ですから、その都度、再計算してあげないと取れませんから、できれば、VBA側のほうが良いかもしれません)

>クリップボードを空にするコードはどのように書きますでしょうか。

何に対するクリップボードでしょうか? Office 内には、制限されたクリップボードが存在しています。確か、フリーソフトもあったような気がします。Excelなどでは、通常、DataObject(要参照設定/一旦、UserFormを作ると、設定される) を使いますが、DataObject では消せないものもあります。通常は、以下のような、Win32 APIを使います。途中で、マクロを止めると、ClipBoard がオープンのままになりますから、注意してください。

------------------------------------------------
'新しい標準モジュールに貼り付けてください。

Declare Function IsClipboardFormatAvailable Lib "user32.dll" _
    (ByVal format As Long) As Long
Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long
Declare Function SetClipboardData Lib "user32.dll" _
    (ByVal uFormat As Long, ByVal hMem As Long) As Long
Declare Function EmptyClipboard Lib "user32.dll" () As Long
Declare Function CloseClipboard Lib "user32.dll" () As Long
Const CF_TEXT = 1& '現行ではテキストで判定しています。
Sub ClearCilpBord()
Dim ret As Long
 If IsClipboardFormatAvailable(CF_TEXT) Then
   If OpenClipboard(0&) > 0 Then
     EmptyClipboard
   Else
     MsgBox "クリップボードのオープンに失敗しました。"
   End If
 Else
  MsgBox "空です"
 End If
 ret = CloseClipboard()
End Sub

参考データ
http://msdn.microsoft.com/ja-jp/library/cc440846 …
    • good
    • 0
この回答へのお礼

ありがとうございました。質問を投稿した以後、クリップボードの解法は
まだやっていませんが、ソフトのコードを新しく作り直してからはうまく
動作しています。(新しいソフト)
しかし、旧いソフトは同じような箇所で同じエラーを返します。

私の原因推定は Disk容量が50Mbyte以下になってもプログラム
作成していた時期があり、その当時のデータは化けデータと化してプログラ
ムコードに記録されてしまった。何故なら、同じコードで作成した新ブック
はきちんと動作する。旧いブックは相変わらず同じ箇所でエラーを起こす。
そして、旧いブックの問題のコードを新ブックの同じ部分のコードと張り替
えると、今度は新ブックもエラーを起こす。・・・・独断です。

ハードデスク容量が少なくなったマシンでプログラミングをしてはいけな
い。というのが、私なりの結論でした。

お礼日時:2008/11/13 06:54

>ところで、クリップボードを空にするコードはどのように書きますでしょうか。



クリップボードを操作する(2)
http://www.officetanaka.net/excel/vba/tips/tips8 …

ご参考まで。
    • good
    • 0
この回答へのお礼

大変貴重な情報です。ありがとうございました。試してみたいと思います。
現在は質問の不具合に対しては、ゼロからコード修正をやり直しています。
(1ステップずつチェックしながら、また前回のコードより簡潔に)
行列演算がシート一杯に広がる可能性もあるのでその容量チェックにも利用
したいと思います。他にもどなたかアドバイスお願いします。特にPCの
目に見えない故障の前兆とか???これも心配です。

お礼日時:2008/11/12 09:41

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