tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルエクセルのプレビューから元のVB画面に戻る方法
記事No15216
投稿日: 2011/06/07(Tue) 19:32
投稿者あさがお44
環境 WinXP エクセル2007 VB6.0
コードをまず書きます。


    Screen.MousePointer = 11
    Me.Enabled = False

    'データセット
    
    Me.Show        
    
    Set AppExcel = CreateObject("EXCEL.Application")
    AppExcel.Visible = False
    Set xlBook = AppExcel.Workbooks.Open(FILE_NM)
    retL = KY_SetXLAP(AppExcel)                        
    Set xlSheet = AppExcel.Worksheets(1)
    xlSheet.SELECT
    
    '帳票作成
    
    '保存
    xlBook.Save

    'プレビュー
    AppExcel.Visible = True
    xlSheet.PrintPreview
    AppExcel.Visible = False
    xlBook.Close
    Set xlSheet = Nothing
    Set xlBook = Nothing
    
    'エクセルの終了
    AppExcel.Quit
    Set AppExcel = Nothing
    
    Me.Enabled = True
    Me.A_CMB.SetFocus
    Screen.MousePointer = 0


上記プログラムの一部ですが、VBからエクセルを作成してプレビュー画面を表示しています。そして終了するとVBに帰ってきます。
それは出来ているのですが、問題は帰ってきた時にVBの元の画面以外の画面が表示される事です。
例えば、エクスプローラーからEXEをクリックしてこのPGを立ち上げたとしますよね。
それでこのPGの画面からいろいろ設定してプレビューのボタンを押して上記の処理を行ったとします。帰ってきた時にPGの画面になってほしいのにエクスプローラーの画面に戻ってきます。どうすればPGの画面に戻す事が出来るでしょうか?
よろしくお願いします。

[ツリー表示へ]
タイトルRe: エクセルのプレビューから元のVB画面に戻る方法
記事No15218
投稿日: 2011/06/08(Wed) 08:58
投稿者花ちゃん
現状では、エクスプローラの裏に隠れているのでしょうか?
それなら、AppActivate ステートメント でウィンドウをアクティブにしてみてください。
それでもだめなら、Win32 API の SetForegroundWindow を使ってみてください。

--------------------------------------------------------------------------------
ちょっと便利な検索ソフト(http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=117)
を使って、キーワード【SetForegroundWindow】での検索結果(当サイト内・外の検索でも同じ)

  ヒット件数    検索対象サイト名    検索結果のURL(短く変換しています)
            106 件  VB初心者友の会             http://tinyurl.com/3mmkxya
             90 件  Programing Library         http://tinyurl.com/3tv79eh
             65 件  ★VBレスキュー(花ちゃん)   http://tinyurl.com/3qrlkdx
--------------------------------------------------------------------------------

[ツリー表示へ]
タイトルRe^2: エクセルのプレビューから元のVB画面に戻る方法
記事No15221
投稿日: 2011/06/08(Wed) 18:26
投稿者あさがお44
ありがとうございます。

そのとおりです。
エクスプローラーの後ろに隠れてしまいます。
初めにPGの画面がアクティブだったのにエクセルから戻るとエクスプローラが前に出ているのです。

花ちゃんの教えてくださったAppActivate ステートメントでやってみたのですが
AppActivate title の titleが何か良く分かりません。
(アクティブにするアプリケーション ウィンドウのタイトル バーのタイトルを表す文字列式を指定します。)とヘルプにあるのでCaptionを使ったらエラーになります。

で、もう一つのSetForegroundWindowを使ってみました。
出来たのですが、実はエクセルを前面に出すためにすでに使っています。
前に書かせてもらったプログラムコードの
retL = KY_SetXLAP(AppExcel)
は実は
Public Function KY_SetXLAP(ByVal XLAPP As Object) As Long
    'Excel2007="12.0" Excel2003="11.0" Excel2002="10.0" Excel2000="9.0"
    If Val(XLAPP.Version) > 9 Then
        KY_SetXLAP = SetForegroundWindow(XLAPP.hwnd)
    End If
End Function
というプログラムコードにいきます。
で思ったのですが、そもそもこのコードが間違っているからエクスプローラが前にくるのでは?
ふつう初めにPGの画面がアクティブだったのにエクセルから戻るとエクスプローラが前に出たりしないですよね!?
よく分からないのですが、花ちゃんはどう思われますか?

[ツリー表示へ]
タイトルRe^2: エクセルのプレビューから元のVB画面に戻る方法
記事No15222
投稿日: 2011/06/08(Wed) 18:49
投稿者あさがお44
質問ばかりですみません。

プログラムは出来たのですが、なんだかすっきりしなくていろいろ考えていたら思いついたのですが、
前面に出ているのと、
アクティブであるのとは違う事ですか?

[ツリー表示へ]
タイトルRe^3: エクセルのプレビューから元のVB画面に戻る方法
記事No15223
投稿日: 2011/06/08(Wed) 20:50
投稿者魔界の仮面弁士
> 前面に出ているのと、
> アクティブであるのとは違う事ですか?
別物です。たとえば、常に最前面に表示なウィンドウは、
必ずしもアクティブであるとは限りませんよね。

また、最前面表示で無い場合も同じことです。たとえば、
 Private Sub Command1_Click()
  Call Shell("notepad", vbNormalNoFocus)
 End Sub
を実行するとメモ帳が起動しますが、そのメモ帳は起動時にアクティブとならず、
かつ、呼び出したフォームよりも手前に表示された状態で起動する事が期待されています。

[ツリー表示へ]
タイトルRe^4: エクセルのプレビューから元のVB画面に戻る方法
記事No15227
投稿日: 2011/06/09(Thu) 16:59
投稿者あさがお44
ありがとうございます。
すごく良く分かりました。
確かに前面に出ていてもそれだけのソフトってありますね。

でいろいろ考えて、今回の場合エクスプローラが前面に出ているのではなく、
その前に出るべきVBの画面が出ないのが問題だと思いました。
それでエクセルの前面に出すためにSetForegroundWindowを使っているのですが
このタイミングでエクセルはAppExcel.Visible = Falseにしているので画面に出ないし
VBの画面はMe.Enabled = Falseになっているので前面に出れないのではと思いつきました。
よく分からないのですがSetForegroundWindowの説明で無条件に前に出せないとか書いていたので。(説明読んでもあまりよく分からないのですが。。。)
でもそういう事ではないのかなと思ったので。
でSetForegroundWindowの前に
    MFORM.Enabled = True          
    MFORM.SetFocus
の2行を入れてみました。
そしたら出来ました。
前のエクセルを終了させてからVBの画面をSetForegroundWindowで前に出すのでも最終的に前に出たのですがエクスプローラがいろんなタイミングでちらちら見えるんですよね。
それでどうしようかなと思っていたのですが完全に解決できました。
ありがとうございました。

[ツリー表示へ]