複数選択フォルダの配列への格納

このQ&Aのポイント
  • 複数選択でのファイルの配列取り込みは下記でおこなえましたが、tmp = Application.GetOpenFilename(, , "処理したいファイルを複数選択してください", , True) For Z = LBound(tmp) To UBound(tmp) 同じような感じの事をフォルダでしたいのですが・・・
  • 具体的には複数選択したフォルダ(年月の名前が付いたフォルダ)が複数個あり、そのフォルダ内に約700個づつファイルがあります。フォルダは年月の名前が付くフォルダなので1年分だと12フォルダ、2年分だと24フォルダになり名前も変わります(201403、201404、201405、・・・・)。ファイルはフォルダの1分毎のデータになりますので名前が変わり、数も多いです。1フォルダ分(1ヶ月なら24時間×28~31日でだいたい700ファイルくらい)なので過去分も含めると月数が増えると手ではちょっとキツイです。
  • 対象Folders = 複数選択したフォルダの配列 For Z = LBound(対象Folders) To UBound(対象Folders)  対象files = 複数選択したファルダ内のファイルの配列      For Y = LBound(対象files) To UBound(対象files)        ファイルを開いてデータ収集      Next Next 上記のようなイメージの処理をしたいのですが、ご存知の方ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

複数選択フォルダの配列への格納

複数選択でのファイルの配列取り込みは下記でおこなえましたが、 tmp = Application.GetOpenFilename(, , "処理したいファイルを複数選択してください", , True) For Z = LBound(tmp) To UBound(tmp) 同じような感じの事をフォルダでしたいのですが・・・ ネットや本を探してみましたが、見当たりません・・・ 具体的には複数選択したフォルダ(年月の名前が付いたフォルダ)が複数個あり そのフォルダ内に約700個づつファイルがります フォルダは年月の名前が付くフォルダなので1年分だと12フォルダ、2年分だと24フォルダになり名前も変わります(201403、201404、201405、・・・・) ファイルはフォルダの1分毎のデータになりますので名前が変わり、数も多いです。1フォルダ分(1ヶ月なら24時間×28~31日でだいたい700ファイルくらい)なので過去分も含めると月数が増えると手ではちょっとキツイです。 3か月分を処理するとして フォルダ201403、201404、201405を複数選択し  フォルダ201403の  ファイル201403010001→201403010002→201403010003・・・ 201403312359  フォルダ201404の  ファイル201404010001→201404010002→201404010003・・・201404302359  フォルダ201405の  ファイル201405010001→201405010002→201405010003・・・201405312359 まで順次ファイルを開いてセルのデータを1ヶ月分毎に収集したいのですが 月数が増えると手ではちょっとキツイので複数フォルダを選択するとフォルダとファイルを配列に取り込み 対象Folders = 複数選択したフォルダの配列 For Z = LBound(対象Folders) To UBound(対象Folders)     対象files = 複数選択したファルダ内のファイルの配列      For Y = LBound(対象files) To UBound(対象files)           ファイルを開いてデータ収集      Next Next 上記のようなイメージの処理をしたいのですが ご存知の方ご教示いただけると幸いです。 よろしくお願いいたします。 OSはWindows7、エクセルは2010です。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> 具体的には複数選択したフォルダ(年月の名前が付いたフォルダ)が複数個あり (中略) > フォルダは年月の名前が付くフォルダなので1年分だと12フォルダ、2年分だと24フォルダになり名前も変わります(201403、201404、201405、・・・・) んーと、それだけ規則的にフォルダ名とファイル名がつけられているならば、複数フォルダの選択じゃなく > 年月の名前が付くフォルダ があるフォルダの選択(だけしか行わない)ボタンと処理年月区間の入力、それに処理実行ボタンを持つUIを作った方が楽なんじゃないかなと思いますが。 それなら、 For Z = LBound(処理年月区間) To UBound(処理年月区間)     対象フォルダ名 = 選択したフォルダ \ z の年月を文字列変換したもの     対象files = 対象フォルダ内のファイルの配列      For Y = LBound(対象files) To UBound(対象files)           ファイルを開いてデータ収集      Next Next というイメージでできると思いますが。

