[リストへもどる]
一括表示

投稿時間:2003/06/25(Wed) 15:40
投稿者名:こうじ
Eメール:
URL :
タイトル:
EXCEL処理について
お世話になります。
二つほど質問があります。

1) VBにてEXCELの計算式を使用したい為、計算式が入力されたブックをコピーして、
  コピーしたブックを裏(非表示)で起動しています。

   起動後にコピー元ブックを起動すると、何故かコピーされたブックも表示されてしまいます。
  (全然関係ないブックを起動しても、コピーされたブックが表示されてしまう時がある。。。)

2) 上記の質問に関連するかもしれませんが、
  画面終了時にブックも終了しているのですが、全然関係ないブックも終了されてしまいます。

上記の現象の対処方法はありませんか??
よろしくお願いします。

--------------------
環境 Windows2000 SP3
   VB6.0 SP5
   EXCEL2000 SP3
--------------------
'*** Form_Loadイベントにて *********************************
    ' Excelオブジェクトを作成
    Set xlApp = CreateObject("Excel.Application")
    ' Excelオリジナルファイル名
    strOrgFileNm = App.Path & "\" & "EXP.xls"
    ' TEMPディレクトリ取得
    strTempDir = Environ("TMP")

    ' 対象ファイル名作成
    strCopyFileNm = strTempDir & "\EXP_001.xls"

    ' オリジナルExcelからコピー
    FileCopy strOrgFileNm, strCopyFileNm
    ' コピー先ワークブックオープン
    Set xlBook = xlApp.Workbooks.Open(strCopyExcelFileName)

    ' ワークシートオープン
    Set xlSheet1 = xlBook.Worksheets(1)
    ' ワークシートオープン
    Set xlSheet2 = xlBook.Worksheets(2)
'***********************************************************

'*** Form_UnLoadイベントにて ********************************
    ' 変更を保存しない
    xlApp.DisplayAlerts = False
    Call xlBook.Close(False)
    ' Excelを終了
    xlApp.Quit
    ' オブジェクトの開放
    Set xlSheet1 = Nothing
    Set xlSheet2 = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
'***********************************************************

投稿時間:2003/06/26(Thu) 15:00
投稿者名:こうじ
Eメール:
URL :
タイトル:
Re: EXCEL処理について
とりあえず、質問2は対処できました。
質問1が対処できれば、質問2は対処しなくても大丈夫だと思うのですが、
まだ対処方法がわかりません。

質問2の対処方法は、VBで操作してるブックを閉じた後に
VBで操作してるExcel.Applicationのブック数を取得し
ブックが無かったら、Excelを閉じる。ブックが在ったら
保存確認ダイアログ表示するようにして、Excelは閉じない。

> 2) 上記の質問に関連するかもしれませんが、
>   画面終了時にブックも終了しているのですが、全然関係ないブックも終了されてしまいます。

> '*** Form_UnLoadイベントにて ********************************
    '保存確認ダイアログ非表示
    xlApp.DisplayAlerts = False
    '作業ブックを閉じる
    Call xlBook.Close(False)

    'ブック数格納
    intCnt = xlApp.Workbooks.Count
    If intCnt = 0 Then
    '# ブックが無い場合
        'Excelを終了
        xlApp.Quit
    Else
        '保存確認ダイアログ表示
        xlApp.DisplayAlerts = True
    End If

>     ' オブジェクトの開放
>     Set xlSheet1 = Nothing
>     Set xlSheet2 = Nothing
>     Set xlBook = Nothing
>     Set xlApp = Nothing
> '***********************************************************

投稿時間:2003/06/26(Thu) 15:42
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: EXCEL処理について
質問1が再現できるコードと手順を教えて頂けないでしょうか?
今一状況が飲み込めませんので(私だけかな!)
最初に投稿されたコードでは起きませんよね

投稿時間:2003/06/26(Thu) 16:41
投稿者名:こうじ
Eメール:
URL :
タイトル:
再現方法
> 質問1が再現できるコードと手順を教えて頂けないでしょうか?
> 今一状況が飲み込めませんので(私だけかな!)
> 最初に投稿されたコードでは起きませんよね

説明が結構不足しておりました。すいません。m(_ _)m
最初に投稿されたコードでも再現できます。

再現できるように、新規画面に終了ボタン[cmdEnd]だけ作成して、
以下のコードを貼り付けてください。(参照設定もしてください。)
それを何処かのフォルダに保存していただき、そのフォルダに
"ORG.xls"というファイルを作ってください。(新規ファイルでOK)

ご面倒お掛けしますが、よろしくお願いします。

再現手順
1. 画面起動
--もちろん"TMP.xls"が非表示で起動されます。
--(タスクマネージャにて確認してください。[プロセスのみ])

2. "ORG.xls"をダブルクリックして起動
--この時、"ORG.xls"と一緒に非表示にしてあった"TMP.xls"が
--表示されてしまいます。

============================================================
Option Explicit

'*** 画面変数宣言 ***
Private xlApp       As Excel.Application
Private xlBook      As Excel.Workbook

