• ベストアンサー

VBAでのファイル削除処理

excelの表の第一列目にファイル名が複数(数は任意)かかれたリストがあるとします.この表を表Aと呼ぶことにします. 別にフォルダーがあり,そのフォルダーの中に複数(任意)のファイルが入っているとします.このフォルダーをフォルダーBとします. 次の処理を行うプログラムを考えていますが,VBAで可能でしょうか.できるとすれば,基本的な部分だけでも教えて頂ければありがたいのですが. フォルダーBを指定して,さらに表Aに書かれているxlsファイルを指定して,Bに書かれているファイル名の中に表Aに書かれたファイル名が一致するものがあれば,ファオルダーBの中から削除する.

noname#178429
noname#178429

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

こんばんは。 merlionXXです。 このところ非常に忙しくこのサイトを見ることもできませんでした。 そのため、返事がおそくなってすみません。 > 1)Applicationを参照するとき,CreateObjectで作られたobjectを変数に入れて,その変数に対して,プロパティで参照する方法を採るのが通常行われているようですがCreateObjectを使わず,直接Applicationにプロパティに作用させて参照する方法は,できないのでしょうか. おっしゃる意味がよくわかりませんが、 With Application .ScreenUpdating = False '略 .ScreenUpdating = True End With のような書き方は、CreateObject("Shell.Application")に関してはできないと思います。 > 2)ParentFolderとItems.Itemは,Excel VBAのBrowserで探しても見あたらないようですが,これはExcelのどこを見れば知ることができるのでしょうか. あたしも詳しくは存じませんが、見当たらなければ http://www.google.co.jp/search?sourceid=navclient&aq=1&oq=ParentFolder&hl=ja&ie=UTF-8&rlz=1T4SUNC_jaJP390JP391&q=vba+parentfolder 等を参照してください。

noname#178429
質問者

お礼

返事が遅くなりましたが,ご回答有り難うございました. 素朴な質問に答えて頂き,助かりました. Excel VBAのObject,Method,Propertyに関する情報は,あちこちに分散されていて,あたかもjunk boxの中から部品を探して使うような形になっているのに驚きました.本来は,VBEの中に情報として, HELPですべて見ることができていなければいけないはずのものと思っていますが,現状はそうなっていないのですね.

その他の回答 (2)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

削除対象ファイル名のあるエクセルの標準モジュールに書いてください。 削除対象ファイル名のあるシート名は"表A"としましたが実情にあわせて変更してください。 削除対象ファイル名はA1セルから下へ連続してあるものとします。 削除対象ファイル名には拡張子(xlsやdocなど)を含むものとします。 Sub TEST01()   Dim myFdr As Object   Dim ws As Worksheet   Dim myPth As String   Dim c As Range   Set myFdr = CreateObject("Shell.Application").BrowseForFolder(0, "フォルダ選択を選択してください。", 1)   If myFdr Is Nothing Then     MsgBox "キャンセル"     Exit Sub   ElseIf myFdr.ParentFolder Is Nothing Then     myPth = CreateObject("WScript.Shell").SpecialFolders("Desktop")   Else     myPth = myFdr.items.Item.Path   End If      Set ws = Sheets("表A")   With ws     For Each c In .Range("A1", .Range("A1").End(xlDown))       On Error Resume Next       Kill myPth & "\" & c.Value       On Error GoTo 0     Next c   End With End Sub

noname#178429
質問者

お礼

早速のご回答有り難うございました. 書かれたプログラムをコピーして実行したところ,殆ど問題なく,動かすことができ,目的を達成することができました. このプログラムについて,素朴な質問があるのですが,教えて頂けないでしょうか.  1)Applicationを参照するとき,CreateObjectで作られたobjectを変数に入れて,その変数に対して,プロパティで参照する方法を採るのが通常行われているようですが,CreateObjectを使わず,直接Applicationにプロパティに作用させて参照する方法は,できないのでしょうか.  2)ParentFolderとItems.Itemは,Excel VBAのBrowserで探しても見あたらないようですが,これはExcelのどこを見れば知ることができるのでしょうか.

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

