Sub setFILELIST(strFNBOX() As String, _
strFolder As String, strPattern As String)
Dim strFileName As String 'ファイル名
Dim n As Integer '配列の要素数
n = 1 '初期化
ReDim strFNBOX(n) '配列の数を動的に変える
'最初のファイル名を取る
strFNBOX(n) = Dir(strFolder & "\" & strPattern, vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
Do While strFNBOX(n) <> "" ' ループを開始します。
n = n + 1 ' カウントアップする
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
strFNBOX(n) = Dir ' 次のファイル名を返します。
Loop
End Sub
見なれない書き方ですが、まず配列を受け取ってます。
Sub setFILELIST(strFNBOX() As String, _
strFolder As String, strPattern As String)
strFNBOX()と数を指定しない受け取り方です
*ファイル名がいくつになるか不明なので。
次のポイントが
ReDim strFNBOX(n)
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
です、これは、普通はDim A(10)など配列の数を指定するのですが、
動的に好きな数に配列のサイズを取ります。
Preserveのキーワードは、前のデータを残してサイズを拡張する、
^^^^^^^^
今回のような処理の時に使います。
※サイズを増やしながらデータを追加していくイメージなので、
サイズ変更前のデータを残しながら処理してます。
Do While strFNBOX(n) <> "" ' ループを開始します。
n = n + 1 ' カウントアップする
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
strFNBOX(n) = Dir ' 次のファイル名を返します。
Loop
と、配列を拡張しながらファイル名をセットします。
分割した表示部は、
'フォルダー名とファイル名配列を受け取り、シートを新規作成
Sub make_data(strFolder As String, strFN() As String)
Dim nYLine As Integer '行カウンタ
Workbooks.Add '新しいブックを追加
For nYLine = 1 To UBound(strFN) 'ファイル名をセットする
Cells(nYLine, 1) = strFolder & "\" & strFN(nYLine)
Next nYLine
End Sub
と、フォルダー名、ファイル名の配列を受けとって、
新規ブックにファイル名を書き込んでます。
ここで、おっ?と思うのは、
For nYLine = 1 To UBound(strFN) 'ファイル名をセットする
Cells(nYLine, 1) = strFolder & "\" & strFN(nYLine)
Next nYLine
の部分の、UBound(strFN)です。
UBoundに配列を渡すと、インデックス番号の最大値を返してくれるので、
これを利用してループを作ってます。
よく、文字列分割の関数
Split関数と組み合わせてUBound関数を使ったりしてます
http://www.ken3.org/cgi-bin/test/test024-2.asp
ポイントは、実行時に配列の要素数が変化しているので、
その最大値をもらって、処理してます。
メインルーチンは、
Sub Main()
Dim strFolder As String '選択されたフォルダーを格納
Dim strBOX() As String 'ファイル名格納用変数
'フォルダーを選択させる
strFolder = getFOLDER() 'フォルダーの選択関数を呼ぶ
'キャンセルだったら処理を抜ける
If strFolder = "キャンセル" Then
Exit Sub
End If
'選択されたフォルダーを表示関数に渡し表示する
Call setFILELIST(strBOX(), strFolder, "*.*") 'データのセット
'新規のシートにデータをセットする
Call make_data(strFolder, strBOX())
End Sub
と修正しました。
ポイントは、
Dim strBOX() As String 'ファイル名格納用変数
配列のサイズを指定しない定義方法、
と
Call setFILELIST(strBOX(), strFolder, "*.*") 'データのセット
Call make_data(strFolder, strBOX())
の関数の呼び方です。
配列変数に一度ファイル名を全て保存します
で、その配列からシートにデータをセットしてます。
一回配列に保管するのがムダな場合もあるが、
機能が分かれていると、
Call setFILELIST(strBOX(), strFolder, "*.CSV") 'データのセット
でCSVのファイル名を取得、
For n = 1 To UBound(strFN) 'ファイルをインポート
strIN = strFolder & "\" & strFN(nYLine)
strINを使用してインポート
Next nYLine
なんて少し変更した処理も比較的簡単に作成することができます。
シンプルな汎用性のある共通関数作りにもチャレンジしてみてください。