'*** 画面定数宣言 ***
Private Const WCON_ORG_FILE As String = "ORG.xls"
Private Const WCON_TMP_FILE As String = "TMP.xls"

Private Sub Form_Load()

'変数宣言
Dim strOrgFileNm    As String   'オリジナルファイル
Dim strTmpFileNm    As String   'コピーファイル

    'ファイル名設定
    strOrgFileNm = App.Path & "\" & WCON_ORG_FILE
    strTmpFileNm = App.Path & "\" & WCON_TMP_FILE

    'Excelオブジェクト作成
    Set xlApp = CreateObject("Excel.Application")
    'Excel非表示設定
    xlApp.Visible = False

    'コピーファイルが既に存在する場合、コピーファイル削除
    If Dir(strTmpFileNm) <> "" Then Kill strTmpFileNm

    'オリジナルファイルをコピー
    Call FileCopy(strOrgFileNm, strTmpFileNm)

    'コピーファイルを開く
    Set xlBook = xlApp.Workbooks.Open(strTmpFileNm)

End Sub

Private Sub cmdEnd_Click()
    Unload Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
    '保存確認ダイアログ非表示
    xlApp.DisplayAlerts = False
    'コピーファイルを閉じる
    Call xlBook.Close(False)

    'ブック数チェック
    If xlApp.Workbooks.Count = 0 Then
    '# ブックが無い場合
        'Excelを終了
        xlApp.Quit
    Else
        '保存確認ダイアログ表示
        xlApp.DisplayAlerts = True
    End If

    ' オブジェクトの開放
    Set xlBook = Nothing
    Set xlApp = Nothing
End Sub
============================================================

投稿時間:2003/06/26(Thu) 17:57
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 再現方法(訂正)
>
>     'コピーファイルを開く
>     Set xlBook = xlApp.Workbooks.Open(strTmpFileNm)
>
> End Sub


下記のようにして見てはどうでしょうか?

    'コピーファイルを開く
    Set xlBook = xlApp.Workbooks.Open(strTmpFileNm)
    xlApp.Windows("TMP.xls").Visible = False
    'xlApp.Windows(1).Visible = False
End Sub

投稿時間:2003/06/26(Thu) 18:54
投稿者名:こうじ
Eメール:
URL :
タイトル:
Re^2: 再現方法
確かに下記のようにすれば、手動にて"ORG.xls"を開いても
一緒に表示されることは無いみたいですね。

しかし手動にて"ORG.xls"を開いた後、手動でEXCELを閉じようとすると
「'TMP.xls'への変更を保存しますか?」というメッセージが表示されます。
このまま、"OK"or"NG"を押すと、EXCELが終了しちゃいますよね。
画面が終了するまで、EXCELは居て欲しいんですけど、
なにか対処方法はありますか?

何度もすいませんが、よろしくお願います。

> 下記のようにして見てはどうでしょうか?
>
>     'コピーファイルを開く
>     Set xlBook = xlApp.Workbooks.Open(strTmpFileNm)
>     Windows("TMP.xls").Visible = False
> End Sub

投稿時間:2003/06/26(Thu) 19:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 再現方法
ORG.xlsをダブルクリックで開くと起動しているExcel上に開くので終了する場合は
Excelを終了せずにORG.xlsを閉じるなら問題ないかと。

Excelを2重に起動しないと無理なようなので、別途Excelを起動しておく位しか思い浮かびません。

    xlApp.Windows("TMP.xls").Visible = False
    
    Dim Ret As Long
    Dim MyFile As String
    MyFile = Chr$(34) & "C:\Program Files\Microsoft Office\Office\Excel.exe" & Chr$(34)
    Ret = Shell(MyFile, vbHide)
End Sub

投稿時間:2003/06/26(Thu) 20:06
投稿者名:こうじ
Eメール:
URL :
タイトル:
お礼
やっぱり、別途起動しておくぐらいしかないですかね?

何度もありがとうございました。

投稿時間:2003/06/26(Thu) 20:22
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: お礼
> やっぱり、別途起動しておくぐらいしかないですかね?

TMP.xlsの終了を監視して終了されたら再起動するとか。

Private Sub Timer1_Timer()
    If xlApp.Workbooks.Count = 0 Then
        Dim strOrgFileNm As String 'オリジナルファイル
        Dim strTmpFileNm As String     'コピーファイル

        'ファイル名設定
        strOrgFileNm = App.Path & "\" & WCON_ORG_FILE
        strTmpFileNm = App.Path & "\" & WCON_TMP_FILE
    
        Set xlBook = Nothing
        Set xlApp = Nothing
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = False
        Set xlBook = xlApp.Workbooks.Open(strTmpFileNm)
        xlApp.Windows("TMP.xls").Visible = False
    End If
End Sub

投稿時間:2003/06/27(Fri) 10:35
投稿者名:こうじ
Eメール:
URL :
タイトル:
お礼 ver2.0
別途、起動しておいて、それを監視しようかと考えていたんですけど、
結局、"TMP.xls"が表示されたら、EXCELを終了させてはならないという
決まり事を作り、カバーすることになりました。

いろいろとありがとうございました。
またよろしくお願いします。