• 締切済み

VBA フォルダ内のファイルを昇順に読み出す方法

以下のような簡単なプログラムを組みました。 ファイル名を昇順に読み出せると思っていましたが、そうならない場合があるようです。 なぜなのでしょうか? また、どうすればファイルを昇順に読み出せるのでしょうか? どなたか教えて頂けないでしょうか? (抜粋) Set WS1 = Worksheets("データー(org)") '書き出すシート Set WS3 = Worksheets("集計") Dim a As String With Application.FileDialog(msoFileDialogFolderPicker) .Show PathName = .SelectedItems(1) & "\" 'ファイルの入っているフォルダを指定 End With BookName = Dir(PathName) '処理するファイル Do Until BookName = "" Workbooks.Open PathName & BookName 'ファイルを開く Set WS2 = Worksheets(1) '読み込むシート WS2.Rows("1:" & WS2.UsedRange.Rows.Count).Copy If WS1.UsedRange.Rows.Count = 1 Then WS1.Rows(WS1.UsedRange.Rows.Count).PasteSpecial Paste:=xlValues Else WS1.Rows(WS1.UsedRange.Rows.Count + 1).PasteSpecial Paste:=xlValues End If Workbooks(BookName).Close 'ファイルを閉じる BookName = Dir() 'ファイル名をクリア Loop

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

#1です。 エクセルを使っているようだから、ファイル名を一旦シートの同一列のセルに固定し(代入し)、数値と文字列を判別するとか 特別の望みの順(エクセルで、そのままのソート(後の)順では気に食わないとき)に並べたいなら隣列に修正ソートキー(注)をプログラムでつくり、 ソートはエクセルのソートを使うほうが良いと思う(マクロの記録でそのコードはわかる。自作は避ける!バグが心配)。 エクセルでフリガナでソートなどにはなっていないか注意。 (注)コンピュターのまたはソフト(エクセルなど)のソートのクセ(ルール)を逆手にとって、自分に向いたソートキー列データを別途作る。 FORMAT関数(結果文字列)などで望みのソートに都合の良い文字列を作る。 数字部分は先頭0付きの固定桁数の数字文字にするとかのようなこと。 === これの作り方に迷ったら、別途!、質問を立てて、識者の知恵を借りること。

kawaii_usa
質問者

お礼

お返事が遅くなりました。 ご回答ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

フォルダ内は名前の昇順に整理されていないはず。 だからFSOのFor EachやVBのDir関数でフォルダのファイルを取り出しても名前の順序にはならない。 質問のコードはこれでは無いようなので、この方法でやってみて。 http://soft1.jp/trouble/w/w014.html のように見た目は並べ替えアッれるが、上記でファイル名を取得すると、その並べ替えが効かないのではなかったかな。 もしそうなら、ファイル名をシートに記録して、それをソートして、上からそのファイル名で読み出すしかないでしょう。 そのファイルを読んだとき(その後の)の処理にも拠るが、ファイルのデータを全部入手して、それから都合の良い順序(ファイルの名前順)にソートしても良い場合があると思うが。 ーー しかし http://officetanaka.net/excel/vba/file/file07.htm Dir関数が返すファイルの順番 のような説明もあるので、「NTFS]を確認して、やってみてください。

kawaii_usa
質問者

お礼

御回答ありがとうございました。 早速、次のようなマクロを組んでみました(冗長な部分が多いですが)。 でも、例えば、ファイル名が数字の1~22だと、当然ながら 1,10,11,・・・,19,2,20,21,22,3,4,・・・,9 となってしまいます。 (文字だと上手くいきます。T100,T101,・・・,T110, とか) EXCELのオートフィルタを使うと昇順に数字や文字が混在していても並ぶと思いますが、同じ動作をさせたいのですが、どのようなマクロを組めばよろしいでしょうか? よろしくお願いします。 (抜粋) With Application.FileDialog(msoFileDialogFolderPicker) .Show PathName = .SelectedItems(1) & "\" End With BookName = Dir(PathName) Do Until BookName = "" ReDim Preserve strMyFile(nnn) strMyFile(nnn) = BookName BookName = Dir() nnn = nnn + 1 Loop jjj = 0 '要素0から順に直接的にソートする Do While jjj < nnn - 1 iii = jjj + 1 Do While iii < nnn If StrComp(strMyFile(jjj), strMyFile(iii), 1) = 1 Then '入れ替え temp = strMyFile(jjj) strMyFile(jjj) = strMyFile(iii) strMyFile(iii) = temp End If iii = iii + 1 Loop jjj = jjj + 1 Loop For i = 0 To nnn - 1 BookName = strMyFile(i) nn = nn + 1 Workbooks.Open PathName & BookName 'ファイルを開く Set WS2 = Worksheets(1) '読み込むシート WS2.Rows("1:" & WS2.UsedRange.Rows.Count).Copy If WS1.UsedRange.Rows.Count = 1 Then WS1.Rows(WS1.UsedRange.Rows.Count).PasteSpecial Paste:=xlValues Else WS1.Rows(WS1.UsedRange.Rows.Count + 1).PasteSpecial Paste:=xlValues End If Workbooks(BookName).Close 'ファイルを閉じる Next i