基本的な部分だけです。 sub macro1() dim myPath as string dim myXls as string dim w as workbook dim h as range on error resume next 'フォルダーBを指定して,さらに表Aに書かれているxlsファイルを指定して, mypath = inputbox("フォルダBのフルパスを入力") myxls = inputbox("ファイルAの名前を入力") '表Aは,不明の場所にあるファイルAの,不明のシート名の,不明のセル番地に記載されている set w = workbooks.open(filename:=mypath & "\" & myxls) with w.worksheets("不明のシート名") for each h in .range("A1:A" & .range("A65536").end(xlup).row) '表Aに書かれたファイル名が一致するものがあれば,ファオルダーBの中から削除する kill mypath & "\" & h.value next end with end sub たとえば「フォルダBを指定して」とか「ファイルAを指定して」など,具体的に「こうしたい」に応じてもっとクールなやり方はいろいろありますが,新しいご質問としてまた別途ご相談を投稿してみてください。

noname#178429
質問者

お礼

早速のご回答有り難うございました. 教えて頂いた予約語は,殆どVBAのBrowserで見ることができますので,これを基にプログラムを組み立ててみたいと思います.

関連するQ&A

  • VBAで、ファイルを移動する方法を教えてください。

    こんにちは。VBAの記述について質問させてください。 VBAのレベルは、簡単なマクロ処理(コピー、貼り付けしたり、シートの追加、削除をしたりできる程度です)を VBAで書けるくらいの初心者です。 インターネットに掲載されている事例を見ながら一週間ほど試行錯誤しましたが、 どうしても、下層フォルダも含め、複数のファイルをまとめて移動する方法がわかりません。 いろいろ考えたところ、 1.下層フォルダも含め、ファイル名をまとめて取得 2.それをExcelに書き出してリストを作る 3.そのリストにあるものをすべてひとつのフォルダにまとめて移動する という流れでやればいいのかな、と思いますが、 やり方がわかりません。 ※そもそもこの考え方が違っていたら、ご指摘ください。 インターネットを参照すると、 まず、1、2は、次の方法でできることがわかりました。 参照サイト VBA応用 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html ============================ Option Explicit ' 指定したフォルダ内のファイルの一覧を取得 Sub ファイル名一覧取得() Const cnsTitle = "フォルダ内のファイル名一覧取得" Const cnsDIR = "\*.*" Dim xlAPP As Application Dim strPATHNAME As String, vntPathName As Variant Dim strFileName As String Dim GYO As Long Dim Shell, myPath Set xlAPP = Application ' InputBoxでフォルダ指定を受ける vntPathName = xlAPP.InputBox("参照するフォルダ名を入力して下さい。", _ cnsTitle, "C:\") ' (1) strPATHNAME = vntPathName ' フォルダの存在確認 If Dir(strPATHNAME, vbDirectory) = "" Then MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle Exit Sub End If ' 先頭のファイル名の取得 strFileName = Dir(strPATHNAME & cnsDIR, vbNormal) ' ファイルが見つからなくなるまで繰り返す Do While strFileName <> "" ' 行を加算 GYO = GYO + 1 ' 先頭は1行目 Cells(GYO, 1).Value = strFileName ' 次のファイル名を取得 strFileName = Dir() Loop End Sub ============================ これを行うと、A列にすべてのファイル名が書き出されます。 また、 動かしたいファイルが入っているフォルダと、ファイル名がわかっている場合は、 nameで動かせるのはわかりました。 例 ============================ Name "C:\AAA\SAMPLE1.txt" As "C:\BBB\SAMPLE1.txt" ============================ ※こうすると、AAAというフォルダにあったSAMPLE1が、BBBに移動します。 この組み合わせで何とかできるのではないかと思うのですが、 ここから先が見えません。 実際に行いたい処理は、 図面がたくさん入っているフォルダが対象のフォルダになります。 ※図面はzipファイルになっていますので、解凍をする必要があります。 ファイル名は、その時によって違うので、一旦 ============== C:\Users\Desktop\移動元 ============== というフォルダに格納します。 この中で、zipを解凍すると、 格納された複数のフォルダと2000個近くのファイルが出てきます。 ファイルの拡張子は特殊なものですが、ファイルを取り出すときに、 zip以外を取り出したいので、仮に、.xls .docとしておきます。 フォルダの名前やファイルの名前は図面の名称になっていますが、 今回は、 デスクトップ上の「移動先」というフォルダにすべてそのまま移動できればいいです。 =========== C:\Users\Desktop\移動先 =========== です。 実験用に、 デスクトップに、移動元というフォルダを作り、 その中に、子A、子B、子Cというフォルダを作り、 さらに、それぞれ、孫A、孫B、孫Cというフォルダを作りました。 それぞれの孫フォルダには、4つずつダミーファイルを入れました。 ※これが、解凍後の状態になります。 図面の拡張子は特殊なものなので、今回は、わかりやすいように、 xlsとdocにします。 A-A-1.doc、A-A-1.xls、A-A-2.doc、A-A-2.xls という感じです。 ファイル名は、A-A-1や、C-B-2のようにして、 それぞれ、 「子Aのフォルダの中の孫Aの1つ目」 「子Cのフォルダの中の孫Bの2つ目」 という意味になるようにしています。 書き出したリストと、 pathの組み合わせと、 For Nextもしくは Do Loopの組み合わせで なんとかなりそうなのですが、 頭の中が混乱して答えが導き出せません。 今週中に作らないといけないので、 お力をお貸しください。 よろしくお願いいたします。

  • フォルダを指定し、複数のエクセルファイルの情報を別ファイルに保存したい。

    エクセルのマクロで以下の実装を行いたいと思っています。 -------------------------------------------------------------- 1.あるフォルダを指定 2.そのフォルダの中に入っているエクセルファイルの特定列複数行(行数不明、データがなくなるまで)の情報を抜き出す 3.2で抜き出した情報を別ファイル(テキスト形式)に保存 -------------------------------------------------------------- ・2で指定するフォルダには複数ファイルがあります ・3で保存するファイル名は2で開いたファイル名と同じ名称にしたい(拡張子は別) フォルダの状態は以下のようになっています。 editor.xls ←マクロを組みたいエクセルファイル L folderA    L A1.xls    L A2.xls    L A3.xls      : L folderB    L B1.xls    L B2.xls    L B3.xls      : L forlerTextfile    L A1.txt ←作りたいファイル    L A2.txt    〃    L A3.txt    L B1.txt    L B2.txt    L B3.txt      : 分かりづらくて申し訳ありませんが、どなたかご教授いただけないでしょうか。 宜しくお願いいたします。

  • エクセル VBAについて

    初心者ですが、指導してください。 エクセルでVBA・マクロを使用して見積書を作っています。 AファイルとBファイルを順番に開いた状態で使用します。 Bファイルは見積書のテンプレートファイルになっています。 Bファイルで担当者が新しく見積書を作った場合、 ファイル保存というボタンで、指定のホルダ内に任意のファイル名で保存する事が可能になっています。 新しく保存したファイルをCファイルとします。 Cファイルを修正等する場合は、AファイルからCファイルを読み込みます。 Aファイルは、トップページ兼価格リスト表になっています。 ここで問題というか分からなくなっている部分は、 テンプレートファイルであるBファイルの時は、VBAの記述の際に、 Windows("B.xls").Activate と記載していますが、 任意のファイルであるCファイルの時は、 担当者によって、任意のファイル名で保存されているため ファイル名の取得?が必要になると思います。 その場合、どの様な記述をすればいいのでしょうか? なかなか上手に説明できませんが、よろしくお願いします。

  • Excel VBA ファイルをまとめる

    Excel2003にてフォルダにある複数ファイル(8個)の各1番左のシートを 指定したファイルにまとめるVBAを組みたいと思います。 まとめる際、ファイル名の一部を取得し、シート名にしたいのですが可能でしょうか? 例: ファイル名:20110927_△△△△株式会社.xls ⇒ シート名:△△△△株式会社 ※ファイルの個数は固定ですが、年月の部分は変わります。 簡単なVBAの経験しかなく、キーワード検索でもしっくりこないものばかりで どのようにコードを記述してよいのか非常に困っています。

  • バッチファイルでファイル検索&置き換えをしたい。

    こんばんは、batファイルで、ファイルの検索&置き換えを行いたいです。 現在、職場に前からあるbatファイルを利用しているのですが、色々とやりたい事が増えてきて 現在のままでは辛くなってきました。どなたか、ご教示下さい。 やりたいこと。 1.Aフォルダにある複数のファイル名を取得する。 2.BフォルダにAフォルダで取得したファイル名と取得したファイルの先頭7文字を比べて 一致するものがあるか確認し、同じものがあり、かつBフォルダのファイルの更新日時が 新しければAフォルダのファイルに上書きする。 * 置いてあるファイルは以下の名前になります。 NICHI1:~.xls ~ NICHI99:~.xls 使用しているOSはWIN7です。 おいそがしい中、書き込みを呼んで下さり有難うございます。 ぜひ、お知恵を貸して下さい。

  • マクロ VBA ファイル名を連番でつけたいのですが

    マクロ初心者なので教えて頂けるとうれしいです。 保存先フォルダにファイル名を自動で名前をつけて保存させるところまでできたのですが、 保存先フォルダに同名フォルダがある場合に、 もともと指定しているファイル名のお尻に連番をつけていくようにしたいのですが・・・ 例) 選択したシートをコピーして、 「A1+B1+見積書.xls」 という名前をつけて毎回保存していくのですが、 同名のファイルがある場合、 「A1+B1+見積書+1.xls」 「A1+B1+見積書+2.xls」 「A1+B1+見積書+3.xls」    …というふうにお尻に自動で連番をつけて 保存できるようにしたいのです。 宜しくお願い致します!

  • エクセル VBAでこれは難しいですか?

    列 A B C D 行 1 T1 あ 1 2 2 T2 い 4 5 3 T3 う 7 5 分かりにくいかもしれませんが、上記のような表があるとします。ファイル名:AA.xlsとします。 ”行1”の「T1」や「あ」等はファイルにより違うとします。 1つのファイルの1シートにこういった表が改ページにより(ある領域で1,2ページとしている)たくさんあります。 これを必要な行、列をVBAで作成されたボックス?に入力方式で行、列を入力して、入力された例えば"B"列が削除され、その部分は左詰にされ、そのファイルが新しく別のファイル名で例えばAB.xlsが自動的に作成することは可能でしょうか? 手順としては 1 ファイルにより必要、不要な列・行が違うのであらかじめ削除する列・行を確認する。(このファイルをA1.xlsとする) 2 実行したいファイルを参照で(任意のフォルダに進めるよう)読み込めるようにしたVBAを開き、A1.xlsを選択する。 3 削除したい列・行を入力できる窓があり、そこに打ち込む。 4 削除した列・行のスペース分左詰め、上詰めにされたA2.xlsというファイルが同一フォルダ内に作成される。 VBAは全くの初心者で、インターネットで勉強を始めようとしている青二才です。 最終的にはこれ以上のことをしたいですが、まずは最低限これをしたいです。 余談ですが、これができるようになるためにはやはり一から勉強をするしかないのでしょうか? 今したいことがずばり載っている入門書のそのページだけ勉強しても不可能でしょうか? ・PS3のあるゲームのキャラクターの必殺技のコマンドを覚えても、まずPS3をどうやって起動するのか? という考えと一緒でしょうか?

  • VBA エクセル 開いている別ファイルをアクティブにするには?

    すみません、よろしくお願いいたします。 <前提> A.xls=コピー元ファイル(マクロを組んでいるのはこちら) 2009・・・.xls ファイル=コピー先ファイル(2009以降はファイル名が変化しますが、必ず頭に2009があります) 同一フォルダ内に上記のファイルがあります。 どちらも開いて、Aファイルのマクロを実行すると、Aのデータをコピーして、2009・・・のファイルに貼りつける。としたいのですが、 (1)ファイル名が変化するので貼り付け先のファイル名をどう指定したらよいかわからない。 (2)フォルダごと、色々な人へ配る予定なので、できればアクティブなファイルという指定をしたい。(他のファイルは開いてないという前提でOKです。) (3)フォルダ内には2009がつく別ファイルもあるので、(2)同様アクティブなファイルという指定をしたいです。 わかるかた、おねがいいたします。 BVA初心者です。 普通のマクロで記録したら、以下のようになりました。 (例) Sub Macro1() ' ' Macro1 Macro ' ' Range("A1").Select Selection.Copy Windows("20091002_2650.xls").Activate '←この20091002_2650.xlsが変化します。 Range("A10:B10").Select ActiveSheet.Paste End Sub

  • エクセル表のパスからのコピー処理について

    お世話になります。 エクセルVBAで質問です。 下記のような表をエクセルで作り、A列の名称が元フォルダのパス、 そのフォルダの中にエクセルとパワポやワードのファイル名が入っているとします。 その中の全てのファイルをコピーで同じ行のB列のフルパスのフォルダ内にコピーしたいのですが、マクロなどでの作成方法を教えてくだい。 A列 B列 C:\a1 Z:\test1 C:\a2 Z:\test2 C:\a3 Z:\test3 ・ ・ ・ バッチファイルであれば簡単なことですが、エクセルの表で管理したい次第です。 コピー先フォルダ内に同じファイルがあれば上書きしても構いません。(何回実行して同じファイルが上書きされてもOK) 出来ればxcopyで実行したいのですが、VBやVBAで使えるコマンドなのか、また繰り返し処理や応用に慣れてないため、詳しい方ご教授いただけると幸いです。 例えばC列以降に元のコピー対象ファイルを全て書き出してから、それらの一つ一つのファイルを読み込んでB列のフォルダ内にコピーするような動きでも問題ありません。 リスト作成する行の数は毎回決まっていなく、最大で50くらいあります。 ぜひ、ご教授お願いします。

  • エクセルVBAで複数のファイルをひとつにまとめる

    はじめまして。 VBA初心者で恐縮なのですが、教えてください。   ブックAAAがあるフォルダ内に複数ある「***.xls」の全てのフイルのシート「A」内の特定のセル(A1:F30)の文字列を、全てブックAAAの1つのシートの特定の列(A:F)に重ねてまとめたいと思っています。 但し、シート「A」は非表示となっていて、また、「***.xls」のファイルは全て「ブックの保護」がかかっているため、シート「A」を表示させるためにはパスワードの入力が必要となります。 これをVBAを使って実行することは可能でしょうか。複雑で手に負えず行き詰っています。 どなたかご存知の方いらっしゃいましたらご教授願います。 エクセル2007を使用しております。  

専門家に質問してみよう