[[20230303140507]] 『Killでエラー microsoft.mashup.container.loader』(macs) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Killでエラー microsoft.mashup.container.loader.exe』(macs)

下記スクリプトはデスクトップに置いたcsvファイルでクエリを更新したあと
csvファイルを削除するものです。
最後の「Kill ファイルB」でエラー70が発生します。
ファイルを開いているのは「microsoft.mashup.container.loader.exe」となっているのですがどのように回避すればよいですか?

Sub ◆インポート()

    Dim デスクトップ As String
    Dim ファイルA As String
    Dim ファイルB As String
    Dim wsh As Object

    Set wsh = CreateObject("Wscript.Shell")
    デスクトップ = wsh.SpecialFolders("desktop")
    Set wsh = Nothing

'インポートファイル確認

    ファイルA = デスクトップ & "\bill.csv"
    ファイルB = デスクトップ & "\delivery.csv"

    If Dir(ファイルA) = "" Then
        MsgBox ("bill.csv がデスクトップにありません")
        Exit Sub
    End If

    If Dir(ファイルB) = "" Then
        MsgBox ("delivery.csv がデスクトップにありません")
        Exit Sub
    End If

'クエリ更新

    Sheets("見積一覧").ListObjects("見積一覧").QueryTable.Refresh BackgroundQuery:=False
    Sheets("納品リスト").ListObjects("納品リスト").QueryTable.Refresh BackgroundQuery:=False

'クエリ削除

    ActiveWorkbook.Queries("見積一覧").Delete
    ActiveWorkbook.Queries("納品リスト").Delete

'インポートファイル削除

    Kill ファイルA
    Kill ファイルB

End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


単純に
microsoft.mashup.container.loader.exe
これが使っているから削除できないって事では
これを終了させればいいんじゃないですかね。
(ベルファスト) 2023/03/03(金) 15:26:10

microsoft.mashup.container.loader.exe
これはいまマクロを実行しているファイルのクエリ関連だと思うのですけど違うのですか?
クエリを削除しているのでファイルとの関連は切れていると思うのですがプロセスが残っているようです。
このプロセスをマクロで終了させる方法もわかりません。
(macs) 2023/03/03(金) 15:51:50

 接続が切れる前に消そうとしているとか?
 スリープ入れて、Do-Loopさせてみてはどうですかね?
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)

    Sub ◆インポート()
        Dim デスクトップ As String
        Dim ファイルA As String
        Dim ファイルB As String
        Dim wsh As Object
        Dim cnt As Long
        Set wsh = CreateObject("Wscript.Shell")
        デスクトップ = wsh.SpecialFolders("desktop")
        Set wsh = Nothing
    'インポートファイル確認
        ファイルA = デスクトップ & "\bill.csv"
        ファイルB = デスクトップ & "\delivery.csv"
        If Dir(ファイルA) = "" Then
            MsgBox ("bill.csv がデスクトップにありません")
            Exit Sub
        End If
        If Dir(ファイルB) = "" Then
            MsgBox ("delivery.csv がデスクトップにありません")
            Exit Sub
        End If
    'クエリ更新
        With Sheets("見積一覧").ListObjects("見積一覧").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        With Sheets("納品リスト").ListObjects("納品リスト").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With

    'インポートファイル削除
        cnt = 0
        On Error Resume Next
        Do
            Sleep 100
            cnt = cnt + 1
            Err.Clear
            Kill ファイルA
            Kill ファイルB
            If Err = 0 Then Exit Do
            If cnt > 100 Then
                MsgBox "削除できませんでした"
                Exit Sub
            End If
            DoEvents
        Loop
    End Sub
(稲葉) 2023/03/03(金) 17:51:40

稲葉さんアドバイス有難うございます。
これではうまくいきませんでした。タイム・アウトしてしまいます。
そしてこの残った「delivery.csv」はマクロを実行しているファイルを閉じるまで
microsoft.mashup.container.loader.exe
が離してくれません。

