- ベストアンサー
VBA 起動時にエクセルの画面が表示されてしまう
VBA 起動時にエクセルの画面が表示されてしまう こんにちは、VBA初めて1週間ぐらいの初心者です よろしくお願いします 動作環境として、OS:XP excel:excel2007 を使用しています まずはじめに、エクセルを開いて内容変更セーブして終了するというマクロを組んだのですが 別のプログラムから、 そのエクセルファイルに起動をかけて マクロを実行し終了するよう作りました。 /*** コード ***/ ThisWorkbook 0 Private Sub Workbook_Open() 1 Application.Visible = False //エクセル画面を消す 2 3 call 内容変更し保存する関数() // 標準モジュール内 SUB 関数 4 5 ThisWorkbook.Saved = True // セーブしたことにする 6 If Workbooks.Count <= 1 Then Application.Quit // 他のエクセルが開いてない場合のみ終了する 7 ThisWorkbook.Close False // エクセル終了 8 End Sub /*** コード ***/ 質問1 ・1行目にエクセルの画面を消す関数を、プログラムの先頭に来ると思われる部分に入れて実行してみたのですが、 どうしても、起動してから画面を消す処理が始まるまでに、一瞬だけexcelのファイルが表示されてしまうのですが これを回避する方法はありますでしょうか? VBAを使ってマクロの処理をするのですが、 使う方にエクセルを使っているという事を悟られたくないのです 質問2 ・6行目、開いてるエクセルが自分だけの場合のみエクセルを終了すると組んだつもりなのですが、 処理を流すとエクセルで開いているファイルがすべて閉じてしまいます。 記述を間違えていたりしますか? 以上 ご教授お願いいたします <<検索ワード>> VBA VBA 起動画面表示 起動画面非表示 起動画面を出さない 起動画面を消す
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
COMモデルでExcelを起動すれば"CreateObject"と同じ効果が得られ ますが、相当難しいプログラムになります。むしろ、VBScriptで プログラムを作り、DLLからはCreateProcessによって、wscript.exeを 起動するようにすれば同じように動きます。
その他の回答 (4)
- mt2008
- ベストアンサー率52% (885/1701)
質問1については、Excel VBAの問題ではなく、起動側プログラムの問題でしょう。 いくらVBAで画面を非表示にしても、VBAはExcelが起動してから動く物ですから最初にちらりとExcel画面が表示されてしまうのは仕方が無いかと思います。 起動側プログラムでExcelを非表示にして起動してください。
お礼
回答ありがとうございます^^ 起動側の問題ですか・・・泣 C&VC++で作成されたDLLから、 ::ShellExecute(NULL, "open", fnm, NULL, NULL, SW_HIDE); でコールしていて、設定は HIDE を使って非表示にしてるのですが どうも、うまくいってないみたいですね。 そちらも、もう少し調べてみますね^^ ありがとうございました^^
- watabe007
- ベストアンサー率62% (476/760)
>VBA 起動時にエクセルの画面が表示されてしまう 別のExcelからVBAを実行するのならScreenUpdating プロパティで画面の更新を抑止してみては Application.ScreenUpdating = False Workbooks.Open("C:\****.xls") Application.ScreenUpdating = True
お礼
書き込みありがとうございます^^ 言葉足らずですみません。 別のプログラムというのは、 C言語及び、VC++で作られているDLLから 直接ファイル起動しています。
- nda23
- ベストアンサー率54% (777/1415)
>別のプログラムから 「別のプログラム」って何ですか?OLEにすればExcelは非表示ですよ。 【VBAの例】 Dim APL, WKB Set APL = CreateObject("Excel.Application") Set WKB = APL.Workbooks.Open("C:\~") もし、「別のプログラム」がExcelだったらExecuteExcel4Macroも 使えます。 >記述を間違えていたりしますか? >ThisWorkbook.Close False 自身を閉じています。直前のIf文は1行で閉じていますので、 上記ステートメントは無条件に実行されます。
お礼
返信ありがとうございます。 言葉足らずですみませんでした。 >OLE ?? よくわからないので、調べてみます >Set APL = CreateObject("Excel.Application") Set WKB = APL.Workbooks.Open("C:\~") これは、エクセルに入ってからファイルをオープンするということですか? >ThisWorkbook.Close False この命令はexcelのアプリケーション自体を終了させる命令なんですね? 他のエクセルが開いてた時に、 自分がマクロを組んで動かしているエクセルを excel.xml だとし、 それ以外に動いているエクセルを test.xml とした場合に excel.xml だけを殺したかったのですがうまくいってなかったのですね。 ありがとうございます、もう少し調べてみます。
補足
>別のプログラムから 失礼いたしました。 DLLファイルで、元はC言語+VC++で作成されたものです
- JavaJavax2
- ベストアンサー率22% (68/305)
参考資料添付
お礼
早速のお返事ありがとうございます。 ですが、添付資料のファイル形式等の設定で 削除されてしまっているようです・・・泣 参考資料みたいですぅ~。 再投稿おねがいいたします^^
お礼
nda23 さん たびたびのご回答ありがとうございます^^ COMってのがよくわからないのですが CreateProcessを使ってエクセルファイルを直接呼んでみたら うまくいきましたので、解決とさせていただきます^^ お世話になりました♪