みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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 起動画面表示 起動画面非表示 起動画面を出さない
起動画面を消す

投稿日時 - 2009-08-21 14:20:17

QNo.5225117

困ってます

質問者が選んだベストアンサー

COMモデルでExcelを起動すれば"CreateObject"と同じ効果が得られ
ますが、相当難しいプログラムになります。むしろ、VBScriptで
プログラムを作り、DLLからはCreateProcessによって、wscript.exeを
起動するようにすれば同じように動きます。

投稿日時 - 2009-08-21 19:13:10

お礼

nda23 さん たびたびのご回答ありがとうございます^^

COMってのがよくわからないのですが
CreateProcessを使ってエクセルファイルを直接呼んでみたら
うまくいきましたので、解決とさせていただきます^^

お世話になりました♪

投稿日時 - 2009-08-25 11:49:40

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

質問1については、Excel VBAの問題ではなく、起動側プログラムの問題でしょう。
いくらVBAで画面を非表示にしても、VBAはExcelが起動してから動く物ですから最初にちらりとExcel画面が表示されてしまうのは仕方が無いかと思います。
起動側プログラムでExcelを非表示にして起動してください。

投稿日時 - 2009-08-21 16:42:29

お礼

回答ありがとうございます^^

起動側の問題ですか・・・泣
C&VC++で作成されたDLLから、
::ShellExecute(NULL, "open", fnm, NULL, NULL, SW_HIDE);
でコールしていて、設定は HIDE を使って非表示にしてるのですが
どうも、うまくいってないみたいですね。

そちらも、もう少し調べてみますね^^
ありがとうございました^^

投稿日時 - 2009-08-21 18:13:01

ANo.3

>VBA 起動時にエクセルの画面が表示されてしまう
別のExcelからVBAを実行するのならScreenUpdating プロパティで画面の更新を抑止してみては
Application.ScreenUpdating = False
Workbooks.Open("C:\****.xls")
Application.ScreenUpdating = True

投稿日時 - 2009-08-21 16:25:26

お礼

書き込みありがとうございます^^

言葉足らずですみません。
別のプログラムというのは、
C言語及び、VC++で作られているDLLから
直接ファイル起動しています。

投稿日時 - 2009-08-21 18:07:47

ANo.2

>別のプログラムから
「別のプログラム」って何ですか?OLEにすればExcelは非表示ですよ。
【VBAの例】
Dim APL, WKB
Set APL = CreateObject("Excel.Application")
Set WKB = APL.Workbooks.Open("C:\~")
もし、「別のプログラム」がExcelだったらExecuteExcel4Macroも
使えます。
>記述を間違えていたりしますか?
>ThisWorkbook.Close False
自身を閉じています。直前のIf文は1行で閉じていますので、
上記ステートメントは無条件に実行されます。

投稿日時 - 2009-08-21 16:04:52

補足

>別のプログラムから

 失礼いたしました。
 DLLファイルで、元はC言語+VC++で作成されたものです

投稿日時 - 2009-08-21 17:31:48

お礼

返信ありがとうございます。
言葉足らずですみませんでした。


>OLE ??
よくわからないので、調べてみます

>Set APL = CreateObject("Excel.Application")
Set WKB = APL.Workbooks.Open("C:\~")
これは、エクセルに入ってからファイルをオープンするということですか?


>ThisWorkbook.Close False
この命令はexcelのアプリケーション自体を終了させる命令なんですね?
他のエクセルが開いてた時に、
自分がマクロを組んで動かしているエクセルを excel.xml だとし、
それ以外に動いているエクセルを test.xml とした場合に
excel.xml だけを殺したかったのですがうまくいってなかったのですね。
ありがとうございます、もう少し調べてみます。

投稿日時 - 2009-08-21 18:06:03

ANo.1

参考資料添付

マルチメディアファイルは削除されたか見つかりません。

投稿日時 - 2009-08-21 14:49:13

お礼

早速のお返事ありがとうございます。
ですが、添付資料のファイル形式等の設定で
削除されてしまっているようです・・・泣

参考資料みたいですぅ~。
再投稿おねがいいたします^^

投稿日時 - 2009-08-21 15:01:40

あなたにオススメの質問