(macs) 2023/03/06(月) 14:04:05


 お力になれずすみません。

 いくつか気になった点で・・・
 >マクロを実行しているファイルを閉じるまで
 ここは確かめた感じですか?
 ListObjectがあるブックなのか
 マクロを実行しているブックなのか切り分けしてみました?

 マクロブックを別に持たせておいて、ListObjcectを別のブックに持たせたときに
 マクロブックからListObjectブックを操作してブックを閉じる→ファイルをkillのようにはできますか?
 こんな感じで・・・
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
    Sub ◆インポート()
        Dim デスクトップ As String
        Dim ファイルA As String
        Dim ファイルB As String
        Dim wsh As Object
        Dim cnt As Long
        Set wsh = CreateObject("Wscript.Shell")
        デスクトップ = wsh.SpecialFolders("desktop")
        Set wsh = Nothing
    'インポートファイル確認
        ファイルA = デスクトップ & "\bill.csv"
        ファイルB = デスクトップ & "\delivery.csv"
        If Dir(ファイルA) = "" Then
            MsgBox ("bill.csv がデスクトップにありません")
            Exit Sub
        End If
        If Dir(ファイルB) = "" Then
            MsgBox ("delivery.csv がデスクトップにありません")
            Exit Sub
        End If
    'ListObjectBookを書き込み可能で開く
        Dim wb As Workbook
        Const wbname As String = "C:\test\lLstObjectBook.xlsm"
        On Error Resume Next
        Workbooks(Dir(wbname)).Activate
        If Err.Number = 0 Then
            MsgBox wbname & "が開かれています。閉じてから実行してください"
            Exit Sub
        End If
        Set wb = Workbooks.Open(wbname, ReadOnly:=False)
        If wb Is Nothing Then
            MsgBox wbname & "開けませんでした。パスが正しいか確認してください"
            Exit Sub
        End If
        On Error GoTo 0
    'クエリ更新
        wb.Activate
        With wb.Sheets("見積一覧").ListObjects("見積一覧").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        With wb.Sheets("納品リスト").ListObjects("納品リスト").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        '保存後、ブックを閉じる
        wb.Save
        wb.Close False
    'インポートファイル削除
        cnt = 0
        On Error Resume Next
        Do
            Sleep 100
            cnt = cnt + 1
            Err.Clear
            Kill ファイルA
            Kill ファイルB
            If Err = 0 Then Exit Do
            If cnt > 100 Then
                MsgBox "削除できませんでした"
                Exit Sub
            End If
            DoEvents
        Loop
    End Sub
(稲葉) 2023/03/06(月) 14:28:35

 Deleteの前にUnlinkしたらどうなりますか?

    ActiveWorkbook.Queries("見積一覧").Unlink
    ActiveWorkbook.Queries("納品リスト").Unlink
    ActiveWorkbook.Queries("見積一覧").Delete
    ActiveWorkbook.Queries("納品リスト").Delete
