VB6のコーディングで、Shell関数を使用してEXCELを起動しているのですが、EXCEL2002では、他のバージョンと表示方法が変わってしまいました。

コーディングは
Shell(PATHつきのEXCEL.EXE, vbMinimizedFocus)
としているのですが、
EXCEL2000までは、正常にアイコン化されたEXCELが起動できていたのに、EXCEL2002からは最後に使用した大きさ(最大化した状態でEXCEL2002を終了していたら最大化、アイコン化した状態で終了していたらアイコン化)で起動されてしまいます。
また、EXCEL2000までは表示されなかったロゴマーク?も表示されてしまいます。

ちなみにWORD2002はアイコン化して起動可能でした。
(但し、こちらもロゴマークは表示されます。)

動作として、ひっそりとEXCELを起動してマクロを使用した帳票を出力する。
としたいのですが、なにかいい方法がありましたら教えてください。
(ShellExeCuteもうまく動作しませんでした。)

このQ&Aに関連する最新のQ&A

A 回答 (5件)

解決したのでしょうか?


それとも反則技で怒ったのでしょうか?

もし別方法で解決したのであれば教えてください。
今後の参考にしたいです。。。m(__)m
    • good
    • 0
この回答へのお礼

お返事送れてすみません。(^^;)
解決しました。

こんな方法があるとは...
反則技なんてとんでもない、いい方法を教わりました。
ありがとうございました。
今後ともよろしくお願いします。m(__)m

お礼日時:2001/11/13 11:48

そーですかー。

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
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

結果報告です。無理でした(T_T)
shellのウィンドウスタイルの指定がまったく無視されるみたいです。
APIで色々試してみます。

お礼日時:2001/11/08 19:40

ツールバーから


[プロジェクト]の[参照設定]より
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
    • good
    • 0
この回答へのお礼

ありがとうございます。見事にアイコン化されました。
ただ、Shellでなくても構いませんといったのに申し訳ございませんが、
EXCEL2000とEXCEL2002を両方インストールした端末で、バージョンを指定して起動する必要があったので、やはりできればファイル名を指定できるShellの方を使用できればと思います。
(バージョンの指定とは単純にインストールしているフォルダの指定です。)
この回答は、参考になりました、ありがとうございました。

お礼日時:2001/11/07 22:55

EXCEL2002は未経験ですが・・・


Shellのオプション値がうまく動作しないのですね?

Shellじゃなきゃダメですか?
Excel2000しか手元にないので、動作環境は保証できませんが、別方法なら何とか最小化で起動できると思いますよ。

この回答への補足

Shellでなくても構いません。
ちなみにロゴマーク(起動画面)の問題は、起動スイッチ(/e)で解決しました。

補足日時:2001/11/07 21:33
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QShellExecuteでエクセルファイルが起動しません。

 今、API関数GetOpenFileNameで「ファイルを開く」コモンダイアログを出して、
 そこから選んだファイルのフルパスをテキストボックスに入れています。
 さらにそのテキストボックスの中に入ったフルパスをAPI関数ShellExecuteで起動
 させようとしているのですが、起動してくれません。
 ちゃんとフルパスは入っています。
 試しに新しいフォームを作ってShellExecute単独で、直接フルパスを
 指定してやってみたところ起動できました。
 問題は、パスではなく他の引数でしょうか??
 ちなみに第1引数   : me.hwnd
     第2引数   : "open"
     第3引数   : フルパス
     第4・5引数 : vbNullString
     第6引数   : SW_SHOW
と指定しました。
 第4と5の引数はvbNullCharや""と指定してみました。

 よろしくお願いします。

Aベストアンサー

ShellExecuteの戻り値は?

参考URL:http://www.vbvbvb.com/jp/gtips/0951/gShellExecuteSwShowNormalOpen.html

QProcess.Startで起動したアプリを最大化したいです。VB.NET

