Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


873 / 2272 ツリー ←次へ | 前へ→

【9721】Excel複数起動時に任意のブックを閉じる Runa 07/8/1(水) 13:48 質問[未読]
【9722】Re:Excel複数起動時に任意のブックを閉じる 小僧 07/8/1(水) 14:59 回答[未読]
【9724】Re:Excel複数起動時に任意のブックを閉じる Runa 07/8/1(水) 15:51 お礼[未読]

【9721】Excel複数起動時に任意のブックを閉じる
質問  Runa  - 07/8/1(水) 13:48 -

引用なし
パスワード
   「開かれている任意のExcelブックを閉じる」ということがしたいです。

開かれている任意のExcelブックをAccessから閉じることはできましたが、
複数のExcelアプリケーションが起動している場合にうまく動作しません。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  flg = True 'フラグ初期化

  '重複オープンのチェック
  On Error Resume Next
  Set xls = GetObject(, "Excel.Application")
  If Err.Number <> 0 Then
    Err.Clear  ' Errをクリア
  Else
    '同名のブックは閉じる
    For Each wkb In xls.WorkBooks
      If wkb.Name = Dir(fName1) Then
        wkb.Close SaveChanges:=False

      ElseIf wkb.Name = Dir(fName2) Then
        wkb.Close SaveChanges:=False
      Else
        flg = False
      End If
    Next wkb

    '他にExcelファイルが開いていない場合
    If flg = True Then
      xls.Quit  '"Excel.application"を閉じる
    End If
  End If

  Set xls = Nothing
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

Set xls = GetObject(, "Excel.application")
をループ文か何かでまわせればうまく動きそうな気がしますが、
その方法がわかりません。

どなたか教えて下さい。よろしくお願いします。

【9722】Re:Excel複数起動時に任意のブックを閉じる
回答  小僧  - 07/8/1(水) 14:59 -

引用なし
パスワード
   ▼Runa さん:
こんにちは。

>「開かれている任意のExcelブックを閉じる」ということがしたいです。

>開かれている任意のExcelブックをAccessから閉じることはできましたが、
>複数のExcelアプリケーションが起動している場合にうまく動作しません。

GetObject関数は Excel.Application オブジェクトだけでなく、
Excel.Workbook オブジェクトに対しても使うことができます。

Set wkb = GetObject(fname1)

対象の Book が複数(2枚目以降は読取専用の状態で)開いているのでなければ
目的の事はできると思われます。

ちょっと工夫すれば

>'他にExcelファイルが開いていない場合

のような処理も行う事が可能ですね。

【9724】Re:Excel複数起動時に任意のブックを閉じる
お礼  Runa  - 07/8/1(水) 15:51 -

引用なし
パスワード
   ▼小僧 さん:お返事ありがとうございます。

>GetObject関数は Excel.Application オブジェクトだけでなく、
>Excel.Workbook オブジェクトに対しても使うことができます。
>
>Set wkb = GetObject(fname1)
>対象の Book が複数(2枚目以降は読取専用の状態で)開いているのでなければ
>目的の事はできると思われます。
>
>ちょっと工夫すれば
>
>>'他にExcelファイルが開いていない場合
>
>のような処理も行う事が可能ですね。

遅くなりましたが、、、
以下のように組直すとちゃんと動くようになりました。
本当にありがとうございます。

【Set xls = wkb_prg.Application】のような
逆転の発想が全くありませんでした。
頭を柔軟にして、考えないと駄目ですね!
精進します。

ーーーーーーーーーーーーーーーーーーーーーーーーーー
  Dim xls As Object        'As Excel.Application
  Dim wkb As Object        'As Excel.Workbook
  Dim wkb_prg As Object      'As Excel.Workbook
  Dim wkb_lst As Object      'As Excel.Workbook
  Dim fName1 As String      'ファイル名
  Dim fName2 As String
  Dim flg As Boolean       'その他Excelが開いているか判定するフラグ
  
  flg = True 'フラグ初期化
  
  fName1 = "C:\sample\file1.xls"    'Excelファイル指定
  fName2 = "C:\sample\file2.xls"

  '重複オープンのチェック
  On Error Resume Next
  
  Set wkb_prg = GetObject(fName1)
  Set wkb_lst = GetObject(fName2)
  Set xls = wkb_prg.Application
    
  If Err.Number <> 0 Then
    Err.Clear  ' Errをクリア
  Else
    '同名のブックは閉じる
    wkb_prg.Name = Dir(fName1)
    wkb_prg.Close SaveChanges:=False
  
    wkb_lst.Name = Dir(fName2)
    wkb_lst.Close SaveChanges:=False
        
    For Each wkb In xls.Workbooks
      flg = False
    Next wkb

    '他にExcelファイルが開いていない場合
    If flg = True Then
      xls.Quit  '"Excel.application"を閉じる
    End If
  End If

  Set xls = Nothing

873 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free