エクセルの操作で困っています。
エクセルをDelphiから(OLE)起動して、エクセルのVBAを
利用して処理を行っていますが、動作中にセルを触っていますと
「マクロ Sheet1.test_macro が見つかりません。」
..のようなエラーメッセージが出てきます。
メッセージボックスは出ても、一応処理は続行されていますので
取敢えずは問題ないのですが、放っておくと このメッセージが沢山出て
操作に弊害が出ますので出来るものならば、このようなメッセージを
抑止出来ればと思っています。
因みに {$I-} や try 〜 except などでは対応出来ないようです。
【現在の環境です】
・WindowsXP + Delphi5.0 + Excel2000/Excel2003
// 以下のようなリストの所で発生します
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
ExcelWorkSheet1.ConnectTo(ExcelWorkbook1.Worksheets['Sheet1'] as _worksheet);
ExcelApplication1.Run('Sheet1.test_macro');
何かご存知の方がいらっしゃいましたら、よろしくお願いします。
Mr.XRAYです
>「マクロ Sheet1.test_macro が見つかりません。」
Wordキッドさん,多分.それはそのものズバリだと思いますよ.
マクロの編集を開いて確認してみてください.
少なくともExcel2003までのマクロではカンマの付いたマクロ名は使えないハズです.
つまり,見つかりませんの前に,VBAのエラーが発生するハズなんですが.
出ませんでしたか?
もしかしたら,test_macroというマクロを実行しようとしているのではないですか?
Mr.XRAYさん ご回答ありがとうございます。
Mr.XRAYさんのホームページも時々参考にさせて頂いております。
(色々と助かっています)
> Wordキッドさん..
Wordキッド??って言うか?、Excelキッドですw
折角ご回答して頂き恐縮ですが...
斜め読みで構わないのですが、出来ましたら状況(内容)を
きちんと把握して頂けると助かります。
> 利用して処理を行っていますが、動作中にセルを触っていますと
何もなければきちんと動いているのですが、セルを触って編集状態で
(セルが引っ込んでいる)マクロをアクセスすると、メッセージが出るんです。
(実際は10秒程度のタイマーで定期的にアクセスしています)
> 少なくともExcel2003までのマクロではカンマの付いたマクロ名は使えないハズです.
細かいエクセルの歴史は解りませんが、「Sheet1.test_macro」 の形式は
「シート+マクロ」で Excel2000でも使えますよ。
なかなか、いい情報がなくて困っています。
何かありましたら、よろしくお願いします。
>きちんと把握して頂けると助かります。
きちんと把握させて頂ける様に書いてあると助かります。
入力中にはマクロは使えないと言う事の様ですので
マクロを実行する前に入力中の状態を解除する命令を
入れないといけないのでは。
>「シート+マクロ」で Excel2000でも使えますよ。
これってどんな設定ですか。
>これってどんな設定ですか。
どういう手順で,なんという名前のマクロを作成したのかは分かりませんが,
もしかしたら,マクロシートというやつかも知れません.
ちょっとわかりませんです.
>動作中にセルを触っていますと
とあるのですが,一方では
>// 以下のようなリストの所で発生します
とありますね.ゴメンナサイ.分かりません.
TSさん、Mr.XRAYさん、ご回答ありがとうございます。
> >「シート+マクロ」で Excel2000でも使えますよ。
> これってどんな設定ですか。
特に変わったものではなく、以下のようなVBAの関数です。
(実際は、シート+マクロあるいはモジュール+マクロ)
Sub test_macro()
Range("B5").Select
Application.CutCopyMode = False
Selection.Copy
Application.Run "Module1.Macro2"
〜 略 〜
End Sub
> 入力中にはマクロは使えないと言う事の様ですので
> マクロを実行する前に入力中の状態を解除する命令を
> 入れないといけないのでは。
なるほど、マクロ実行中はセルは触ったらいけないのですね。
(ただ、Excel単独で動かす分にはエラーにならないようですので
OLE経由で、外部と連携した場合はダメという事でしょうね。)
実際は作った私ではなく、知り合いが使うものですから
どうしても動作中にセルを触る必要が時々あるらしいのです。
どうも、回避する方法はなさそうですね。
何か他の手立てを検討して見ます。
>どうも、回避する方法はなさそうですね。
前に書いた以下はその回避方法のつもりでしたが
>マクロを実行する前に入力中の状態を解除する命令を
>入れないといけないのでは。
と言うのはExcelにESC 又はRnter等のキーを送る等して
実現できるはずですが。
TSさん、ありがとうございます。
返事が遅れました。
何とか、マクロを動かしながらセルの入力も
出来ないかと思って来ましたが、エラーメッセージが
出ると言うことは、やはり何か不都合な事態が出ているという
事でしょうから、抑止はやはり出来ないんでしょうね。
> と言うのはExcelにESC 又はRnter等のキーを送る等して
> 実現できるはずですが。
仰るようにキーデータを送り込んで入力の方を抑止したほうが
良さそうです。
ありがとうございました。
取敢えず解決とさせていただきます。
試していませんがDisplayAlertsで抑制できませんか?
https://www.petitmonte.com/bbs/answers?question_id=480
Excel.DisplayAlerts := False;//メッセージダイアログを表示しない
このへん
かくさん、ありがとうございます。
> Excel.DisplayAlerts := False;//メッセージダイアログを表示しない
実はこれも試して見ましたが、どうも保存時のダイアログに影響している
だけのようです。
一応、エクセルにESCキーを送信して行うようにしていますが
未だに後ろ髪を引かれていますww
Mr.XRAYです.
「シート+マクロ」これは,
マクロシートではなく,Sheet1のモジュールに登録したマクロということなんですね.
エクセルの初心者なもんですから,分かりせんでした (^^;
>仰るようにキーデータを送り込んで入力の方を抑止したほうが
>良さそうです。
もし,マクロ実行中はキーやマウスの操作を抑止するのであれば,
ApplicationオブジェクトのInteractiveプロパティが使えるかも知れません.
お役に立てなくてすみません。
もしかして
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
の
「ActiveWorkbook」を指定しているのが原因では?
他のEXCELファイルがActiveになっているという事はありませんか?
どちらかというとそちらを解決した方が良いかもしれません。
Mr.XRAYさん、かくさん ありがとうございます。
> ApplicationオブジェクトのInteractiveプロパティが使えるかも知れません.
ほ〜、こんなプロパティもあるんですね。
早速以下のような感じで入れ込んで見ました。
ExcelApplication1.Application.Interactive[EXID] := False;
〜 略 〜
ExcelApplication1.Application.Interactive[EXID] := true;
確かに、入力を全般的に阻止できるのですが、シートを
めくって見ることも出来なくなるようですので今回は使えそうにありません。
..しかし、他の用途には何か使えそうです。
> 他のEXCELファイルがActiveになっているという事はありませんか?
一応、必ず対象のエクセル表しか出してません。
(見えないプロセスのも削除するようにしています)
みなさん、いろいろありがとうございます。
直接解決とならなくても、ヒントにでもなる事もありますので
非常にありがたいです。
もう少し、粘って調べて見ます。
XP + EXCEL 2002 で
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
ExcelWorkSheet1.ConnectTo(ExcelWorkbook1.Worksheets['Sheet1'] as _worksheet);
try
ExcelApplication1.Run('Sheet1.test_macro');
except
end;
上記を実行しても
「マクロ Sheet1.test_macro が見つかりません。」のダイアログは
表示されないけど?
(try - except がなければ表示される)
ダイアログのCaptionがProject1なのでDELPHI側で表示させてる
と思うんだけど
>「マクロ Sheet1.test_macro が見つかりません。」
> ..のようなエラーメッセージが出てきます。
は誰が表示しているダイアログなのかな?
KHE00221さん、ありがとうございます。
> try
> ExcelApplication1.Run('Sheet1.test_macro');
> except
> end;
> 上記を実行しても
> 「マクロ Sheet1.test_macro が見つかりません。」のダイアログは
> 表示されないけど?
お〜〜、あれ? 前にやったんですが、今確認したらOKですね。
何やってたんだろう?!
いろいろソ−スを触っていてミスっていたのかも・・・
初心に帰って・・と言いますが、正に今回はこれが抜けていました。
ちゃんとメッセージが抑止出来て、やっと本来あって欲しい形になりました。
みなさん、いろいろとお騒がせしました。
本当にありがとうございました。 m(__)m
そう言えば、チェックが抜けていました。
ツイート | ![]() |