Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2013)
指定フォルダの削除について
投稿日時: 21/05/04 17:53:38
投稿者: OkabeS

 
指定したフォルダを閉じた上で、削除をしたく以下マクロ
を作りましたが、フォルダは閉じましたが、フォルダ削除が出来ません。
エラーメッセージも出ないのですが、原因をご教授いただけますでしょうか?
 
Sub closefolder ()
 
'指定フォルダクローズ
FolderPathA = C:\Users\1234\Desktop\TEST
    AppActivate Dir(FolderPathA, vbDirectory), False
    SendKeys "%{F4}", True
         
 '指定フォルダ削除
   Set FSO = CreateObject("Scripting.FileSystemObject")
    FSO.DeleteFile FolderPathA
    Set FSO = Nothing
 
end if

回答
投稿日時: 21/05/04 20:51:59
投稿者: simple

提示されたコードはよくわかりませんが、
FSOにフォルダを削除するDeleteFolderメソッドがありますよ。
http://officetanaka.net/excel/vba/filesystemobject/filesystemobject08.htm
これを使ったらどうでしょう。

投稿日時: 21/05/04 23:20:38
投稿者: OkabeS

simple様
 
アドバイスいただきありがとうございます。
 
下記訂正しましたが、「エラー70 書き込みできません」とエラーが出ます。
読み取り専用フォルダでも削除出来るように「True」にしたのですが、、
原因分かりますでしょうか?
 
 
>>>>訂正後
Sub closefolder ()
  
 FolderPathA = "C:\Users\1234\Desktop\TEST"
 '指定フォルダ削除
   Set FSO = CreateObject("Scripting.FileSystemObject")
    Call fso.DeleteFolder(FolderPathA, True)
    Set FSO = Nothing
  
end sub

回答
投稿日時: 21/05/05 07:01:21
投稿者: simple

コード自体は問題ないように思います。
権限の問題だったり、何か環境的な要因で発生しているものと思います。
手作業ではできるんですよね。
私には不明ですので、他の回答者さんのコメントをお待ち下さい。
 
# ちなみに、そういう影響が大きい、しかも頻度が高くないものは、
# 手作業で実行したほうがいい、という感覚があります。
# そのほうがより慎重かつ自覚的になりますから。

回答
投稿日時: 21/05/05 07:25:07
投稿者: WinArrow
投稿者のウェブサイトに移動

>「エラー70 書き込みできません」
 
 
おそらく、当該フォルダの中に「読み取り専用」属性のファイルがあるものと思います。
 
>読み取り専用フォルダでも削除出来るように「True」にしたのですが、、
 
「True」指定は、フォルダそのものが読み取り専用の場合に有効なパラメータで、
中のファイルには適用されません。
 
simpleさん、紹介のページの中にも
読み取り専用ファイルの注意書きがあると思います。
 

回答
投稿日時: 21/05/05 11:31:28
投稿者: simple

> 「True」指定は、フォルダそのものが読み取り専用の場合に有効なパラメータで、
> 中のファイルには適用されません。
うーん、ちょっと違うような気がします。
田中さんの記事では、
> 引数forceは省略可能です。Trueを指定すると読み取り専用ファイルも削除されます。省略するとFalseとみなされます。
と書かれていますので、Trueにすれば、配下のファイルが読み取り専用になっていても削除されますね。
 
また、下記の記事によると、
http://hrn25.sakura.ne.jp/win/folder/folder.shtml
エクスプローラを使って、フォルダに対して「読み取り専用」にチェックを入れた場合、
・フォルダの「読み取り属性」を操作するというより、
・そのフォルダおよびサブフォルダの中のファイルの属性を一括して読み取りにする
ということのようですね。
また、
>「フォルダーの「読み取り専用」属 性」はシステム上 は使用しないので大した意味は無い。重要なのは「ファイルの「読み取り専用」属性」である。
と書かれています。

回答
投稿日時: 21/05/05 12:26:00
投稿者: WinArrow
投稿者のウェブサイトに移動

simpleさん、ありがとうございます。
 
フォルダ指定でも、True で読み取り専用ファイルも削除されました。
 
エラーコード70のところだけで、はやとちりでした。
 
エラーコード70の
もう一つの要因として、
当該フォルダの中に、開いているファイルが、存在する
・・・なんてことがないのかな?

投稿日時: 21/05/05 13:43:46
投稿者: OkabeS

simple様
WinArrow様
 
ご協力ありがとうございます。
コード実行で、指定フォルダの中のファイルは削除されているのですが、
同時に「書き込みできません」というエラー70が出ている状態です。
 
指定フォルダを空にしても、
属性変更しても、結果は同じでした。
 
>>>>>>>
Sub closefolder ()
 
FolderPathA = "C:\Users\1234\Desktop\TEST"
 
'フォルダ属性変更
Const ReadOnly = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(FolderPathA)
Set colFiles = objFolder.Files
For Each objFile In colFiles
    If objFile.Attributes And ReadOnly Then
        objFile.Attributes = objFile.Attributes Xor ReadOnly
    End If
Next
 
 
 
' 指定フォルダ削除
   Set FSO = CreateObject("Scripting.FileSystemObject")
    Call fso.DeleteFolder(FolderPathA, True)
    Set FSO = Nothing
   