tomomaki
質問者

お礼

ご回答本当にありがとうございます。 フォルダ名は規則正しいですが、歯抜けで選択することもあり複数選択対象だけを配列に取り込みたいのと、他の作業でも使用したいので、方法はないのでしょうか? 大変お忙しいところお手数ですが、可能ならご教示お願いいたします。

その他の回答 (1)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

フォルダーを一括で指定することは難しかったと思います。多分普通はできません。 行いことがほぼ分かったので、モジュールを書いてみました。 ○フォルダーの指定は最初の年月と最後の年月から計算しています。  年月の取り込みは検討してください。今はモジュール内に書いています。  また、フォルダーのパスも書いています。変更してください。 ○連続の年月指定でなく任意の年月指定の場合はフォルダーを一つずつ選択しシートに書いたり、シートに記入した年月を処理すればこのモジュールで対応できると思います。 ○ファイルの処理はDirを使って順次処理しています(ファイル名を出力しているだけです)。  ファイル名を配列に格納とかはしていません。 シートのコードウィンドウです。これはコマンドボタンで動かしています。 Private Sub CommandButton1_Click()   Dim strPath As String     'フォルダーパス     strPath = "L:\999_Test\" 'フォルダー名をセット      Dim fromYear As Integer, fromMonth As Integer '開始年月   Dim toYear As Integer, toMonth As Integer   '終了年月   Dim ym As Integer               '月カウンタ   Dim Folder As String             '個別フォルダー     fromYear = 2014: fromMonth = 3     toYear = 2014: toMonth = 5        Dim fileName As String   'ファイル名      '最初から月を進める   For ym = 0 To toYear * 12 + toMonth - (fromYear * 12 + fromMonth)     Folder = Format(DateSerial(fromYear, fromMonth + ym, 1), "yyyymm")     'ファイルを開く     fileName = Dir(strPath & Folder & "\" & "*.*")     While fileName <> ""              MsgBox fileName 'ここが実際の処理              fileName = Dir     Wend   Next End Sub

tomomaki
質問者

お礼

お忙しいところ本当にありがとうございます!! 特定のフォルダを指定してそのフォルダ内のサブフォルダのファイルを順次処理していくこととしました!!

