VBAでファイルを移動する方法

このQ&Aのポイント
  • VBAを使って複数のファイルを一つのフォルダにまとめて移動する方法を教えてください。初心者です。
  • 参照したサイトのコードを使用して、ファイル名を取得してExcelにリストを作成する方法を理解しました。しかし、具体的なファイルの移動方法がわかりません。
  • 実際に行いたい処理は、図面がたくさん入っているフォルダから特定のファイルを取り出し、別のフォルダに移動したいです。具体的な手順がわかりません。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

では、 C:\Users\Desktop\移動元 という空っぽのフォルダがあったとして ここにZipファイルを解凍した。 サブフォルダが幾つかとそれぞれのフォルダに複数のファイルが出来た。 Zipファイルを除きすべてのファイルをC:\Users\Desktop\移動先フォルダのルートに 移動したい。 という解釈であっているとして・・。 Sub test02()   Dim oFs As Object   Dim oDir As Object   Dim oFile As Object   Dim FromDir As String   Dim ToDir As String      FromDir = "C:\Users\Desktop\移動元"   ToDir = "C:\Users\Desktop\移動先\" '\を忘れずに      Set oFs = CreateObject("Scripting.FileSystemObject")   Set oDir = oFs.getfolder(FromDir)   Set oFile = oDir.Files      If oFs.FolderExists(FromDir) = False Then     MsgBox "送り元が見つかりません"     GoTo atoShimatu   End If      If oFs.FolderExists(ToDir) = False Then     If MsgBox("送り先フォルダが見つかりません。作成しますか?", vbYesNo) = vbNo Then       GoTo atoShimatu     Else       oFs.createFolder (ToDir)     End If   End If      If oFs.getfolder(ToDir).Size <> 0 Then     MsgBox ToDir & "にはファイルが残ってます。取りあえず中止。"     GoTo atoShimatu   End If      Call moveFiles(oDir.Path, ToDir)   Exit Sub atoShimatu:   Set oFile = Nothing   Set oDir = Nothing   Set oFs = Nothing End Sub Private Sub moveFiles(oDirPath As String, toDirPath As String)   Dim oFs As Object   Dim oDir As Object   Dim oFile As Object   Dim FromDir As String   Dim ToDir As String      Set oFs = CreateObject("Scripting.FileSystemObject")   Set oDir = oFs.getfolder(oDirPath)   Set oFile = oDir.Files      For Each oFile In oDir.Files     If oFs.GetExtensionName(oFile) <> "zip" Then       'Debug.Print "FileName = ", oFile.Path, oFile.Name '確認用       'oFs.MoveFile oFile, ToDirPath '本番用(移動)?はこちら       oFs.CopyFile oFile, toDirPath, False '確認用、       '最後のFalseは既存ファイルがあればエラーになります     End If   Next      For Each oDir In oDir.SubFolders     'Debug.Print "folder = ", oDir.Name, oDir.Attributes ’確認用     Call moveFiles(oDir.Path, toDirPath)   Next        Set oFile = Nothing   Set oDir = Nothing   Set oFs = Nothing End Sub ※Zipファイルを解凍してできたサブフォルダ内に同名のファイルがあった場合を考えると oFs.CopyFile の方が安全かも?です。 絶対にありえない!確証があれば構いません。 (もし、存在した場合の処理は考えていません (^_^;) ) test02 を実行してみてください。 moveFiles が実際の処理を行っています。 検証が不十分かと思いますので念入りに!

iwamitza
質問者

お礼

ありがとうございます! すごいです。天才ですね。 一瞬でできました。 このままだと勉強にならないので、 まだ少し時間が残っているので、コードを解読できるようになってから上司に報告します。 本当にありがとうございました!

その他の回答 (2)

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.2

そういえばこの間似た様なことをしたな、と思ったので。 ファイルを解凍する→これは守備範囲でないのですみませんが。先にやっておいてください。 ファイル名を書き出す。→これは成功したようですね。特定の拡張子のもののみを書き出すこともできます。多分見たサイトに載ってます。 移動させないファイルは削除する。 任意の場所に移動させる。 →→仮にA列に移動元ファイル名を並べます。B列に移動後のファイル名を書きます。 name range("a" & k) as range("b" & k) これを for文(変数k)で行数分回せば、時間はかかりますが、できると思います。

iwamitza
質問者

お礼

ご回答ありがとうございました。 もう一人の方の方法で動かすことができました。 勉強のために教えていただいた方法でもやってみます。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