こんにちは、お世話になっております。
下記のようなコードでアプリケーションを起動して
ウィンドウを最大化したいのですが、
どのようにしたら良いでしょうか。
3行目のように大きさを画面いっぱいに設定する方法は
出来たのですが、最大化の方法がわかりません。
申し訳ありませんが、教えて頂きたくお願いいたします。

Dim p As System.Diagnostics.Process
p = System.Diagnostics.Process.Start("***")
MoveWindow(p.MainWindowHandle, 0, 0, 1024, 768, 1)

Aベストアンサー

>起動後のアプリが最大化されませんでした。
起動して、そのウインドウを最大化するサンプル
----------------------------------------------------------------
Imports System
Imports System.Text
Imports System.Diagnostics
Imports System.Threading
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic
'vbc Example.vb /r:System.dll
Namespace Example
Class ExampleClass
'Win32API
<DllImport("USER32.DLL")> _
Public Shared Function ShowWindow( _
ByVal handle As IntPtr, _
ByVal style As Integer ) As Integer
End Function

Shared Sub Main()
const SW_MAXMIZE as Integer = 3
Dim instance As Process
instance=Process.Start("notepad.exe") 'アプリケーションを起動する
Dim hWnd As IntPtr
hWnd = instance.MainWindowHandle 'ウィンドウハンドルを得る
Thread.Sleep(5000) '起動の完了を5秒待つ
ShowWindow(hWnd, SW_MAXMIZE) '最大化する
End Sub
End Class
End Namespace

