[[20190530151123]] 『外部ファイル読込後にUSBメモリが読込状態』(Hashi) ページの最後に飛ぶ

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

 

『外部ファイル読込後にUSBメモリが読込状態』(Hashi)

何時も参考にさせて頂いております。自己解決が困難でしたので、ご教授願えれば幸いです。
 USBメモリにデータを保存した後、以下のマクロでExcelに取り込み、転記・保存をして閉じています。
USBメモリを安全な取り外しを行うと「現在使用中です」となり、全てのEXCELブックを閉じないと外せない状態になってしまいます。
また、そのブックのみ開いている場合には、エクスプローラーを閉じないと、「現在使用中です」になります。
マクロを動かさずに読み込むと、USBメモリを外せる事は確認済みです。
全てのファイルを閉じることなく、USBメモリを外したいので、宜しくお願い致します。

Sub ASC読込()

    Const AscTitle = "テキストファイル読み込み処理"
    Const AscFilter = "ASC形式ファイル (*.asc),*.asc,全てのファイル(*.*),*.*"
    Dim xlAPP As Application        ' Applicationオブジェクト
    Dim StrFileName As String       ' OPENするファイル名(フルパス)
    Dim vntFileName As Variant      ' ファイル名受取り用
    Set xlAPP = Application    ' Applicationオブジェクト取得
    ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
    vntFileName = xlAPP.GetOpenFilename(FileFilter:=AscFilter, Title:=AscTitle)
    If VarType(vntFileName) = vbBoolean Then
	’キャンセル処理
        End
    Else
        StrFileName = vntFileName
        Dim Ws As Worksheet, Qt As QueryTable
        Set Ws = Worksheets("取込")
        Set Qt = Ws.QueryTables.Add(Connection:="TEXT;" & StrFileName, Destination:=Ws.Range("A1"))
        With Qt
            .TextFilePlatform = 932 '文字コード Shift-JIS
            .TextFileParseType = xlDelimited    '区切り文字形式
            .TextFileCommaDelimiter = True 'カンマ区切り
            .TextFileOtherDelimiter = "_"      ' 区切り文字を指定 "_"
            .Refresh BackgroundQuery:=False   ' スペース区切りしない
            .Delete ' データとの接続を解除
        End With
    End If
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


OSのリソース管理の問題っぽいので、難しそうですね。

とりあえず、End Sub の直前に1行追加して、End (キャンセル時は既にEndにしているようです)を入れてみてください。 これを入れると強制的にVBAのリソースを開放するので、USBメモリを取り出せるようになるかも知れません。
(???) 2019/05/30(木) 16:28


回答ありがとうございます。
Endを入れてみましたが、変わりませんでした。
(Hashi) 2019/05/30(木) 16:47

Endで駄目となると、ユーザーが手を出せない部分でリソースが保持されているのでしょうね。 お手上げです。

Excelを全部閉じると回復するのだし、OSよりも、Excelの問題? 過去にも、自シートをデータベース扱いするとメモリリークする、なんて問題があったので、QueryTables.Add も何かリークしてるかもです。 2019でどうなっているかですが、そう簡単にバージョンアップして試せないでしょうし。
(???) 2019/05/30(木) 17:40


End With の後に
ChDriveでUSB以外のドライブに変更してあげればイケそうですが如何でしょう?

                .Delete ' データとの接続を解除
            End With
            ChDrive "C" '←こんな感じに
        End If
    End Sub

(白茶) 2019/05/30(木) 17:55


 あ。すみません。書き忘れました。

 ↑は、エクセルのファイル側の問題ではなく、
 マクロで読込む「ASC形式ファイル」が同じUSBに存在しているのでは?

 と予想してのものです。

 と言うのも、当方の環境Win7/Excel2010で適当なテキストファイルで再現してみたら、
 USB以外の場所から読込んだテキストファイルの場合は、現象が再現しませんでした。

 ならばUSBから読込んだテキストファイルの方で引っ掛かってるのでは?
 と思った次第です。

 違うかったらスミマセン

(白茶) 2019/05/30(木) 18:09


 大雑把だけど、この辺かも?
 クエリーのコードをほとんど書いたことが無いので、あまり使ったことが無いけど。

 クエリーの削除
 For i = 1 To ActiveSheet.QueryTables.Count
   ActiveSheet.QueryTables(i).Delete
 Next

 クエリーの定義の削除
 With ActiveSheet.QueryTables.Add(Connection:= _ 
     "TEXT;D:\(Data)\F11Data65000.txt", Destination:=Range("A1")) 
    .Parent.Names(.Name).Delete   '←クエリの定義の削除
    .Delete

(BJ) 2019/05/30(木) 18:33


白茶さんの方法で解決いたしました。
ずっと困っていたので、感謝しきれません。
BJさんのコードは、「.Parent.Names(.Name).Delete」で1004エラーでした。
クエリの定義の削除について勉強直してきます。
回答くださった皆さん、本当にありがとうございました。
(Hashi) 2019/05/31(金) 08:57

 おー。解決して何よりです。
 一応追試してみました。

 Dドライブ直下に[tmp]フォルダを作成
 [tmp]フォルダ内に新規ファイルを作成

 イミディエイトウィンドウで
 ?Application.GetOpenFilename("All Files,*.*")
 して、作成した新規ファイルを選択

 エクセルは終了せず、エクスプローラからD:\tmpの削除を試みると
 「別のプログラムがこのフォルダーまたはファイルを開いているので、
  操作を完了できません。
  フォルダーまたはファイルを閉じてから再実行して下さい。    」

 とのメッセージが出て、tmpフォルダが消せませんでした。
 但し、中にある新規ファイルは消えていました。

 再度
 イミディエイトウィンドウで
 ?Application.GetOpenFilename("All Files,*.*")
 して、他の場所にあるファイルを選択

 エクセルは終了せず、エクスプローラからD:\tmpの削除を試みると
 今度はすんなり消えてくれました。

 どうもGetOpenFilenameが原因の様ですね。

(白茶) 2019/05/31(金) 09:56


コメント返信:

[ 一覧(最新更新順) ]


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