![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
VB6のコーディングで、Shell関数を使用してEXCELを起動しているのですが、EXCEL2002では、他のバージョンと表示方法が変わってしまいました。
コーディングは
Shell(PATHつきのEXCEL.EXE, vbMinimizedFocus)
としているのですが、
EXCEL2000までは、正常にアイコン化されたEXCELが起動できていたのに、EXCEL2002からは最後に使用した大きさ(最大化した状態でEXCEL2002を終了していたら最大化、アイコン化した状態で終了していたらアイコン化)で起動されてしまいます。
また、EXCEL2000までは表示されなかったロゴマーク?も表示されてしまいます。
ちなみにWORD2002はアイコン化して起動可能でした。
(但し、こちらもロゴマークは表示されます。)
動作として、ひっそりとEXCELを起動してマクロを使用した帳票を出力する。
としたいのですが、なにかいい方法がありましたら教えてください。
(ShellExeCuteもうまく動作しませんでした。)
No.4
- 回答日時:
そーですかー。
Shellのオプションを受け入れてくれませんかー。。。おそらく、Windowsから送られてくるメッセージをSpyで見てみたら、正確な方法がわかるのでしょうが・・・環境がないと実験ができないので、原因追求をしたくてもできないのです。。。
なので、こちらの方でも唯一可能な方法で作成しました。
もろ反則技です。
処理内容
1.ピクチャボックスを創生
2.ピクチャボックスの親ハンドルをデスクトップに変更
3.ピクチャボックスのサイズを画面サイズに変更し、最前面固定
4.デスクトップの状態をピクチャボックスに描画
5.ピクチャボックスを表示
6.エクセルを起動
7.エクセルを最小化
8.ピクチャボックスの破棄
ねっ反則でしょ?(笑)
関数creDmyPicで1~5の処理を行っています。
関数openExcelで6~7の処理を行っています。
ちなみに・・・
この方法は、どうしても見せたくない処理があるけど、いちいち制御するのが面倒な時に使ってます。
これがダメなら・・・すいません・・・回答不能です。。。
Option Explicit
Private Const HWND_TOPMOST = (-1)
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Sub Command1_Click()
Dim dmyPic As PictureBox
'ピクチャボックスを作成して、一時画面描画を視覚的にとまったように見せる
Set dmyPic = creDmyPic("picDammy")
If dmyPic Is Nothing Then
Call MsgBox("ダミー作成失敗")
End If
'エクセルブックのオープン
Call openExcel("c:\test.xls")
'アクティブウィンドウを自分自身に設定
Call SetForegroundWindow(Me.hwnd)
'ピクチャボックスウィンドウの破棄
Controls.Remove dmyPic
End Sub
'【機 能】エクセルを最小化で起動する
'【引 数】エクセルブックのフルパス
'【注意点】エラーチェックを使用してない
Private Sub openExcel(inOpenXlsBookPath As String)
Dim xlApp As Excel.Application
'エクセル起動
Call Shell("C:\Program Files\Microsoft Office\Office\EXCEL.exe /e")
Set xlApp = GetObject("", "Excel.Application")
'エクセル最小化
xlApp.WindowState = xlMinimized
'ワークブックオープン
xlApp.Workbooks.Open inOpenXlsBookPath
'開放
xlApp.Visible = True
Set xlApp = Nothing
End Sub
'【機 能】ピクチャボックスを創生して、現在のデスクトップ状態を描画し、最前面で表示を行う
'【引 数】創生するピクチャボックスの名称(任意)
'【注意点】パラメータには既存のピクチャボックスと重複しない名称を使用すること
Private Function creDmyPic(inPicBoxName As String) As PictureBox
Dim picWork As PictureBox 'ピクチャボックスオブジェクト
Dim lngDeskTopWnd As Long 'ハンドル(デスクトップ)
Dim rcDeskTop As RECT '領域座標(デスクトップ)
Dim lngDeskTopDC As Long 'デバイスコンテキスト(デスクトップ)
'左位置/上位置/幅/高
Dim lngL As Long, lngT As Long, lngW As Long, lngH As Long
'失敗したら終了
On Error GoTo PGMEND
'ピクチャボックスを作成
Set picWork = Controls.Add("VB.PictureBox", inPicBoxName)
'ピクチャボックスの初期設定
With picWork
.Appearance = 0
.AutoRedraw = True
.AutoSize = False
.BorderStyle = 0
End With
'デスクトップのハンドルを取得
lngDeskTopWnd = GetDesktopWindow
'デスクトップ領域の座標を取得
Call GetWindowRect(lngDeskTopWnd, rcDeskTop)
'デスクトップのデバイスコンテキストを取得
lngDeskTopDC = GetDC(lngDeskTopWnd)
'左位置/上位置/幅/高を取得
With rcDeskTop
lngL = .Left: lngT = .Top: lngW = .Right - .Left: lngH = .Bottom - .Top
End With
With picWork
'親ハンドルの変更(ピクチャボックスをフォームから飛び出させる)
Call SetParent(.hwnd, lngDeskTopWnd)
'デスクトップの領域にピクチャボックスのサイズをあわし、画面Zオーダーを最前面固定にする
Debug.Print SetWindowPos(.hwnd, HWND_TOPMOST, lngL, lngT, lngW, lngH, 0)
'描画実行
Call StretchBlt(.hdc, lngL, lngT, lngW, lngH, lngDeskTopDC, lngL, lngT, lngW, lngH, vbSrcCopy)
'ピクチャボックスの表示
.Visible = True
End With
'ピクチャボックスオブジェクトを返す
Set creDmyPic = picWork
PGMEND:
End Function
No.3
- 回答日時:
ShellでvbMinimizedFocusなどが無効なのですよね?
もしかしたら、vbHideも無効なのかな?
さっきのは [Set xlApp = New Excel.Application] で起動してましたが、今度は[Shell]で起動して、[GetObjectでxlAppをセット]してます。これでもダメですか?
こちらに環境がないので、すいませんがそちらでテストしてください。
できたら、結果報告もお願いします。
Private Sub Command1_Click()
Dim xlApp As Excel.Application
Call Shell("C:\Program Files\Microsoft Office\Office\EXCEL.exe", vbHide)
Set xlApp = GetObject("", "Excel.Application")
xlApp.Workbooks.Add
xlApp.WindowState = xlMinimized
xlApp.Visible = True
Set xlApp = Nothing
End Sub
結果報告です。無理でした(T_T)
shellのウィンドウスタイルの指定がまったく無視されるみたいです。
APIで色々試してみます。
No.2
- 回答日時:
ツールバーから
[プロジェクト]の[参照設定]より
Microsoft Excel x.x Object Library
をチェック入れて使用してください。
x.xの部分は、環境によって違います。
Private Sub Command1_Click()
Dim xlApp As Excel.Application
'Ecxel起動
Set xlApp = New Excel.Application
xlApp.Workbooks.Open "C:\TEST.xls"
'Ecxel最小化
xlApp.WindowState = xlMinimized
'表示する
xlApp.Visible = True
'Ecxel開放
Set xlApp = Nothing
End Sub
ありがとうございます。見事にアイコン化されました。
ただ、Shellでなくても構いませんといったのに申し訳ございませんが、
EXCEL2000とEXCEL2002を両方インストールした端末で、バージョンを指定して起動する必要があったので、やはりできればファイル名を指定できるShellの方を使用できればと思います。
(バージョンの指定とは単純にインストールしているフォルダの指定です。)
この回答は、参考になりました、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(パソコン・スマホ・電化製品) CMD等でPC操作(excel開く等)を自動化させたい 1 2023/03/15 09:53
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- Excel(エクセル) Excelのウィンドウが少し小さく、ズレて立ち上がります 1 2022/06/27 16:25
- その他(Microsoft Office) office2010とoffice365の共存でoffice365を優先で起草させたい 3 2023/01/24 10:47
- その他(Microsoft Office) OneDrive Personalについて 1 2022/08/02 18:25
- その他(Microsoft Office) Windows Update 後、Office2019(Word、Excelなど)が消えた 4 2023/01/14 10:28
- Excel(エクセル) MSさん、シッカリしてよ~んッ! 3 2023/01/30 13:15
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- ノートパソコン EXCEL のドキュメントの回復について 2 2023/03/19 17:16
- Excel(エクセル) Excelで立ち上げたときに「参照が正しくありません」の表示がでる 7 2023/01/23 08:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
分かる人は簡単なのだろうが、v...
-
アウトルックが起動しているか...
-
Windowsの起動時間
-
htmlからcgiを自動的に起動させ...
-
wordのマクロからexcelの起動
-
Windows上のプログラム。「予め...
-
VBSから別のVBS起動するとき変...
-
VBSでExcelのUserFormをエクス...
-
Process.Startで起動したアプリ...
-
exeファイルを実行するとすぐに...
-
vba 時間の引き算 例えば 15:00...
-
C++初心者です。 debug asserti...
-
IT初心者です 仕事で、vb.netで...
-
Designer.vbは直接コードをいじ...
-
ActiveReportsを使って[印刷ダ...
-
PHPでPDFファイルの直接印刷
-
【助けて】 VB2005とVB.NETにつ...
-
印刷ダイアログを表示させたくない
-
印刷ダイアログを表示させない方法
-
「読み込み違反」が起きたとき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アウトルックが起動しているか...
-
VBAでOutlookを終了させたい Ex...
-
VBで実行中のEXEファイルの情報...
-
Process.Startで起動したアプリ...
-
Windows上のプログラム。「予め...
-
VBSから別のVBS起動するとき変...
-
EXCEL VBAから他アプリケーショ...
-
VBSで起動したアプリが前面表示...
-
分かる人は簡単なのだろうが、v...
-
別アプリの起動、終了について
-
VBAでSeleniumからChromeを起動...
-
VB6で呼び出し元の情報を取得す...
-
ACCESS VBAで別のACCESS(mdb)を...
-
フォームの最前面が効かない
-
exeファイルを実行するとすぐに...
-
実行ファイルへのドラッグ&ド...
-
「FindWindow」、ウィンドウハ...
-
MSDOS(バッチファイル)でプロセ...
-
C# 他のアプリケーションを優先...
-
QueryPerformanceCounter の使...
おすすめ情報