[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/08/08(Sun) 17:29
投稿者名:みっち〜
URL :
タイトル:
VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
Windows98SE、VB5、EXCEL97を使用して開発しています。(動作確認のOSはWindows98,2000)

EXCELファイルの雛型をVBから開き、セルの値の代入を行った後、別のファイル名で保存する作業をし
ています。
このとき、ファイル(複数)の作成が完了したらAPI関数ShellExecuteを使用してファイルの格納先の
ディレクトリを画面表示するようにしています。
上記のWindows98SEでは問題ないのですが、OSがWindows2000でEXEを実行すると、EXEを終了せずに出
力したファイルを開こうとするとファイルがうまく開けません。(EXCELのツールバーのみが表示され
る)
EXCELが起動しているか確認するルーチンをいれてみたところ、98SEの場合は終了しており、2000の場
合は起動したままになっているようでした。
作成したファイルをSHELL関数を使って直接開くとWindows2000でも問題無く表示されました。

過去LOGなど確認してみましたが、違いが分からず対処に苦心しています。
どなたかアドバイスをお願いできたらと思います。

投稿時間:2004/08/08(Sun) 18:52
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
> このとき、ファイル(複数)の作成が完了したらAPI関数ShellExecuteを使用して
>ファイルの格納先の ディレクトリを画面表示するようにしています。

ShellExecute でそのような事できましたか?

> 上記のWindows98SEでは問題ないのですが、OSがWindows2000でEXEを実行すると、EXEを終了せずに出
> 力したファイルを開こうとするとファイルがうまく開けません。(EXCELのツールバーのみが表示され
> る)

状況がよく解りません。

>過去LOGなど確認してみましたが、違いが分からず対処に苦心しています。
>どなたかアドバイスをお願いできたらと思います。

凡人ですので透視はできません。m(__)m

再現できる(部分ではなく)コードを投稿して下さい。

投稿時間:2004/08/09(Mon) 10:29
投稿者名:みっち〜
URL :
タイトル:
Re^2: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
> > このとき、ファイル(複数)の作成が完了したらAPI関数ShellExecuteを使用して
> >ファイルの格納先の ディレクトリを画面表示するようにしています。
>
> ShellExecute でそのような事できましたか?

 説明が言葉不足と私自身の理解不足で申し訳ありません。
 こちらの ファイル操作関係 の「指定のフォルダをエクスプローラで表示する」を参考にさせて
いただきました。

> > 上記のWindows98SEでは問題ないのですが、OSがWindows2000でEXEを実行すると、EXEを終
了せずに出
> > 力したファイルを開こうとするとファイルがうまく開けません。(EXCELのツールバーのみ
が表示され
> > る)
>
> 状況がよく解りません。
 
 非常に説明しづらいのですが…
 Windows2000のマシンでEXEを実行すると、EXCELのタイトル、ツールバーは表示されるのですが、表
の部分だけが表示されないのです。 

> 再現できる(部分ではなく)コードを投稿して下さい。

 以下にコードを記述します。
  よろしくお願いします。

******************************************************************************
Option Explicit

        '拡張子に関連付けられたプログラムを実行する (P699)
        Private Declare Function ShellExecute Lib "shell32.dll" _
            Alias "ShellExecuteA" (ByVal hwnd As Long, _
            ByVal lpOperation As String, ByVal lpFile As String, _
            ByVal lpParameters As String, ByVal lpDirectory As String, _
            ByVal nShowCmd As Long) As Long
        '指定のウインドウを非表示にし、他のウインドウをアクティブ化
        Private Const SW_HIDE = 0
        'ウインドウをアクティブ化し表示(元の位置とサイズで復元)
        Private Const SW_RESTORE = 9
        'ウインドウをアクティブ化し最大表示する
        Private Const SW_SHOWMAXIMIZED = 3
******************************************************************************
Public Function gfb_PrintData() As Boolean
On Error GoTo Err_gfb_PrintData

    Dim sFileName   As String   'ファイル名(フルパス)
    Dim iRc         As Integer
    
    Dim iLp         As Integer
    
    gfb_PrintData = False
    
    gWS.BeginTrans
    '===データ作成===
    If Not gfb_CreateData2() Then
        If Not gbCancel Then
            MsgBox "Excelデータの作成に失敗しました", vbCritical + vbOKOnly, gcAP
P_TITLE
        End If
        gWS.Rollback
        gfb_PrintData = True
        GoTo Exit_gfb_PrintData
    End If
    
    gWS.CommitTrans
    
    If gfb_OutPutExcel() Then
        MsgBox "Excelファイルの作成が完了しました。", vbOKOnly + vbInformati
on, gcAPP_TITLE
        'フォルダを開く
        ShellExecute frmMain.hwnd, "Open", "D:\出力先", _
                                          vbNullString, vbNullString, SW_RESTORE
   End If

    gfb_PrintData = True

Exit_gfb_PrintData:
    Exit Function
    
Err_gfb_PrintData:
    MsgBox Err.Description & " (" & Err.Number & ")"
     Resume Next
Cancel_Error:
    gfb_PrintData = True
    Exit Function
    
End Function
******************************************************************************
Public Function gfb_OutPutExcel() As Boolean
On Error GoTo Err_gfb_OutPutExcel
    Dim oExcelApp       As Object   'Excelオブジェクト
    Dim oDataSheet2     As Object   'Excelシートオブジェクト
    Dim sFileName       As String   'Exlce出力ファイル名(フルパス)
    Dim rsK             As Recordset
    Dim bFlg            As Boolean
    
    gfb_OutPutExcel = False
    Set rsK = gDB.OpenRecordset(TB_WEEK, dbOpenSnapshot)
  
    flgOpen = False
  
    Do Until rsK.EOF
        bFlg = False
        If flgOpen = True Then
            '----- Excelファイルデータ保存 -----
            oDataSheet2.SaveAs (sFileName)
            Dim w
            For Each w In oExcelApp.Workbooks
                w.Save
            Next w
            oExcelApp.Quit
            flgOpen = False
        End If
        
        If Dir(App.Path & "\wk_雛型.xls") <> "" Then
                Kill App.Path & "\wk_雛型"
        End If
        '出力ファイル名保存----------
        giFIdx = giFIdx + 1
        ReDim Preserve GM_FName(giFIdx)
        sFileName = gsEXL_OUT_PATH & giFIdx & "タイトル.xls" '出力ファイ
ル名
        GM_FName(giFIdx) = sFileName
        '---------------------------
        '----- 雛形のExcelをコピーする -----
        FileCopy App.Path & "\" & gcEXL_IN_FILE, App.Path & "\wk
_雛型.xls"
        '----- Excelを開く -----
        Set oExcelApp = CreateObject(Class:="Excel.Application")
        oExcelApp.Workbooks.Add (App.Path & "\wk_" & gsEXL_OUT_FILE)
        Set oDataSheet2 = oExcelApp.ActiveWorkbook.Worksheets("sheet1")

        flgOpen = True
    
        '-----シートへ出力-------------------------------------
        oDataSheet2.cells(4, 2).Value = "タイトル1"
        oDataSheet2.cells(4, 4).Value = "タイトル2"
        
    rsK.MoveNext
    Loop
  
    
    If flgOpen = True Then
        '----- Excelファイルデータ保存 -----
        oDataSheet2.SaveAs (sFileName)
        For Each w In oExcelApp.Workbooks
            w.Save
        Next w
        oExcelApp.Quit
    End If
    
    gfb_OutPutExcel = True

Close_gfb_OutPutExcel:
    Set oExcelApp = Nothing
    Set oDataSheet2 = Nothing
    rsK.Close

Exit_gfb_OutPutExcel:
On Error GoTo 0
    Exit Function

Err_gfb_OutPutExcel:
    MsgBox "Excelファイル作成処理エラー " & vbNewLine & _
            Err.Description & " (" & Err.Number & ")", vbCr
itical, gcAPP_TITLE
    Resume Close_gfb_OutPutExcel
    
End Function

投稿時間:2004/08/09(Mon) 11:49
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
せっかくコードを投稿してもらってもこのコードでは試す事ができませんし
試す気にもなりません。
掲示板の使い方を参考にしてコード等を投稿される場合は図表モードで投稿して下さい。
又、間違った場合等は、下部から修正もできます。

貴方がこのコードをペーストして見て状況が確認できますか?

On Error GoTo Err_gfb_PrintData 等のエラー処理はコメント化して動かして
見て下さい。
又、プロセスにExcelが残っていないか確認して下さい。

BookのWindowが閉じた状態になっているものと思われるので、一度Excelファイルを開いた
時に ****.Visible = True を入れて試して見て下さい。

  

投稿時間:2004/08/09(Mon) 20:19
投稿者名:みっち〜
URL :
タイトル:
Re^4: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
> 又、間違った場合等は、下部から修正もできます。
度々申し訳ありません。
再度コードを投稿します。

> 又、プロセスにExcelが残っていないか確認して下さい。
下のコードでは4回ループさせていますが、再度確認したところ、
(作成するファイルの数‐2)の数のEXCELがプロセスに残っていました。
なので、出力させたいファイルが2つまでのときは問題がなかったです。
残ったままのプロセスを終了させるにはどのような処理を行えば良いのでしょうか。
  
以下コード全文です。
よろしくおねがいします。

↓↓↓↓

Option Explicit

      Private Declare Function ShellExecute Lib "shell32.dll" _
      Alias "ShellExecuteA" (ByVal hwnd As Long, _
      ByVal lpOperation As String, ByVal lpFile As String, _
      ByVal lpParameters As String, ByVal lpDirectory As String, _
      ByVal nShowCmd As Long) As Long

      Private Const SW_HIDE = 0
      Private Const SW_RESTORE = 9
      Private Const SW_SHOWMAXIMIZED = 3
      
   Const sPath As String = "D:\work"
      


Private Sub Command1_Click()
  Dim sFileName As String 'ファイル名(フルパス)
    Dim iRc As Integer
    Dim ilp As Integer

     If gfb_OutPutExcel() Then
        MsgBox "Excelファイルの作成が完了しました。", vbOKOnly + vbInformation
        'フォルダを開く
        ShellExecute Form1.hwnd, "Open", sPath, _
            vbNullString, vbNullString, SW_RESTORE
    End If
End Sub
      


Public Function gfb_OutPutExcel() As Boolean
    Dim oExcelApp As Object 'Excelオブジェクト
    Dim oDataSheet2 As Object 'Excelシートオブジェクト
    Dim sFileName As String 'Exlce出力ファイル名(フルパス)
    Dim bFlg As Boolean
    Dim ilp   As Integer
    Dim flgOpen As Boolean
    Dim giFIdx As Integer
    Dim GM_FName()   As String

    gfb_OutPutExcel = False
    
    flgOpen = False
    
    Do Until ilp = 4
    bFlg = False
    If flgOpen = True Then
        '----- Excelファイルデータ保存 -----
        oDataSheet2.SaveAs (sFileName)
        Dim w
        For Each w In oExcelApp.Workbooks
            w.Save
        Next w
        oExcelApp.Quit
        Set oExcelApp = Nothing
        Set oDataSheet2 = Nothing
        flgOpen = False
    End If
    
    If Dir(App.Path & "\wk_book1.xls") <> "" Then
        Kill App.Path & "\wk_book1.xls"
    End If
    '出力ファイル名保存----------
    giFIdx = giFIdx + 1
    ReDim Preserve GM_FName(giFIdx)
    sFileName = sPath & "\" & giFIdx & ".xls"  '出力ファイル名
    GM_FName(giFIdx) = sFileName
    '---------------------------
    '----- 雛形のExcelをコピーする -----
    FileCopy App.Path & "\book1.xls", App.Path & "\wk_book1.xls"
    '----- Excelを開く -----
    Set oExcelApp = CreateObject(Class:="Excel.Application")
    oExcelApp.Workbooks.Add (App.Path & "\wk_book1.xls")
    Set oDataSheet2 = oExcelApp.ActiveWorkbook.Worksheets("sheet1")
    
    flgOpen = True
    
    '-----シートへ出力-------------------------------------
    oDataSheet2.cells(4, 2).Value = "タイトル1"
    oDataSheet2.cells(4, 4).Value = "タイトル2"
    
      ilp = ilp + 1
    Loop
    
    If flgOpen = True Then
    '----- Excelファイルデータ保存 -----
        oDataSheet2.SaveAs (sFileName)
        For Each w In oExcelApp.Workbooks
            w.Save
        Next w
        oExcelApp.Quit
        Set oExcelApp = Nothing
        Set oDataSheet2 = Nothing
    End If
    
    gfb_OutPutExcel = True

End Function

投稿時間:2004/08/09(Mon) 21:36
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
このままのコードを試して見ましたが、私の環境ではプロセスも残っていないし
問題ないようです。(VB6.0(SP5)  WindowsXP プロ Excel2002 )
Windows95 VB5.0(SP3) Excel2000 の環境でも試しましたが問題ありません。

コード実行結果表示したフォルダ内の 1.xls をダブルクリックで開き表が表示されれば
いいのですよね。

ただ、ちょっと気になったのですが、開放は下記の順でして下さい。(両方とも)
        Set oExcelApp = Nothing
        Set oDataSheet2 = Nothing
         ↓
        Set oDataSheet2 = Nothing
        Set oExcelApp = Nothing

それでもまだこのコードでプロセスが残るようなら
下記のように開放してから次に起動するまで少し待ち時間を作って見て下さい。
プロセスが開放されない内に次に起動すると残った記憶があります。

テストする時は最初7秒位で設定して見てそれで解決できたなら秒数を少なくして
テストして見てください。

        oExcelApp.Quit
        Set oDataSheet2 = Nothing
        Set oExcelApp = Nothing
  '----------------------------------- 追加 --------------------    
        Dim lngSt As Long  '別の場所に宣言しておいて下さい
        lngSt = Timer
        Do While Timer - lngSt < 3  '3〜5秒待ってみる
          DoEvents      '制御をWindowsに渡す
        Loop
     '------------------------------------------------------------
        flgOpen = False
    End If

後、関係ないかも知れませんが、Set oExcelApp = CreateObject("Excel.Application") で
いいと思います。

フォルダが表示してから5秒後位にファイルを開くようにしてみてどうなるかも
調べてください。

それでも改善できなければ、元のExcelファイルを違うものに変更して見てください。
(結構、Excelファイルに問題があった場合が多いので)


# テスト結果プロセスが残っていればその都度、手動で終了させてから再度テスト
 するようにして下さい。
 残っている(Excel内でエラーが発生している)から開けないのです。



投稿時間:2004/08/17(Tue) 21:01
投稿者名:みっち〜
URL :
タイトル:
Re^6: VBからEXCELファイルを作成し、完了後ファイルがうまく開かない
花ちゃん様
返信が遅くなってしまいました。
ご指摘の箇所を修正・追加して試してみたのですが、プロセスが残ったままになってしまいました。
結局、時間的な問題もあり、プログラムのほうは出力させるファイルの数を1つに限定することで対応
することにしました。(出力させるファイルの数が1つだけのときは正常にファイルが開くので…)
いろいろ教えていただいたのでなんとか解決したかったのですが…。
マシン(環境?)によってプロセスが残ったり残らなかったり、というのは良くあることなのでしょう
か。
今後の参考のために、ご存知のことがあれば教えてください。

投稿時間:2004/08/18(Wed) 00:46
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^7: EXCELが残る
>マシン(環境?)によってプロセスが残ったり残らなかったり、というのは
>良くあることなのでしょうか。
> 今後の参考のために、ご存知のことがあれば教えてください。

環境というより、Excelの内部でエラーが発生しているのだと思います。
その原因がコードによる場合とファイルに問題がある場合が考えられるかと思います。

コードに原因がある場合は、部分的にコメントアウトしながら試してみれば、どの部分
が影響しているのかがおおよそ掴めるかと思います。
起動と終了以外のコードをコメントアウトして実行結果問題があるのか?
多分、Excelは残っていないはず、なら次の部分のコメントを解除して試すを繰り返せば
見当がつくかと思います。

又、下記アドレスを読んでおいて下さい。
hhttp://www.bcap.co.jp/hanafusa/VBHLP/ExcelErr.htm