end sub

回答
投稿日時: 21/05/05 14:35:33
投稿者: simple

WinArrowさん、鋭いですね。
>当該フォルダの中に、開いているファイルが、存在する
まさに、これでエラー70が再現しました。
 
いや、そんなことない、開いていない、ということなら、
タスクマネージャで別のExcelなどがないか確認してみてください。
そのフォルダを何かのプロセスがつかんでいたら、同様事象が起きると思います。

回答
投稿日時: 21/05/05 14:39:05
投稿者: MMYS

simpleさんも指摘してますが、
手作業では削除可能なのですか。
 
対象フォルダを「ディスクトップ」ではなく、
Cドライブ以外のローカルドライブ(DドライブやUSBメモリ)でテストはされていますか。
 
念の為確認しますが、ディスクトップは
・各ユーザー
・全ユーザー
の2種類が、あることはご存知ですよね。
 
 
 
ところで、掲示のコードは、実際のコードをコピペされてますか。
 

投稿日時: 21/05/05 15:00:55
投稿者: OkabeS

simple様
WinArrow様
MMYS様
 
色々とアドバイス頂きありがとうございます。
 
このコード単体で時間をおいて、 FSO.DeleteFilewを実行したらうまくいきましたが、
ご指摘の通り、別のプロセスの影響でエラー70が出たようです。
 
情報が足りず申し訳ありません。
このコードの前段階で以下処理をしていますが、そのプロセスが指定フォルダを掴んだままの
ようです。
前段階のコード「指定フォルダの中のファイルを操作してクローズ、その後別のフォルダに移す」
(この処理の後タスクマネージャで、EXCEL.exeが指定フォルダをハンドルしていました)
 
上記プロセスの後に、手作業で指定フォルダを消そうとすると、以下エラーも出ます。
「別のプログラムがこのフォルダーまたはファイルを開いているので操作を完了できません」
 
前段階のプロセス終了後に、「指定フォルダを放す」ようなことはVBAで出来るのでしょうか?

回答
投稿日時: 21/05/05 16:15:42
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
タスクマネージャで、EXCEL.exeが指定フォルダをハンドルしていました

 
「タスクマネージャで、EXCEL.exeが指定フォルダをハンドルしている」
は、どのようにすれば、わかるのでしょうか?

投稿日時: 21/05/05 16:26:17
投稿者: OkabeS

WinArrow様
 
タスクマネージャのパフォーマンス→リソースモニター→CPUで
「関連付けられたハンドル」のところに、EXCEL.exeと指定のフォルダ名が出てきました。
ここを手作業で終了させると、フォルダも消せる状態です。

回答
投稿日時: 21/05/05 16:50:05
投稿者: WinArrow
投稿者のウェブサイトに移動

OkabeS さんへ
 
ありがとうございました。

回答
投稿日時: 21/05/05 17:11:44
投稿者: MMYS

OkabeS さんの引用:

前段階のプロセス終了後に、「指定フォルダを放す」ようなことはVBAで出来るのでしょうか?

通常は前段階の処理が終了すれば、開放されますから、
終了を待つのが待つのがセロリーだと思うのですが。
 
前段処理はご自身で作成されたものですか。
 
 

投稿日時: 21/05/05 17:49:11
投稿者: OkabeS

MMYS様
 
「通常は前段階の処理が終了すれば、開放されます」
→前段階の処理(指定フォルダの中のファイル操作、他フォルダへのコピー移動)
 が終了された後のフォルダ削除ですが、うまくいきません。
 
 前段階のコードは自分で作成したものです。長すぎてこちらにはそのまま載せられませんが
 おそらくどこかのプロセスが、指定フォルダになんらかの影響を与えたままの状態になっている
 認識です。

回答
投稿日時: 21/05/05 21:06:00
投稿者: WinArrow
投稿者のウェブサイトに移動

推測ですが、
前段階の(説明されていない)コードの中で、
後始末ができていないような気がします。

回答
投稿日時: 21/05/05 23:07:09
投稿者: simple

フォルダの削除が出来ない事象が発生した時点で、
(1)Excelアプリケーションは一つだけ動作していたのですか?
(2)そのフォルダの中で、開いたままのファイルはなかったですか?
を念のため、再度確認させてください。
 
(1)は、なんらかの理由でゾンビプロセスが残っていると、それがファイルを掴んだままになることが多い。
   そのプロセスをタスクマネージャでKillすれば問題は解決するはず。
(2)は単にファイルを閉じる操作が抜けていて、開いたままになっているとすれば、
   それを確実に閉じればよい。
それ以外の事由で、「フォルダを掴んだまま」などということは殆ど無いんじゃないでしょうか。
まずは、上記二点をよく確認することだと思います。
 
>前段階の処理(指定フォルダの中のファイル操作、他フォルダへのコピー移動)
について、コードが提示できないのであれば、回答者ができることは何もありません。
ご自分でよく調査するほかないと思います。
 
# 昔は、Dirが""以外を返すような処理をしたままだと、検索ハンドルが開いたままになり、
# それが悪さをするという話がありましたが、どうやら今は実装が変わったようで、
# 余り聞かなくなりました。

トピックに返信