Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : その他)
クエリをエクスポートする際にエクセルが開いているか確認
投稿日時: 24/01/07 00:17:54
投稿者: Watanabe-45

お世話になっております。
クエリをエクセルファイルにエクスポートし、エクセルで印刷処理をしております。
エクセルファイルにエクスポートする際に、エクセルファイルを開いたまま誤って処理をすることが多々あります。
エクセルファイルを開いていた場合はファイルを閉じてからエクスポートする処理をおこないたいと思い、方法などを検索しましたがうまく対応できません。
ご教授いただければ幸いです。
 
Path = Application.CurrentProject.Path
 
  Set xlsApp = CreateObject("Excel.Application")
  Set wkBook = xlsApp.Workbooks.Open(Path & "\" & "エクセルファイル名" & ".xlsx")
  
    xlsApp.DisplayAlerts = False
    wkBook.Worksheets("access").Activate
    wkBook.Worksheets("access").UsedRange.Clear
    wkBook.Save
    wkBook.Close
     
    xlsApp.DisplayAlerts = True
     
    Set wkBook = Nothing
    Set xlsApp = Nothing
 
 

回答
投稿日時: 24/01/08 09:09:50
投稿者: Suzu

引用:
エクセルファイルにエクスポートする際に、エクセルファイルを開いたまま誤って処理をすることが多々あります。
エクセルファイルを開いていた場合はファイルを閉じてからエクスポートする処理をおこないたい

 
既に自分で開いているファイルをオートメーションを使い
自動で閉じるのであれば、GetObject を使います。
 
ネットワーク上に置かれたファイルを 他の人が開いている様な場合には
オートメーションでは対応できません。
 
 
閉じる事はせずに、開いている旨を表示し、手動で閉じさせた方が良いです。
オートメーションを使い内容の確認もせず、閉じてしまうよりは良いと思います。
 
 
開いてあるかどうかだけを判定し、
 開いていたらダイアログを表示し、閉じる事を促す
 閉じてあれば、そのまま進む。
 
開いているだけの判定なら Excelを起動する必要もありません。
 
Sub Sample()
  Dim ret As Boolean
  ret = chkFileOpened("C:\DATA\Computer\Excel\カレンダー.xlsx")

  If ret = True Then
    MsgBox "開いています"
  Else
    MsgBox "閉じています"
  End If
End Sub

Function chkFileOpened(Path As String) As Boolean
  On Error GoTo Err_Opened

  Open Path For Binary Lock Read Write As #1

Exit_Opened:
  Close #1
  Exit Function

Err_Opened:
  chkFileOpened = True
  On Error Resume Next
End Function

投稿日時: 24/01/08 10:49:45
投稿者: Watanabe-45

Suzuさん
 
いつも大変お世話になっております。
教えていただいたコードにて解決いたしました。
ファイルの持ち出しなどをすることもあり、少しアレンジしてみたところファイルのパス名を変数にすると開いていても”閉じています”と表示されてしまいます。
 
Dim ret As Boolean
FileName = CurrentProject.Path & "\ファイル名.xlsx"
     ret = chkFileOpened("FileName")

  If ret = True Then
    MsgBox "エクセルのファイルが開いています"
  Else
    MsgBox "エクセルのファイルが閉じています"
  End If
 
End Sub
 
度々で申し訳ありません。
知識が乏しくお恥ずかしながら追加で質問させていただきました。
 

回答
投稿日時: 24/01/08 12:12:30
投稿者: Suzu

コードをご自身でコーディングするなら、
何がエラーの原因なのか、ご自身で 知れる様にする事が必要です。
 
シングルステップで そのコードが行う事を把握 します
 そのステップの 引数や、オブジェクトの各プロパティー を確認し、
 意図した動作、意図したプロパティーになっているか を 確認します。
 
 
VBE 画面にて
 1. ローカルウィンドを表示させ
 2. シングルステップにて、コードを実行していき
 3. ローカルウィンドに表示される 変数の値を確認してみてください。
 
 
原因が分かったら、その内容を提示してみてください。
 (質問は閉じないでおいてください。)

回答
投稿日時: 24/01/08 13:41:25
投稿者: MMYS

Watanabe-45 さんの引用:

エクセルファイルを開いていた場合はファイルを閉じてからエクスポートする処理をおこないたいと思い、

    Set wkBook = xlsApp.Workbooks.Open(Path & "\" & "エクセルファイル名" & ".xlsx")
    If wkBook.ReadOnly Then
        MsgBox "ファイルが開かれています。処理中止します"
        wkBook.Close
    Else
        '本来の処理
    End If

すでに誰かが開かているブックを開くと、読み取り専用で開かれます。
ちなみに読み取り専用で開くと上書き保存できません。
 
 
Watanabe-45 さんの引用:

FileName = CurrentProject.Path & "\ファイル名.xlsx"
     ret = chkFileOpened("FileName")


変数と文字列の違いは理解されてますか。
 
FileName  → 変数
"FileName" → FileNameという文字列
 
 
 

投稿日時: 24/01/08 14:13:50
投稿者: Watanabe-45

suzuさん
コメントありがとうございます。
シングルステップにて、コードを実行していき、ローカルウィンドに表示される変数の値を確認してみました。
エクセルファイルを開いた状態で処理をした場合、suzuさんにおしえていただいたコードのまま実行させると、
 
: Path : "H:\ファイル名.xlsx" : String
  : chkFileOpened : False : Boolean
  : chkFileOpened : True : Boolean
 
アレンジした際は下記の状態となってしまいます。
 
 : Path : "FileName" : String
  : chkFileOpened : False : Boolean
  : chkFileOpened : False : Boolean
 
MMYSさんからも指摘がありましたが、変数の扱いがわかっていないのが原因なんだろうと思います。
(""を外してみたり、試行錯誤はしてみました)
教えていただたコードに変数を使用することは可能でしょうか。
低レベルのご質問で恐縮ですが、またコメントいただけると幸いです。
 
 
 
 
 
 

回答
投稿日時: 24/01/08 16:15:07
投稿者: Suzu

Watanabe-45 さんの引用:

FileName = CurrentProject.Path & "\ファイル名.xlsx"
     ret = chkFileOpened("FileName")

 
変数の取り扱い方に問題があり
 
引用:
(""を外してみたり、試行錯誤はしてみました)
と言うことなのであれば
試したであろう と推測できるのですが・・
 
FileName = CurrentProject.Path & "\ファイル名.xlsx"
ret = chkFileOpened(FileName)

 
"FileName" → FileName の様に、「"」を外すだけです。

投稿日時: 24/01/08 16:55:36
投稿者: Watanabe-45

 Suzuさん
 
コメントありがとうございます。
コンパイルエラーが発生しました。ByRef 引数の型が一致しません。
とのエラー表示があり、("")が必須であると解釈してしまいました。
 Suzuさんのコメントを拝見し、再度CStr()をつけたところうまくできました。
初歩的なところかと思いますが、助かりました。感謝申し上げます。
 
FileName = CurrentProject.Path & "\ファイル名.xlsx"
ret = chkFileOpened(CStr(FileName))