(´・ω・`) 2023/03/06(月) 14:31:30

稲葉様
ListObjectがあるブックでマクロを実行しています。
今確認できませんので後日ファイルを分けて実行してみようと思います。
(macs) 2023/03/06(月) 14:47:55

´・ω・`様
最初の.Unlinkでエラー438
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
となります。

(macs) 2023/03/06(月) 14:56:27


 まちがいました
    ActiveWorkbook.ListObjects("見積一覧").Unlink
    ActiveWorkbook.ListObjects("納品リスト").Unlink
 です
(´・ω・`) 2023/03/06(月) 15:09:01

´・ω・`様
残念ながら削除できませんでした。
(macs) 2023/03/06(月) 15:28:33

 残念でした...
 簡単なパワークエリをつくってやってみたけど、
 エラーにならずにCSVファイル削除できちゃうんですよね....

 ちなみに CSVファイルのサイズは如何ほど?
(´・ω・`) 2023/03/06(月) 15:52:58

´・ω・`様
エラーにならずにCSVファイル削除できちゃうんですよね....

そうなのですね。何かオレ環な感じなのかもしれません。
時間があるときに新規ファイルで試してみます。
csvは軽いものだと3KBとかなんですけどね。
(macs) 2023/03/07(火) 10:44:53


 クエリを2つ用意します。
 クエリ1  : CSVファイルを読み込むクエリ ファイル名はもう一つのクエリ CSVFele で指定
 CSVFile  : CSVファイルを指定するクエリ 1行だけの簡単なクエリ。VBAで書き換える

 #クエリ1 列数は適当に書き換えてください
 let
     ソース = Csv.Document(File.Contents(CSVFile),[Delimiter=",", Columns=4, Encoding=932, QuoteStyle=QuoteStyle.None]),
     昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true])
 in
     昇格されたヘッダー数

 /* クエリ CSVFile */
 let csv="D:\test.csv" in csv

 で、こういうマクロ
 クエリの中身を書き換えて更新する

 Sub ReadCSV()
    Dim csvfile As String
    Dim tbl As ListObject
    Dim qry As WorkbookQuery

    With Application.FileDialog(msoFileDialogFilePicker)
      .AllowMultiSelect = False
      If .Show Then
         csvfile = .SelectedItems(1)
      Else
         Exit Sub
      End If
    End With

    Set qry = ThisWorkbook.Queries.Item("CSVFile")
    qry.Formula = "let csv=""" & csvfile & """ in csv"   ' クエリCSVファイルを書き換え

    Set tbl = ThisWorkbook.Worksheets(2).ListObjects(1)  '<= ここは実際のテーブルを指定してください
    tbl.QueryTable.Refresh BackgroundQuery:=False

    Kill csvfile 'CSVファイルの削除

 End Sub
 これもエラーになるでしょうか?
 私の環境では削除可能です
 CSVファイルを削除してからクエリを削除すればOKなのかな?
(´・ω・`) 2023/03/07(火) 16:00:02

稲葉様
マクロ分離モデルでもうまくいきませんでした。
(macs) 2023/03/08(水) 13:01:46

´・ω・`様
新しい提案は内容をまだ理解できず試しておりません。
現状のファイルを以下にアップいたしましたので
お時間ありましたら2つのファイルをデスクトップに置いて「インポート」を
実行してみてください。
それでうまくいくようでしたらこちらの環境に何らかの問題があるのだと思います。

https://77.gigafile.nu/0315-ddcb83bdc0e23bd3f1eb7bb29ff21d92c

(macs) 2023/03/08(水) 13:05:46


 マクロ入りのブックをダウンロードするなんて、ちょっと無理

 VBAのコードはもう最初にアップしてあるので、
 パワークエリのコードを提示されてみてはどうでしょう
(´・ω・`) 2023/03/08(水) 13:17:22

 ごめんなさい
 いままで2016で試してました
 365だとCSVファイル削除できません。
 同じエラーになります

 どうやったらマッシュアップエンジンがファイルを離してくれるのかよく分かりません
(´・ω・`) 2023/03/08(水) 23:45:11

 新規のクエリをつくってCSVを読み込んだあと、
 「クエリと接続」を表示させて、クエリの名前の上にマウスポインタを置くと、
 クエリの状態が表示されるんですが、データソースが読み込み中のままアイコンがクルクルと回ってます
 この状態だと多分、ソースのCSVファイルを削除できないですね

 バックグラウンドの読み込みをOFFにしても、データソース読み込み中クルクル
 バグなんじゃないのかって気になってきました
(´・ω・`) 2023/03/09(木) 00:13:40

 >マクロ分離モデルでもうまくいきませんでした
 (´・ω・`)さんが検証してくれてるのであれなんですけど、、、
 手動でやっても消せない感じ?

 とすると、アプローチ替えて、csvをtextstreamで読みこんで、ブックに落としたあと
 クエリで読むか
 直接adoのクエリで読むかってアプローチかなぁ

 CSVを読み取り専用属性に変換かけてからクエリ起動しても同じ?

(稲葉) 2023/03/09(木) 05:05:58


 手動でも消えません
 CSV→ブック(xlsx)に変換してからパワークエリにで読むとブック(xlsx)を削除できません(あたりまえですがCSVは削除できます)
 リンク解除・テーブルから範囲に変換・クエリの削除 どう組み合わせても効果なし
 クエリのオプション(バックグランド読み込みなど)今のところ効果のあるもの発見できず
 その他の掲示板とか(英語サイトなど)で同様の事象が2,3あったかも?ですが、未解決で塩漬け
 例えばここ
https://answers.microsoft.com/en-us/msoffice/forum/all/cant-edit-then-save-source-files-in-power-query/ae01f710-283a-4365-b9b0-69cc80d08834
(´・ω・`) 2023/03/09(木) 06:36:53

 塩漬けどころか無視されてますね(´;ω;`)
 365はサブスクで金はらってんだから、解決して欲しいところですね
(稲葉) 2023/03/09(木) 06:45:07

 あ、稲葉さんのマクロ分離モデルは、私自身はまだ試せていませんが
 これも駄目だということなので、ブックを開くExcel.Applicationも別のインスタンスを起動するしかないかも
(´・ω・`) 2023/03/09(木) 07:24:22

 全く別のインスタンスで、
  クエリ更新して
  ブック閉じて
 インスタンス終了させてから、csvを削除
 って手順はどうだろうか?

 これならマクロもブックも実行側から一つも干渉してないから・・・

 ★新規に実行用のブック作って、以下のコード
	'実行ブック
	Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
	Sub ◆インポート()
	    Dim デスクトップ As String
	    Dim ファイルA As String
	    Dim ファイルB As String
	    Dim wsh As Object
	    Dim cnt As Long
	    '        Set wsh = CreateObject("Wscript.Shell")
	    '        デスクトップ = wsh.SpecialFolders("desktop")
	    '        Set wsh = Nothing
	    '    'インポートファイル確認
	    '        ファイルA = デスクトップ & "\bill.csv"
	    '        ファイルB = デスクトップ & "\delivery.csv"
	    '        If Dir(ファイルA) = "" Then
	    '            MsgBox ("bill.csv がデスクトップにありません")
	    '            Exit Sub
	    '        End If
	    '        If Dir(ファイルB) = "" Then
	    '            MsgBox ("delivery.csv がデスクトップにありません")
	    '            Exit Sub
	    '        End If
	    'ListObjectBookを書き込み可能で開く

	    '新規インスタンスで検証
	    '参考
	    'https://www.excel-chunchun.com/entry/2019/03/27/005233
	    Dim NewxlApp As Excel.Application
	    Dim wb As Workbook
	    Set NewxlApp = New Excel.Application
	    With NewxlApp
	        '新しいインスタンスでブックを開く
	        .Visible = True
	        Application.DisplayAlerts = False
	        Set wb = .Workbooks.Open(ThisWorkbook.Path & "\クエリブック.xlsm") '★ブック名・パス修正してください
	        Application.DisplayAlerts = True
	        '別インスタンスのマクロを起動
	        '起動したマクロは、OnTimeでCSV取込マクロを実行させる
	        .Run "'" & wb.FullName & "'!ExecSubMacro"
	        '新しいインスタンス側でwbを閉じるので、こちらの変数は解放
	        Set wb = Nothing
	    End With

	    '新しいインスタンス側の処理待ち
	    '新しいインスタンスのブックが0になれば終了判定。
	    '無限ループ対策でiが10000までカウント
	    Dim i As Long
	    Dim IsSuccess As Boolean
	    IsSuccess = False
	    i = 0
	    Do
	        i = i + 1
	        If i > 10000 Then Exit Do
	        Application.Wait [Now() + "00:00:00.2"]
	        If NewxlApp.Workbooks.Count = 0 Then
	            IsSuccess = True
	            Exit Do
	        End If
	        DoEvents
	    Loop
	    Stop
	    '正常終了判定
	    If IsSuccess = False Then
	        '正常に終わらなければ、新規インスタンス内に残ったブックを閉じる
	        MsgBox "何らかの理由で新しいインスタンスの処理が完了しませんでした。処理を中断します"
	        Dim w As Workbook
	        For Each w In NewxlApp.Workbooks
	            Application.DisplayAlerts = False
	            w.Close False
	            Application.DisplayAlerts = True
	        Next w
	    End If
	    'インスタンスの解除
	    NewxlApp.Quit
	    Set NewxlApp = Nothing
	    If IsSuccess = True Then
	        '正常終了でインポートファイル削除
	        cnt = 0
	        On Error Resume Next
	        Do
	            Sleep 50
	            cnt = cnt + 1
	            Err.Clear
	            Kill ファイルA
	            Kill ファイルB
	            If Err = 0 Then Exit Do
	            If cnt > 100 Then
	                MsgBox "削除できませんでした"
	                Exit Do
	            End If
	            DoEvents
	        Loop
	    End If
	End Sub

 ★呼び出される側のブックは「クエリブック」としているので、適宜実行側のパスを修正してください。
    'クエリブック 標準モジュールでPublicスコープ
    Public Sub ExecSubMacro()
        'OnTimeはThisWorkbookプロセスのスレッドでの呼び出しになる。
        Application.OnTime [Now() + "00:00:00.2"], "testインスタンス分離"
    End Sub
    Public Sub testインスタンス分離()
        Dim wb As Workbook
        Set wb = ThisWorkbook
        'クエリ更新
        wb.Activate
        With wb.Sheets("見積一覧").ListObjects("見積一覧").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        With wb.Sheets("納品リスト").ListObjects("納品リスト").QueryTable
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        '保存後、ブックを閉じる
        'Sheets(1).Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Now()
        ThisWorkbook.Close True
    End Sub

 これでだめならお手上げっすね・・・
(稲葉) 2023/03/09(木) 12:15:19

 読み直して気になったんですが、ブックAは消せたんですか?
 >最後の「Kill ファイルB」でエラー70が発生します。
 そうすると、「最後に接続したクエリ」が対象になるなら、ダミーのクエリ作って自分自身参照させてから
 Kill使えばよかったりします?
(稲葉) 2023/03/09(木) 12:17:36

´・ω・`様
稲葉様
ちょっと離れていてすみません。
なんだかバグっぽい話になってきました。
Msdn フォーラム(VBA)ってところにも上げてみたのですが反応なしです。

>ブックAは消せたんですか?
そうなのです。単独の場合は消せませんが複数ある場合は最後の1つが消せません。

(macs) 2023/03/13(月) 11:24:58


2023/3/31現在、エラーは出なくなりました。
いつの間にか修正されたようです。
(macs) 2023/03/31(金) 12:37:51

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.