• ベストアンサー

VBAでのファイル操作について

「Aフォルダ」内のファイル名が*1から始まる複数のファイルを、「Bフォルダ」のサブフォルダである「1フォルダ」に移動するマクロ、*2を「2フォルダ」へと「9フォルダ」まで繰り返すための記述方法を教えてください。

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

  • ベストアンサー
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

質問の答え=プログラムを作成するということになるので ポイントだけ教えます。 まず、FSO(FileSystemObject)を用います。 ____________________________________________ フォルダ選択ダイアログは 以下のコードで簡単に取得できます。 Dim Fs as Object DIm Fd as Object SET FS = CreateObject("Shell.Application") SET FD=fs.BrowseForFolder(0,"フォルダを選択してください。",&h1,"Aフォルダのパス") ____________________________________________ ファイル名の取得は以下のとおりです。 Dim Fs as Object DIm Corfiles as Object Dim ObjFolder Dim StrFile as string Dim Cnm as string SET FS = CreateObject("scripting.FilesystemobJect") SET ObjFolder = FS.Getfolder(~指定されたパス) SET ObjFolder = ObjFolder.files StrFile =EMPTY Cnm=Empty For each ObjFiles In Corfiles   StrFile = strFile & Cnm & Objfile.Name   Cnm="," Next あとは取得したファイル名を split関数で 配列変数に変換し、 その値を 検査してゆけばよろしいかと思います。 ___________________________ ファイル名の調査 DIM aryFname as Variant DIM I as integer DIm L as integer DIm strwk as string DIM strMoji as string aryfname = split(strfile,",") For I=0 to ubound(aryfname) strwk = aryfname(I) FOR L=1 to len(strwk) strMoji= MID(strwk,L,1) select case strMoji case = "." exit for case = "1" Call File_Move("~指定されたパス",strwk,"Bフォルダ\1フォルダ) case = "2" 以下 case = "1" と同じ要領 "9"まで同じ end select next L next i ______________________________________________________ ファイル移動の処理 Private sub File_Move(P_PATH as string,P_Fname as string,P_MvFolder as string) ここに 処理を記述します。 以下は サンプルです。 '===================<サンプル>========' Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") ''C:\Tmp\Sub\フォルダをC:\Work\フォルダに移動します FSO.MoveFolder "C:\Tmp\Sub", "C:\Work\" '============================================ end sub ___________________________ 【コメント】 上記プログラムはあくまで参考です。 実際はデバッグしないと動作しないと思います。 参考のHPを手がかりにプログラムを作成してください。 XPのコマンドのバッチファイルでも実現できます。 copyコマンドとDir、fileExists でできます。 なお、このプログラムはメモ帳でファイル名の拡張子を VBS とすることでそのままwindows プログラムとして 動きます。 できれば今後はある程度は自分で作成してピンポイント で質問してください。 丸投げや学校などの問題の質問は 禁止されています。 __________________________________________________ 【参考】以下のURLは勝手ながらリンクさせていただきました。 http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#MoveFile ___________________________

osietegoo-
質問者

お礼

