[[20080705202129]] 『ファイルを指定した順に処理』(もん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ファイルを指定した順に処理』(もん)

エクセルマクロで
@ファイルを開くダイアログボックスで複数ファイルを選択
Aひとつずつファイルを開く→データをコピー→閉じる
と処理を行っているのですが、
選択した複数ファイルをファイル名の昇順で処理をしていきたいのですが、
そのようなことは可能でしょうか。
教えてください。


 取得したファイル名をどこかのセルに書き込んで並べ替えしてから処理するか、
 配列に入れて並べ替えをして・・・。
 ではないかな?
 (元夏バテ)

元夏バテさんありがとうございます。
このようにファイルを開くコードを作成しているのですが、
どこで並び替えをするのかずっと考えているのですがわかりません。
初心者で申し訳ありませんが、
少し詳しく教えてください。
お願いします。

Dim Fname As Variant

    Dim x As Variant
    Fname = Application.GetOpenFilename(MultiSelect:=True)
    If VarType(Fname) = vbBoolean Then
        Exit Sub
    Else
        For Each x In Fname
            Workbooks.Open Filename:=x
        Next
    End If


 元夏バテは、今夏バテとうつ状態のためコードを考えるのは、ちょいダウン状態です。

 >どこで並び替えをするのかずっと考えているのですがわかりません。
 やりたい事は、
 >選択した複数ファイルをファイル名の昇順で処理をしていきたい
 なのですから、複数のファイル名を取得してから1番目を開くまでの間に、処理の追加をすればいいと
 思いますよ。

 >   If VarType(Fname) = vbBoolean Then
 >       Exit Sub
 >   Else
 >       For Each x In Fname
 >           Workbooks.Open Filename:=x
 >       Next
 >   End If
 どうせExit Subするなら
    If VarType(Fname) = vbBoolean Then
        Exit Sub
    End If
 ' ここで並べ替えの処理(セルに書き出して並べ替えて上から順に開くファイル名とする。とか)
 ' 以下開いて〜コピー〜閉じるの処理

 で良いのではないかと思います。
 私はどちらかというと単独ファイルばかり扱ってきたので、GetOpenFilenameとか使った事ないんです。
 余り参考にならずすいません。
 (元夏バテ)


 配列のソートに関しては「VBA combsort」でぐぐれば良いかも。
 (通りすがり)


 ファイル選択を行う程度の個数のソートなら、Excelが持っているソートで十分だと思いますけどね!!
 (もっとも、他にもっと大量データのソートも行う予定なら、別ですが、Excelのソートでも結構速いですよ)

 '==============================================================================
 Sub main()
    Dim fnmarray As Variant
    Dim fcnt As Long
    Dim fnm As String
    Dim g0 As Long
    fnmarray = Application.GetOpenFilename(, , , , True)
    If TypeName(fnmarray) = "Variant()" Then
       fcnt = UBound(fnmarray)
       With Range("a1:a" & fcnt)
          .Value = _
            Application.Transpose(fnmarray)
          .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo
          Application.EnableEvents = False
          For g0 = 1 To fcnt
             fnm = .Cells(g0)
             With Workbooks.Open(fnm)
                MsgBox fnm & " 開きました"
                '処理
                .Close False
                End With
             DoEvents
             Next
          Application.EnableEvents = true
          .ClearContents
          End With
       End If
 End Sub

 この場合、Exit Subは要らないですよね?
 プロシジャーって 入り口も出口も一つの方がメンテはしやすいですよ!!
 (新規作成時は、これ使うと楽ですけどね)

 ichinose

 VBAによるクイックソートよりもダミーシートを使ってでもExcelのソートを利用する
 方が処理速度は上がります。
 データ量が多くなるほどその差は顕著になりまんなぁ。
       (弥太郎) 


みなさん返信本当にありがとうございます。
明日までに考えなくてはいけなかったので本当に助かりました。
並び替えをするのに配列内のファイル数を数えなくてはと思い試行錯誤していたのですが、
Uboundで上限を調べればよかったんですね。
これで明日は大丈夫そうです!
本当にありがとうございました!!!


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.