関連するQ&A

  • ダイアログボックスで複数フォルダの複数ファイルの選択

    ダイアログボックスで複数フォルダの複数ファイルの選択がうまくいきません。 単一フォルダ内からの複数ファイルの選択は機能しているのですが、ダイアログボックスで他のフォルダを選択して他のファイルを選択すると最終的に選択したファイルのみが残り、先に選択した分が累積されません。  OpenFileNameが上書きされるのが原因な気がするのですが配列への累積処理が解りません。 その後の処理で選択したファイルを全て開いて加工したいので、累積させる方法を知りたいのです。下記コードはLoop処理で行おうとして累積が解らないままのものです。 一度のダイアログ表示で複数フォルダの複数ファイルを選択出来る方法があればそれでもかまいません。どなたか助けては頂けないでしょうか。お願いします。 '**明細の選択(複数同時)** Do BN = Application.InputBox("対象明細書の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2) If BN = False Then '入力なければ GoTo OWARI End If WorkPath = ThisWorkbook.Path & "\明細書一覧" & BN & "月" ChDrive WorkPath ChDir WorkPath OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _ Title:="対象の明細書を選んで下さい。Ctrlキーを押しながら複数ファイルを同時に選択出来ます。", MultiSelect:=True) Rtn = MsgBox("他にも対象ファイルがありますか?", vbYesNo, "選択") If Rtn = vbNo Then Exit Do End If Loop Mypath = ThisWorkbook.Path MyFile = "\請求制御.xls" 'ここにファイル名記入 If IsArray(OpenFileName) Then For i = 1 To UBound(OpenFileName) If OpenFileName(i) = Mypath & MyFile Then MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません" GoTo OWARI End If tmp = tmp & Dir(OpenFileName(i)) & vbCrLf Next MsgBox vbCrLf & tmp & vbCrLf & "の全" & i - 1 & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • 変数を配列に格納する時に、二つの条件を指定すること

    変数を配列に格納する時に、二つの条件を指定することはできますか? VBAです。 Private Sub test() Dim i As Long Dim Str As String Dim tmp As Variant Str = "a,i,u-e-o" tmp = Split(Str, ",") '配列に格納する For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub の場合、結果が a i u-e-o になってしまいます。 tmp = Split(Str, "," or "-") のようなことをして a i u e o と表示させたいです。 "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。ご教授よろしくお願いします。

  • 配列について。

    Redim した後   For i LBound(配列) To UBound(配列)    作業   Next i をしているのですが、配列の要素数を別プロセスで 計算させる場合、必ずしも要素が存在するとはかぎ りません。 その場合エラーがでるわけですが、このように配列 の中身が存在しない場合はどのように回避できるの でしょうか? VB6&Windows2000です。

  • スキャンファイル格納場所を複数フォルダから選択

    でスキャンファイルを格納するフォルダーを複数のパソコンから選択できるようにする方法についての質問です。 現在メインのデスクトップPC以外にノートブックPCのスキャンフォルダにもスキャンファイルを取り込みたいと思っています。本体のスキャンボタンを押してフォルダを選択する画面で家庭内LANに繋がるPCの複数の登録から該当フォルダーを選択できるようにはできないのでしょうか? ※OKWaveより補足:「ブラザー製品」についての質問です。

  • 複数のフォルダ名を修正するには??

    まめファイル4では、フォルダを複数選択して名前の編集をすると次の編集画面にうつりますが、まめファイル5にしてから、フォルダ名を複数選択しても最初のフォルダしか名前の編集が出来ません。 どうしたら、よろしいのでしょうか?

  • このフォルダを削除してもいいでしょうか?

    (名前)tmp***.tmp (フォルダ名)C\Program File\Common Files\Symantec Shared\VirusDefs こんな感じのフォルダがたくさんあるのですが、 削除してもいいのでしょうか?

  • フォルダ内の複数ファイル同時選択について

    ファイルの移動、コピーや削除をする際に「Ctrl」+左クリックで複数のファイルを選択していましたが何かの拍子で設定を変えてしまったみたいで同時に複数のファイルを選択できなくなってしまいました。 フォルダオプション等をいじってでいろいろ試してみましたがどうにもなりません。 設定の直し方御存知の方、ご教授願います

  • VBS 複数ファイル複数行を配列格納

    ある配下のCSVファイル2個(固定)を読み込み、 コンピュータ名の列が同じ行を比較するというツールを作っています。 考えた結果以下まではできましたが、どうしても指定行を配列に埋め込み処理ができません。 比較方法はわかります。 ですが以下のプログラムでは、CSVの行は複数行あるので最終行しか格納されません。 どのようにしたら、2つのCSVファイルそしてすべての行を配列に入れ込むことができるのでしょうか。 For Each FileName In src.Files FileEx = fso.GetExtensionName(FileName) If LCase(FileEx) = "csv" Then Set CsvFile = fso.OpenTextFile(FileName) Do Until CsvFile.AtEndOfStream tmpLine = CsvFile.ReadLine If roopCnt = 0 Then '1個目のCSV ArrayA = Split(tmpLine,",") Else '2個目のCSV ArrayB = Split(tmpLine,",") End rowCnt = rowCnt +1 Loop roopCnt = 1 End If Next

  • VBの配列 IsNull, IsNuthing, ...? 用途がわかりません。

    以下の場合、(1)で範囲エラーとなります。 redim a(0)とすると、a配列に1個データがあるということで、for文が実行されますが。 Redimしないまま(データが無い意味としたいので)で、このFor文をパスするには、どのように記述すればよいのでしょうか? dim a() as string '----->(2) for i=LBound(a) to UBound(a) '---->(1) msgbox(a(i)) next i