ご回答ありがとうございました。 正直、これだけ長くて複雑だとは思いませんでした。 初心者で理解するのに時間がかかりそうですが ひとつずつひも解いて行きたいと思います。 この回答のために時間と労力を割いていただき感謝いたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル2007VBAでフォルダ名とファイル名を

    取得したいのです。 あるフォルダ内にマクロのファイルと、複数のサブフォルダ及びその中の複数ファイルがあり 添付画像の通り、サブフォルダ名とファイル名、拡張子を取得したいのです。 どのようにすれば良いでしょうか、、ご教示下さい。

  • VBA バッチファイルでコピー出来ない

    以下のマクロを作りましたが、うまくいきません。 フォルダBにあるバッチファイルを実行するだけのマクロで、バッチファイルはフォルダAにあるファイルを自身のフォルダつまりフォルダBにコピーするものです。 マクロ Sub Test() Dim Str As String Str=shell(folderB\batch.bat, vbnormalfocus) End sub Batch.batの中身 Copy folderA\fileA . 注:folderAやfolderBはそれぞれのフォルダのフルパスです。 実行すると、何故かフォルダBでなくてデスクトップにコピーされます。バッチファイルをクリックして直接起動すると、目論見通りフォルダBにコピーされます。コマンドプロンプトからフォルダBに移動し、バッチファイルを起動しても、目論見通りフォルダBにコピーされます。 マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか?

  • 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の組み合わせで なんとかなりそうなのですが、 頭の中が混乱して答えが導き出せません。 今週中に作らないといけないので、 お力をお貸しください。 よろしくお願いいたします。

  • VBA バッチファイルでコピーできない

    この質問は直近で出した質問を誤って締め切ってしまったため、再質問として書いてます。 以下のマクロを作りましたが、うまくいきません。 フォルダBにあるバッチファイルを実行するだけのマクロで、バッチファイルはフォルダAにあるファイルを自身のフォルダつまりフォルダBにコピーするものです。 マクロ Sub Test() Dim Str As String Str=shell("""" & folderB\batch.bat & """", vbnormalfocus) End sub Batch.batの中身 Copy "folderA\fileA" . '見えにくいですが、最後にピリオドがあります。 folderAやfolderBはそれぞれのフォルダのフルパスです。パスに空白を含むため " で囲むようにしてます。 実行すると、何故かフォルダBでなくてデスクトップにコピーされます。バッチファイルをクリックして直接起動すると、目論見通りフォルダBにコピーされます。コマンドプロンプトからフォルダBに移動し、バッチファイルを起動しても、目論見通りフォルダBにコピーされます。 マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか?

  • 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

  • バッチファイルで、ファイル名から自動振分したい

     C:\B\の中に、必ず「半角数字4桁_」から始まるファイル名のデータが毎週入ります。  「半角数字4桁_」以後のファイル名、拡張子は、その週によって変わります。  C:\A\の中には、必ず「_半角数字4桁_」で終わるフォルダ名のサブフォルダがあります。  このフォルダ名は、ずっと変わることがありません。  C:\B\の中にあるデータを、ファイル名の最初の4桁の数字をもとに、C:\A\にあるサブフォルダに自動で移動したいです。また、移動する際に、既にサブフォルダ内に「半角数字4桁_」から始まるファイル名のデータがある場合は、削除してから移動したいです。 フォルダ構成です。 Cー|    |-【A】    |   |-【あいう_1234】    |  |-【あい_2235】    |   |-【かきくけ_8990】    |   |-【アイウエオ_5014】    |    |-【B】    |   |-1234_ABC.txt    ←このファイルは C:\A\【あいう_1234】に。    |  |-2235_1534.txt   ←このファイルは C:\A\【あい_2235】に。    |   |-8990_22.doc     ←このファイルは C:\A\【かきくけ_8990】に。    |   |-5014_わをん.doc   ←このファイルは C:\A\【アイウエオ_5014】に。   自分でバッチファイルを記述してみたのですが、ここからどうしていいか分かりません。  どなたか教えてもらえないでしょうか? よろしくお願いします。    自分で記述してみたバッチファイルです。 cd C:\B dir /b > C:\C\list.txt set folder=C:\A set file=C:\B set Bat=C:\C for /f "delims=" %%a in ( %Bat%\list.txt ) do if exist "%file%\%%a" move "%folder%\%%a" "%to%" PAUSE > NUL

  • 複数のエクセルファイルをマクロで開いて閉じたい

    フォルダにエクセルファイルが複数あります。A*** B*** マクロを使い、A・Bの後の日々変更される(数字)ファイル名に対応して、 ファイルを開きActivateにする方法と閉じる方法を教えてください。

  • エクセルVBA ファイル名操作

    エクセルマクロのコードにおきまして 「フォルダの選択」ダイアログから エクセルファイル 123.xlsxを例えば 開くときに それをa.xlsxという名前に変えて 以下のそれに続くVBAコードにおいて a.xlsxを操作したいのですが、 a = Application.GetOpenFilename() Workbooks.Open a これを実行すると求めるダイアログが表示されて 使いたい123.xlsxを開くをクリックしますが これでは123.xlsxがa.xlsxにはなりません このa.xlsxのファイル名で別途ファイル作成する方法を 御教示いただけると助かります よろしくお願いします win10 office365 コードは以下 部分ですが こういう流れで作成したい所存です Sub あいう() a = Application.GetOpenFilename() Workbooks.Open a 'b.xlsxファイルを新規作成 Workbooks.Add ActiveWorkbook.SaveAs Filename:="C:\Users\USER\Desktop\あいう\b.xlsx", FileFormat:=xlXMLSpreadsheet 'a.xlsxファイルの1行目のA1~AG1のセルの値をコピー Workbooks("a.xlsx").Worksheets("Sheet1").Range("A1:AG1").Copy 'b.xlsxファイルのA3~AG3のセルに貼り付け Workbooks("b.xlsx").Worksheets("Sheet1").Range("A3:AG3").PasteSpecial xlPasteValues 以下省略 よろしくお願いします

  • VBAでのファイル削除処理

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

  • ファイルを開くマクロ

    フォルダ(A)の中にエクセルファイルが(a,b)2つあります。aのファイルに下記のマクロを組んで、ボタンにマクロを貼り付けます。マクロでbのファイルを開きたいのですが、ファイルが見つかりませんとなってしまいます。フォルダ(A)は場所を移動して使う予定です。うまく動かなくて困っております。ご教授よろしくお願い致します。 Sub CCC()   s_PathCheck   Workbooks.Open Filename:=myWBPath & "b.xls" Sheets("P").Select Range("a11").Select End Sub Sub s_PathCheck() Dim n As Variant myWBPath = Workbooks(1).Path myWBName = Workbooks(1).Name n = InStr(myWBName, ".xls") myWBNameF = Left(myWBName, n - 1) End Sub