関連するQ&A

  • すべてのファイルにデータを取得方法

    VBAで一覧作成を作っているですけど、ちょっと力不足のせいで、わからないところがあって、ぜひご教示ください。 フォルダにあるすべてのファイルを読み込んで、中の値を取得したいです。いろいろ方法を試して見たのですが、うまく行かないです。 こんな感じです。(一覧作成見たいもの) xlsファイル1   A  B   C     D 1 氏名 NO オーダー名  時間 に 指定されたフォルダ中のすべてファイル A   B     C (一つのファイル) 1 氏名   山田  2 No オーダー名  時間 3 01    A 1 4 02  B 1 5 03  B  1 氏名   佐藤  (二つのファイル) No オーダー名  時間 03  C 1 04  D 1 05    E 1 ・ ・ ・ の最後のファイルまでを 読み込んだら xlsファイル1を  A  B   C     D 氏名 NO オーダー名  時間 山田 01 A 1 山田 02 B 2 佐藤 03 C 1 佐藤 04 D 1 佐藤 05   E      1 ・ ・ ・ こんな感じ Dim BookName As String Dim PathName As String Dim WS1 As Worksheet Dim WS2 As Worksheet Dim no2_count As Long ’xlsファイル1 Set WS1 = Worksheets("個人一覧作成") no2_count = WS1.Cells(Rows.count, 1).End(xlUp).Row Dim i As Integer For i = 2 To no2_count Step 1 PathName = "C:\test\" BookName = Dir(PathName & "*.xls", vbNormal) Do Until BookName = "" Workbooks.Open PathName & BookName Set WS2 = Worksheets(2)   ’氏名の値を取得 WS1.Range("A" & i).Value = WS2.Cells("B,C", 2).Value Workbooks(BookName).Close    BookName = Dir() Loop Next i 初心者なので今の段階では氏名の値すら取得できないですけど、 簡単でも結構ですので、どなたは方法をご教示ください。

  • 指定フォルダ内のファイルオープン→別フォルダに同じファイル名のcsvとして保存 のマクロを作ろうとしています

    エクセルで、指定フォルダ内のファイルオープン→別フォルダに同じファイル名のcsvとして保存 のマクロを作ろうとしています。 現在下記のようなマクロを途中まで作成したのですが、保存の良い方法が分からず困っております。 (ファイルオープンまでは出来ているようですが、その後エラーが出てしまいます) どなたかお知恵を拝借願えませんでしょうか。 どうぞ宜しくお願い致します。 Sub Book_Open() Dim BookName As String Dim PathName As String PathName = "C:\test_htmltocsv\test\" BookName = Dir(PathName & "*.html") Do Until BookName = "" Workbooks.Open PathName & BookName BookName = Dir() ActiveWorkbook.SaveAs "Sample.xls" ←← Loop End Sub

  • 複数のファイルに対し同じ処理を行う方法

    複数のファイルのエクセルファイルに対し、同じ処理を行うマクロを教えてほしいです。 処理するファイル数が一定でないため、現在はDo While~Loop構文を用い強引に処理しています。 しかし、この方法では処理が終わる(アクティブファイルが無くなる)とエラーメッセージが出るため、煩わしいです。 Do Until構文で、終了条件を指定したらよさそうなのですが、どのように書けばいいのかわかりません。 現在記述しているものは以下です。 -------------------------------------------------------- Sub 連続処理() Dim BookName As String Dim PathName As String PathName = "D:\A1\連続処理\" BookName = Dir(PathName & "*.xls")   Do Until BookName = ""  Workbooks.Open PathName & BookName  BookName = Dir() Loop Do While (1)   ・   ・(処理作業を行うマクロ)   ・ Workbooks(ActiveWorkbook.Name).Close savechanges:=True Loop End Sub

  • Select Case の使い方について

    エクセルのバージョンは2003です。 Worksheets("様式2")のセルをコピーしてWorkbooks("件数.xls").Worksheets("件数")のセルに数値のみを張り付ける作業を Select Caseを使って組んでいるのですが数が多くて打ち切れません。 WS2からコピーするセルは変わらずWB1へ貼り付けする場所は列がずれて行きます。 myNoは1~30までで、1の場合はC列に数値を貼り付けし、2の場合はD列に数値を貼り付けし、3の場合はE列に数値を貼り付けし・・・ といった具合に列をずらして貼り付けを行いたいのです。 よろしくお願いします。 Dim myNo As Integer Set WS2 = Worksheets("様式2") Set WB1 = Workbooks("件数.xls").Worksheets("件数") myNo = Workbooks("件数.xls").Worksheets("一覧").Range("V7").Value Select Case myNo Case Is = 1 'Worksheets("様式2")からWorkbooks("件数.xls").Worksheets("件数")へ数値のみコピー WS2.Range("T7").Copy WB1.Range("C4").PasteSpecial Paste:=xlPasteValues WS2.Range("T8").Copy WB1.Range("C7").PasteSpecial Paste:=xlPasteValues WS2.Range("T10").Copy WB1.Range("C13").PasteSpecial Paste:=xlPasteValues WS2.Range("T11").Copy WB1.Range("C16").PasteSpecial Paste:=xlPasteValues WS2.Range("T13").Copy WB1.Range("C22").PasteSpecial Paste:=xlPasteValues WS2.Range("T14").Copy WB1.Range("C25").PasteSpecial Paste:=xlPasteValues WS2.Range("T16").Copy WB1.Range("C31").PasteSpecial Paste:=xlPasteValues WS2.Range("T17").Copy WB1.Range("C34").PasteSpecial Paste:=xlPasteValues WS2.Range("T18").Copy WB1.Range("C37").PasteSpecial Paste:=xlPasteValues WS2.Range("T69").Copy WB1.Range("C5").PasteSpecial Paste:=xlPasteValues WS2.Range("T70").Copy WB1.Range("C8").PasteSpecial Paste:=xlPasteValues WS2.Range("T72").Copy WB1.Range("C14").PasteSpecial Paste:=xlPasteValues WS2.Range("T73").Copy WB1.Range("C17").PasteSpecial Paste:=xlPasteValues WS2.Range("T75").Copy WB1.Range("C23").PasteSpecial Paste:=xlPasteValues WS2.Range("T76").Copy WB1.Range("C26").PasteSpecial Paste:=xlPasteValues WS2.Range("T78").Copy WB1.Range("C32").PasteSpecial Paste:=xlPasteValues WS2.Range("T79").Copy WB1.Range("C35").PasteSpecial Paste:=xlPasteValues WS2.Range("T80").Copy WB1.Range("C38").PasteSpecial Paste:=xlPasteValues

  • EXCEL 最終行に入力するマクロ

    マクロ初心者です。 シート”受注書”からシート”受注履歴”に 履歴情報を書き込むマクロを作成しています。 初心者丸出しで恥ずかしいのですが、 下記のように組んでいます。 Sub 受注情報書き込み() Dim ws01 As Worksheet Dim ws02 As Worksheet Set ws01 = Worksheets("受注書") Set ws02 = Worksheets("受注履歴") ws02.Activate ' 受注No入力 ws01.Range("C2").Copy ws02.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues ' 受注日入力 ws01.Range("M2").Copy ws02.Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues ' 出荷日入力 Sheets("粗利報告書").Range("D3").Copy ws02.Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues ・ ・ ・ この場合、受注書シートが空白の場合、 受注履歴シートも空白になると思うのですが、 次回、履歴を書き込む時に空白を詰めて(最終行に) 入力してしまう事を避けたいです。 空白は残しつつ、一受注を同じ列に入力する為には、 どうしたら良いでしょうか?

  • EXCEL VBAで、PasteSpecialと Destinationの組み合わせ方法?

    ここで教えていただいたマクロで ActiveSheet.Paste Destination:=Workbooks(\"book1.xls\").Worksheets(\"Sheet1\").Range(\"A1\") のペースト部分を書式を除きたいので PasteSpecial Paste:=xlFormulas でやりたいのですが、どう組み合わせたらいいのかわかりませんでした。 おしえていただけませんでしょうか?

  • Excelの複数シートからcsvファイルを出力

    Dim objXL Dim f Dim m Dim ws Set objXL=CreateObject("Excel.Application") 'objXL.Visible=True objXL.DisplayAlerts=False For Each f In WScript.Arguments objXL.WorkBooks.Open f For Each ws In objXL.ActiveWorkBook.Worksheets If ws.UsedRange.Rows.Count=1 and ws.UsedRange.Columns.Count=1 and ws.Cells(1,1)="" Then 'MsgBox ws.Name&"Empty" Else ws.SaveAs f & "." & ws.Name & ".csv", 6 End If Next objXL.ActiveWorkBook.Close Next objXL.Quit WScript.Quit 上記スクリプトファイルで ファイル名が「[元Excelファイル名].[シート名].csv」 のcsvファイルが出力されますが、これを ファイル名を「[シート名].csv」にするには どのようにすればいいのでしょうか。 ws.SaveAs f & "." & ws.Name & ".csv", 6 の箇所を ws.SaveAs ws.Name & ".csv", 6 に変更したのですが、うまくいきませんでした。

  • 【VBA】複数のブックを1つのシートにまとめる

    あるフォルダ内に複数のブックが入っており、新しいブックに1シートでまとめようとしております。 フィルターを使用すればよいのかもしれませんが、マクロを使用したいです。 (1)全て同じフォーマットである (2)全てA17から数値が入力されているので、16行目まではフォーマットを残し、A17行目以降K列までをコピーして結合したい Sub 結合() '結合したいファイルがあるフォルダの場所 cドライブなら "C:\test\" Const Fol As String = "C:\test\" Dim Fn Dim NewFile As Workbook Dim Wb As Workbook Dim Ws1 As Worksheet Dim R As Range Set NewFile = Workbooks.Add Set Ws1 = NewFile.Worksheets(1) Set R = Ws1.Range("A17") Fn = Dir(Fol, vbNormal) Do Until Fn = "" Set Wb = Workbooks.Open(Fol & Fn) 'ワークシート1をコピーする場合は Wb.Worksheets(1) Set Ws1 = Wb.Worksheets(1) 'タイトル行を設定 If ck = False Then For cnt = 1 To 4 Wb.Worksheets(cnt).Range("A1:J16").Copy Destination:=NewFile.Worksheets(cnt).Range("A1") Next cnt ck = True End If For cnt = 1 To 4 Set Ws1 = NewFile.Worksheets(cnt) Set Ws2 = Wb.Worksheets(cnt) R = Ws1.Cells(Rows.Count, 1).End(xlUp).Row + 1 With Ws2 End With Next 'A17行目からコピーして結合する(→本当はA17行目~K列までを反映したい) Ws2.Range("A17", Ws2.Cells(Rows.Count, 3).End(xlUp)).Resize(, 20).Copy R If R.Offset(1).Value = "" Then Set R = R.Offset(1) Else Set R = R.End(xlDown).Offset(1) End If Wb.Close 'Debug.Print Fn Fn = Dir Loop Set R = Nothing Set Ws1 = Nothing: Set Ws2 = Nothing Set Wb = Nothing: Set NewFile = Nothing End Sub マクロは触ったことない初心者でグーグル検索をしながら作ってみました。 一応実行するとエラーは出ないのですが、結合されたリストが飛び飛びで、理由がわかりません。 どなたかおわかりになりますでしょうか・・・。

  • .copy で値だけの貼付け方法を教えてください

    セル結合してある備考欄の値を、別のブックのセルに貼り付けます。 貼り付けるブックのセルには罫線があるので、これを消さずに、値だけ貼り付けたいです。 Workbooks(MyFName).Worksheets("部品表").Range("P" & j + 5).Copy Workbooks(MyFName2).Worksheets("PartsList").Range("M" & k + 1) とすると、罫線が消えてしまうので おしりに .PasteSpecial Paste:=xlValues を付けてみましたら、赤く反転しエラーになってしまいました。 どうしたら、.copyで値のコピー貼付けができますか どうかご指導ください

  • VBAでどうしてもコーディングができず、ヒントをもらえたらうれしいです

    VBAでどうしてもコーディングができず、ヒントをもらえたらうれしいです。 (VBA超初心者で、ネットのエクセルVBAなどを参考にしているのですが、なかなかわからず。。。) 【csvファイルを指定して、1行目から7行目までを削除する】というプログラムがくみたいです。 Sub TQT() Dim PathName As String Dim FileNam As String Dim xlAPP As Application Dim ABC As Workbook Application.DisplayAlerts = False Set xlAPP = Application PathName = xlAPP.GetOpenFilename("CSV形式ファイル(*.csv;),*.csv;", 1, "開きたいファイルを指定してください。") Set ABC = ThisWorkbook FileNam = Dir(PathName) Set ABC = Workbooks.Open(PathName) ABC.Activate Workbooks.Open FileNam = PathName '行を削除 activeWorkbooks(ABC).worksheets("sheet1").Row("1:7").delete ←※ MsgBox "done" End Sub ※のところでデバッグが止まってしまいます。 activeworkbookの書き方が間違っているのか、 そもそもそれ以前に間違いがあるのか、 わかる方がいたら教えてください。 ※の行を色々アレンジしてみたのですが、うまくいきません。 よろしくお願い致します。(excel2003)