[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
接続が切れる前に消そうとしているとか? スリープ入れて、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
(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
(macs) 2023/03/06(月) 14:56:27
まちがいました ActiveWorkbook.ListObjects("見積一覧").Unlink ActiveWorkbook.ListObjects("納品リスト").Unlink です (´・ω・`) 2023/03/06(月) 15:09:01
残念でした... 簡単なパワークエリをつくってやってみたけど、 エラーにならずにCSVファイル削除できちゃうんですよね....
ちなみに CSVファイルのサイズは如何ほど? (´・ω・`) 2023/03/06(月) 15:52:58
そうなのですね。何かオレ環な感じなのかもしれません。
時間があるときに新規ファイルで試してみます。
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
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
>ブックAは消せたんですか?
そうなのです。単独の場合は消せませんが複数ある場合は最後の1つが消せません。
(macs) 2023/03/13(月) 11:24:58
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.