Scripting オブジェクトのMoveFolderを使えばフォルダごとごっそりと移動できます。 sub test01 dim oFs as object set oFs = CreateObject("scripting.filesystemObject") oFs.moveFolder "C:\Users\Desktop\移動元" , "C:\Users\Desktop\移動先" set oFs = nothing end sub ※移動先フォルダが存在しない場合に自動的に作成移動されます。 既に移動先フォルダが存在し、フォルダ内にファイル・サブフォルダがある場合はエラーになります。 Zipファイルだけを除外するようなオプションはありません。 VBA標準のステートメントだけでは不自由なのでマスターしてください。 http://www.happy2-island.com/vbs/cafe02/capter00216.shtml

iwamitza
質問者

お礼

ありがとうございました。 補足に書いた通りなのですが、今回、フォルダは除きたいのです。 ちなみに、Windows7では、 フォルダの検索窓で、.xls OR .docと検索して、 全選択→切り取り→任意のフォルダに貼り付け をすれば一発ですが、WindowsXPではこれができませんでした。

iwamitza
質問者

補足

説明が足らず申し訳ありません。 フォルダは除いて、ファイルのみ移動したいのです。 buf=dir()を使ってうまくできそうな気がしましたが、まだできていません。 ご回答お願いいたします。

関連するQ&A

  • VBAの初心者でやりたいことがあるのですが、どうやっていいのか分かりま

    VBAの初心者でやりたいことがあるのですが、どうやっていいのか分かりません。 やりたいことは 1.フォルダを指定してCSVファイルを読み込む。 2.読み込んだCSVファイルを一行あたり1ファイルのエクセルファイルに書き込む。 3.完成したエクセルファイルを印刷する。 4.フォルダの中のファイルが無くなれば終了 としたいのですが、途中で頓挫しています。 宜しくお願いします。 Option Explicit sub READ_TextFile() Const cnsTITLE = "フォルダ内のファイル名一覧取得" Const cnsDIR = "\*.*" Dim xlAPP As Application Dim strPATHNAME As String Dim strFILENAME As String Dim GYO As Long Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP2 As Application' Applicationオブジェクト Dim intFF As Integer' FreeFile値 Dim X() As Variant' 読み込んだレコード内容 Dim IX1 As Long' CSV項目カラムINDEX Dim lngREC As Long' レコード件数カウンタ Dim strREC As String' レコード領域 Dim POS1 As Long' レコード文字位置 Dim POS2 As Long' レコード文字位置 Set xlAPP = Application strPATHNAME = xlAPP.InputBox("フォルダ名を入力して下さい。", _ cnsTITLE, "C:\Documents and Settings\hidekazu_miyawaki\デスクトップ\") If StrConv(strPATHNAME, vbUpperCase) = "FALSE" Then Exit Sub If Dir(strPATHNAME, vbDirectory) = "" Then MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTITLE Exit Sub End If strFILENAME = Dir(strPATHNAME & cnsDIR, vbNormal) Set xlAPP2 = Application Do While strFILENAME <> "" GYO = GYO + 1 Cells(GYO, 1).Value = strFILENAME strFILENAME = Dir() Open strFILENAME For Input As #intFF GYO = 1 Do Until EOF(intFF) lngREC = lngREC + 1 xlAPP2.StatusBar = "読み込み中です(" & lngREC & "レコード目)" Line Input #intFF, strREC POS1 = 1 IX1 = 0 ReDim X(IX1) Do While POS1 <= Len(strREC) POS2 = InStr(POS1, strREC, ",", vbTextCompare) If POS2 < POS1 Then POS2 = Len(strREC) + 1 End If ReDim Preserve X(IX1) X(IX1) = Trim$(Mid$(strREC, POS1, POS2 - POS1)) If (((Left$(X(IX1), 1) = """") And (Right$(X(IX1), 1) = """")) Or _ ((Left$(X(IX1), 1) = "'") And (Right$(X(IX1), 1) = "'"))) Then X(IX1) = Trim$(Mid$(X(IX1), 2, Len(X(IX1)) - 2)) End If POS1 = POS2 + 1 IX1 = IX1 + 1 Loop GYO = GYO + 1 If IX1 >= 1 Then Range(Cells(GYO, 1), Cells(GYO, IX1)).Value = X End If Loop Loop Close #intFF xlAPP.StatusBar = False MsgBox "ファイル読み込みが完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • Excel VBA読み込みで文字化けが

    Excel VBAにてメールデータを読み込むプログラムを組んでいます。 データの作り方は、 (1)Mozilla Thunderbirdでメールデータをtext形式で保存 (2)VBAにてtextデータを開く。 しかし読み込みを行うと、文字化けしたデータが表示されてしまいます。 どのように解決したらよいのでしょうか? 文字コード変換を行ってもダメでした。 Sub Read_mail_data() Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受け取り用 Dim strREC As String ' 読み込んだレコード名 Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のダイアログでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行わない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' 改行までをレコードとして読み込む Line Input #intFF, strREC ' 行を加算しA列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 ' 文字コードを変換する 'StrConv(strREC, vbFromUnicode) = a Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) ' セルにデータを書き込む 'Cells(GYO, 1).Value = strREC Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。 " & vbCr & "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • VBAでのテキストデータ追記

    VBAを使ってデータをテキストファイルに追記したいのですが、 A列だけじゃなく A列からF列までのデータを追記させたいと 考えているのですが、 どうやるのか理解できません。 教えていただけますでしょうか? -------------------------------------------------------------- Option Explicit ' テキストファイル書き出すサンプル Sub WRITE_TextFile() Const cnsTitle = "テキストファイル出力処理" Const cnsFilter = "テキストファイル (*.txt;*.dat),*.txt;*.dat" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「名前を付けて保存」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "出力するファイル名を指定して下さい。" ' (1) vntFileName = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.txt", _ FileFilter:=cnsFilter, _ Title:=cnsTitle) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す) With ActiveSheet If .FilterMode Then .ShowAllData ' オートフィルタ解除 End With GYOMAX = Cells(65536, 1).End(xlUp).Row ' (2) If GYOMAX < 2 Then xlAPP.StatusBar = False MsgBox "テキストをA列2行目から入力してから起動して下さい。", , cnsTitle Exit Sub End If ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open strFileName For Output As #intFF ' (3) ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' (4) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)" ' レコードを出力 Print #intFF, strREC ' (5) ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル出力が完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTitle End Sub -----------------------------------------------------------------------------

  • Excel for mac 2011でDir関数?

    Excel for mac 2011でDir関数を使用したファイルサーチが出来ません。なぜなのでしょうか? 使用環境は、Excel for mac 2011 ver. 14.1.0, MacOS X 10.6.7, MacBook Airです。 働いている研究室がMac onlyのため、Mac版のExcelにvbaを移植しようと考えているのですが、以下のプログラムが上手く動きません。 ------------------vbaプログラム Private Sub CommandButton1_Click() Dim strPATHNAME As String ' 指定フォルダ名 Dim strFILENAME As String ' 検出したファイル名 Dim ExistFILE As Boolean ' "*.TXT"ファイルの判定 ' 「フォルダの参照」よりフォルダ名の取得 strPATHNAME = MacScript("choose folder") strPATHNAME = Mid(strPATHNAME, 7) 'aliasを削る If strPATHNAME = "" Then Exit Sub ' 指定フォルダ内のTEXTのファイル名を参照する strFILENAME = Dir(strPATHNAME, vbNormal) '<------ここでファイルを検出しない。 ExistFILE = strFILENAME Like "*.TXT" If strFILENAME = "" Then MsgBox "このフォルダにはTXTファイルは存在しません。" Exit Sub End If End Sub ------------------ 上記プログラムは、コマンドボタンを押すとフォルダを指定して、その中の”.TXT”という拡張子のついたファイルを見つけるプログラムです。(実際には何もしないダミープログラムですが) しかしこれを実行すると、Dir関数の所で何も検出してくれません。 ローカル変数を追って、フォルダまでのパスにカタカナが入ったらダメだとか、”alias”が邪魔だとかは解決したのですが、肝心のDir関数が上手く動いていないことに気づきました。 どなたか詳しい方にお願い致します。 どうすれば、指定したフォルダ中の拡張子”.TXT”がついたファイルを見つけることが出来るのか?教えて頂ければ幸いです。

  • Excelからテキストファイルを読み込み、読み込んだ行を削除する方法

    Excelからテキストファイルを読み込み、読み込んだ行を削除する方法 いつもお世話になりますm(__)m Excel2003のVBAで、以下のようにテキストファイルを読み込む処理を作成しています。 Sub LoadFile() Dim intFF As Integer Dim strFILENAME As String Dim DtC, DtD, DtE As String Dim GYO As Long strFILENAME = ActiveWorkbook.Path & "\sample.txt" If Dir(strFILENAME) <> "" Then intFF = FreeFile Open strFILENAME For Input As #intFF GYO = 1 Do Until EOF(intFF) Input #intFF, DtC, DtE, DtE If DtC = 1 Then GYO = GYO + 1 Worksheets("DataSheet").Range("C" & GYO).Value = DtC Worksheets("DataSheet").Range("D" & GYO).Value = DtD Worksheets("DataSheet").Range("E" & GYO).Value = DtE End If Loop Close #intFF End If End Sub sample.txtからデータを読み込み、1個目のデータが「1」なら、DataSheetのC,D,Eの各列に、テキストファイルから読み込んだデータがセットされます。 1個目のデータが1以外なら、DataSheetにはセットされないようにしています。 そこで、読み込んだデータ(1個目のデータが「1」の行)を読み込んでDataSheetに挿入した後に、その行をsample.txtから削除したいのですが、どうすればいいかわかりません(>_<) 最終的に、処理を実行した後のsample.txtは、DataSheetにセットしたデータ以外が残るようにしたいのです。 お詳しい方、何卒ご教授のほど宜しくお願い致しますm(__)m

  • VBAでCSVを文字列として取り込む方法

    VBAでCSVを文字列として取り込む方法を教えてください。 下記のようにCSVファイルを取り込んでいます。 Array関数を使用していますが、どうしても文字列として認識してくれません。 Sub CSV取り込み() Dim xlAPP As Application ' Applicationオブジェクト Dim strFILENAME As String ' OPENするファイル名(フルパス) 'Applicationオブジェクト取得 Set xlAPP = Application '「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) 'キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), _ Array(4, 2), Array(6, 2)) Workbooks.Open Filename:=strFILENAME ActiveWorkbook.Sheets(1).Cells.Copy _ Destination:=ThisWorkbook.Worksheets("sheet1").Range("A1") End Sub この書式ではCSVを文字列として取り込めないのでしょうか? どなた様かご教示ください。 よろしくお願いいたします。

  • ファイルを移動先のフォルダへ移動させるVBA教えて

    とあるシートのB列の値かつAM列の値と、とあるフォルダ内にあるファイルの名称が部分一致したときに、 そのファイルを移動先のフォルダへと移動させるVBAを教えていただけないでしょうか? この内容のVBAを作ったのですが、エラーが出てしまいます(エラーの箇所はコード内に示している)、またこのエラーが影響しているか分からないのですが分別されているのですが上手くいっていません VBA初心者なのでどうか分かりやすくお教えお願い致します Sub 分別() '移動元のフォルダの設定 Const xFrm As String = "C:\before\" '移動先のフォルダの設定 Const xTo As String = "C:\after\" 'アクティブになっているシートのB列の値かつAM列の値と、C:\before内のファイルの名称が部分一致した時、そのファイルをC:\afterへと移動する '((例)B列:M123456、AM列:789、C:\before内のファイル:M123456-789-C12.csv) Dim i As Long, xFile As String With ActiveSheet For i = 3 To .Cells(Rows.Count, 1).End(xlUp).Row With .Cells(i, 2) xFile = Dir(xFrm & "*" & .Value & "*") Do While xFile <> "" If xFile Like "*" & .Offset(, 37).Value & "*" Then Name xFrm & xFile As xTo & xFile End If xFile = Dir() Loop End With Next i End With 'C:\before内に残っているファイルを、C:\after2に移動 Dim fso As Object Dim MFir As String Dim SFir As String Set fso = CreateObject("Scripting.FileSystemObject") MFir = "C:\before\*.*" SFir = "C:\after2\" fso.MoveFile MFir, SFir →ここでエラー出る Set fso = Nothing MsgBox "終了" End Sub

  • VBA フォルダ内の全てブックの特定の行の削除方法

    VBAで質問させて下さい。 指定したフォルダ内にある全てのブックにて、セル「B35」が0だった場合、その行を削除する というコードが上手く動きません。 出来ない箇所:行の削除、処理済みのブックを閉じる 色々と検索しましたが分からなかったので、ご教授頂けると大変助かります。 どうぞよろしくお願いいたします。 ----------------------ここから↓----------------- Sub 修正() Dim xlAPP As Application Dim strPathName As String Dim strFileName As String Dim swESC As Boolean ' 「フォルダの参照」よりフォルダ名の取得 strPathName = BrowseForFolder("フォルダを指定して下さい", True) If strPathName = "" Then Exit Sub ' 指定フォルダ内のExcelワークブックのファイル名を参照する strFileName = Dir(strPathName & "\*.xls", vbNormal) If strFileName = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません。" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False ' 画面描画停止 .EnableEvents = False ' イベント動作停止 .EnableCancelKey = xlErrorHandler ' Escキーでエラートラップする .Cursor = xlWait ' カーソルを砂時計にする End With On Error GoTo Button1_Click_ESC ' 指定フォルダの全Excelワークブックについて繰り返す Do While strFileName <> "" ' Escキー打鍵判定 DoEvents If swESC = True Then ' 中断するのかをメッセージで確認 If MsgBox("中断キーが押されました。ここで終了しますか?", _ vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_EXIT Else swESC = False End If End If '----------------------------------------------------------------------- ' 検索した1ファイル単位の処理 Call OneWorkbookProc(xlAPP, strPathName, strFileName) '----------------------------------------------------------------------- ' 次のファイル名を参照 strFileName = Dir Loop GoTo Button1_Click_EXIT '---------------- ' Escキー脱出用行ラベル Button1_Click_ESC: If Err.Number = 18 Then ' EscキーでのエラーRaise swESC = True Resume ElseIf Err.Number = 1004 Then ' 隠しシートや印刷対象なしの実行時エラーは無視 Resume Next Else ' その他のエラーはメッセージ表示後終了 MsgBox Err.Description End If '---------------- ' 処理終了 Button1_Click_EXIT: With xlAPP .StatusBar = False ' ステータスバーを復帰 .EnableEvents = True ' イベント動作再開 .EnableCancelKey = xlInterrupt ' Escキー動作を戻す .Cursor = xlDefault ' カーソルをデフォルトにする .ScreenUpdating = True ' 画面描画再開 End With Set xlAPP = Nothing End Sub '******************************************************************************* ' 1つのワークブックの処理 '******************************************************************************* Private Sub OneWorkbookProc(xlAPP As Application, _ strPathName As String, _ strFileName As String) Dim R As Range '--------------------------------------------------------------------------- Dim objWBK As Workbook ' ワークブックObject ' ステータスバーに処理ファイル名を表示 xlAPP.StatusBar = strFileName & "修正中...." ' ワークブックを開く Set objWBK = Workbooks.Open(Filename:=strPathName & cnsYEN & strFileName, _ UpdateLinks:=True, _ ReadOnly:=False) '--------------------------------------------------------------------------- ' ↓↓↓ 検索した1ファイル単位の処理 ↓↓↓ Set R = ActiveSheet.Range("B35").Find(What:="0", LookAt:=xlWhole) If R Is Nothing Then Exit Sub R.EntireRow.Delete ' ↑↑↑ 検索した1ファイル単位の処理 ↑↑↑ '--------------------------------------------------------------------------- ' 開いたブックをClose objWBK.Close SaveChanges:=True Set objWBK = Nothing End Sub

  • ファイル内容を変換後に別フォルダへコピーしたい

    エクセルVBAにて 下記フォルダ状況となっている場合に C\元データ\複数のtxtファイル C\変換後データ 元のデータ内にあるtxtファイルの中身を変換し Open strFileName For Input As #intFF Do Until EOF(intFF)   Line Input #intFF, strREC GYO = GYO + 1 Cells(GYO, 1).Value = 付け加えたい文字 + strREC Loop 変換したファイルを C\変換後データへコピーしたいのですが どのようししたらよろしいのでしょうか? コピーしたファイル名は元のファイル名と同じにしたいです。

  • とある特定のフォルダで無限ループに陥る

    Sub 全てのファイル名を振り直す() i = 1 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(フォルダ名) For Each MyFolder In .SubFolders NewFolder = MyFolder.Name Call フォルダ内のファイル名を変更する(NewFolder) Next End With End With Set myFSO = Nothing End Sub Sub フォルダ内のファイル名を変更する(NewFolder As String) Debug.Print NewFolder strPathName = フォルダ名 & NewFolder & "\" strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" Name strPathName & "\" & strFileName As strPathName & "\" & Format(i, "0000") & ".gif" i = i + 1 strFileName = Dir() Loop End Sub こんな感じでフォルダの中のファイル名をループし、変更しているのですが とあるフォルダの中をループすると、 無限ループに陥ります。 原因は、 strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" の時点でファイル名を変更するのでいつまでたっても終わりが来ないからなのですが フォルダ仮1は大丈夫なのに、フォルダ仮2をループし始めると無限ループに陥ります。 フォルダ名に問題があるのでしょうか? フォルダ名はネットには書けません。