>起動後のアプリが最大化されませんでした。
起動して、そのウインドウを最大化するサンプル
----------------------------------------------------------------
Imports System
Imports System.Text
Imports System.Diagnostics
Imports System.Threading
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic
'vbc Example.vb /r:System.dll
Namespace Example
Class ExampleClass
'Win32API
<DllImport("USER32.DLL")> _
Public Shared Function ShowWindow( _
ByVal...続きを読む

Q起動したアプリケーションを最大化したいのですが。(VB.NET)

先日からご回答を頂いて試行錯誤しているのですが、
どうしても実現できずに、再度質問させて頂きました。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2089161
の方法でMainWindowHandleを取得して、
そのウィンドウを最大化する動作なのですが、
スプラッシュウィンドウがあるせいか変化が見られません。
試しにHwndを取得する前にSTOPを入れて完全に起動する
まで待ってから実行したりもしてみたのですが、
やはり変化がありませんでした。

別の方法として、その起動したアプリケーションのIDやタイトルバーに出ているウィンドウの名前を
VBのサイトから引用させていただいた下記のコードで

Dim localByName As Process() = Process.GetProcessesByName("notepad")
Dim p As Process
For Each p In localByName
Console.WriteLine("{0} / {1} : {2}", p.Id, p.ProcessName, p.MainWindowTitle)
Next

知ることが出来たのでそのIDやMainWindowTitleを手がかりに
もう一度hWndを設定し直してShowWindow(hWnd, SW_MAXMIZE)を実行したいのですが、
hWndのところにはIDを入れてもだめなようなので、
IDの内容をhWndと同じ内容に変換する事が出来ればと考えています。


何度ももうしわけありませんが、どうかお助けください。m(__)m

先日からご回答を頂いて試行錯誤しているのですが、
どうしても実現できずに、再度質問させて頂きました。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2089161
の方法でMainWindowHandleを取得して、
そのウィンドウを最大化する動作なのですが、
スプラッシュウィンドウがあるせいか変化が見られません。
試しにHwndを取得する前にSTOPを入れて完全に起動する
まで待ってから実行したりもしてみたのですが、
やはり変化がありませんでした。

別の方法として、その起動したアプリケーションのIDやタ...続きを読む

Aベストアンサー

開発用に個人ツールとして、最大化/最小化ボタンのないウィンドウを操作するために、あなたが求めているような機能を作成したことがあります。

記憶が薄いですが、、、私も最初は[API:ShowWindow()]を利用していたと思います。
しかし、何故か操作出来る窓/出来ない窓がありました。原因は未だ不明です。。。
(理由がわかれば、教えて欲しいぐらいです。)



そこで、、、
以前
[2080663:サイズ変更したフォームのサイズと位置を設定・取得したいです。]
http://okwave.jp/kotaeru.php3?q=2080663
にて、アドバイスをした
[API:GetWindowPlacement()]
[API:SetWindowPlacement()]
にて解消いたしました。


以前のサンプルは、自プロセスのフォームに対して行っておりますが、
Form1_Loadイベントの「Dim l_ptr As IntPtr = Me.Handle」をパラメータ化し、
「p.MainWindowHandle」を利用することにより、設定が可能かと思います。


-----------------------------
Imports System.Runtime.InteropServices
-----------------------------


  Dim p As Process
  For Each p In localByName
    'Call 最大化実行(p.MainWindowHandle)
  Next


Private Sub 最大化実行(ByVal p_Ptr As IntPtr)
  Dim l_WINDOWPLACEMENT As WINDOWPLACEMENT
  Dim l_blnRet As Boolean

  '構造体のサイズ情報を格納
  l_WINDOWPLACEMENT.Length = Marshal.SizeOf(GetType(WINDOWPLACEMENT))

  '取得実行
  l_blnRet = GetWindowPlacement(p_Ptr, l_WINDOWPLACEMENT)
  If Not l_blnRet Then
    MsgBox("取得失敗")
    Return
  End If

  '各情報の指定
  With l_WINDOWPLACEMENT
    '最大表示を指定
    .showCmd = showCmd_SW.SW_SHOWMAXIMIZED
  End With

  '設定実行
  l_blnRet = SetWindowPlacement(p_Ptr, l_WINDOWPLACEMENT)
  If Not l_blnRet Then
    MsgBox("設定失敗")
    Return
  End If
End Sub

開発用に個人ツールとして、最大化/最小化ボタンのないウィンドウを操作するために、あなたが求めているような機能を作成したことがあります。

記憶が薄いですが、、、私も最初は[API:ShowWindow()]を利用していたと思います。
しかし、何故か操作出来る窓/出来ない窓がありました。原因は未だ不明です。。。
(理由がわかれば、教えて欲しいぐらいです。)



そこで、、、
以前
[2080663:サイズ変更したフォームのサイズと位置を設定・取得したいです。]
http://okwave.jp/kotaeru.php3?q=2080663
に...続きを読む

QWindowState Minimized(最小)で起動したものを、事後的にコードを使って最大化

画面を最小(WindowState Minimized)で起動したものを
コードを使って最大化するには、
どのプロパティを使えばいいのでしょうか。
サーバー用ソフトなので、タスクバーには、
表示されないので、システムトレイにアイコンを
おき、そこから、画面を表示できるようにしたい
のです。
(C#を使っていますが、VBでも大体同じに出来るの
で、お願いします)。

Aベストアンサー

WindowStateプロパティに
vsWindowStateMaximize か
FormWindowState.Maximized を設定すればいいと思います

QAccess2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。
以下のように、shell関数で、既存のExcelファイルを起動させました。
どうすれば、Excelファイルを終了できますか?
宜しくお願いします。

Dim fl_name As String

fl_name = "C:\XE2.xls"
Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

Aベストアンサー

こんばんは。

Shell であけるのに、閉めるほうが、これじゃあ、かなりヘンですが、まあ、こんな方法があるという程度にしてください。本来は、開けるほうは、CreateObejct にするなりしたほうがよいのですが。

Private Const fl_name As String = "testa.xls"

Private Sub コマンド_Click()
Dim xlApp As Object
 On Error Resume Next
 Set xlApp = GetObject(, "Excel.Application")
 If Not xlApp Is Nothing Then
  'もし保存するなら……
  If xlApp.Workbooks(fl_name).Saved = False Then
  xlApp.Workbooks(fl_name).Save
 End If
  xlApp.Quit
 End If
End Sub


このカテゴリの人気Q&Aランキング

おすすめ情報