「StiLL」 デザイン情報190 StiLLコマンド--指定したフォルダ配下のすべてのサブフォルダ名を取得する
                             
  【テーマ】 特定のフォルダにある全階層のフォルダ名を一括で取得したいときってありませんか?今回その考え方をご紹介します。     【方法】「指定出力位置に指定フォルダ内の全ファイル名を抽出(BtPasteFileName)」セルリンクボタンを繰返し使う方法で最下層までの全サブフォルダ名を取得します。     【参考】本処理では階層順に検索してフォルダ名を表示します。この処理で作成されたフォルダ名リストをデータ読込などの処理に活用できます。  
  対応Ver. :StiLL-XV1.0 以降
対応種類:StiLL Dev・Pro
    対応Ver. :StiLL-XV1.0 以降
対応種類:StiLL Dev・Pro
    対応Ver. :StiLL-XV1.0 以降
対応種類:StiLL Dev・Pro
 
                             
■ 今回の内容                          
「指定出力位置に指定フォルダ内の全ファイル名を抽出(BtPasteFileName)」セルリンクボタンを使った全サブフォルダ名の取得を行う
処理をご紹介します。
全体のイメージ
図の黄色部に親フォルダ名を入力して「@ボタン連続実行」をクリックすると下図のWORKTシートに全サブフォルダ名が出力されます。
結果表示
今回の処理ではWORKTシートのセルF4からフォルダ名を表示します。
またセルE4には指定入力された親フォルダ名を表示します。
フォルダ名出力イメージ(パス名でソートした結果を表示しています)
プログラムはモジュール@からモジュールBまでの3層で構成されています。
モジュール@は開始処理として初期値設定等を行います。
モジュールAは指定された親フォルダ配下のサブフォルダ名を取得してその結果をリストに設定またサブフォルダが無い場合の処理を行います。
モジュールBは全てのサブフォルダを取得するまでモジュールAを繰返し実行します。
■ ボタンの説明                        
全体図をみるとボタンが多く複雑に見えますが、今回の処理で一番中核となるのがモジュールAの処理です。
基本的な処理の考え方は、指定されたフォルダ配下のサブフォルダを読み取り、そのサブフォルダまでを全体のパスとして更にその下の
サブフォルダを読み取ります。モジュールBでこの処理を繰返します。
モジュール@(初期設定処理):図の@B
@ セルリンクボタン「定義範囲名を削除(BtNameDelete)」でこの処理で定義する範囲名(FList)を初期化します。
A セルリンクボタン「セルに値をセットする(BtSetValue)」で処理で使うカウンタをに初期値0を設定します。 ・・・ Pシート2のI58が対象。
B セルリンクボタン「指定セルの内容を削除(BtCellClear)」でこれからリストを作成する範囲をクリアします。
   ・削除範囲を今回使用するE列とF列の1000行目までを目安として指定しています。
モジュールA(フォルダ名採取&リスト設定処理):図のCF
C セルリンクボタン「指定出力位置に指定フォルダ内の全ファイル名を抽出(BtPasteFileName)」でセルD51のフォルダ名で
   サブフォルダを取得します。
   セルD18(指定フォルダ名)には直接パスを入力します。
   セルD51(フォルダ名)には以下の式が入力されています。
    =D18&INDEX(WORKT!F:F,$I$58+3)  ・・・ 指定フォルダ名とサブフォルダ名を連結して全体のパスを構成します。
   ・出力位置には以下の式が入力されています。
    =IFERROR(ADDRESS(ROW(FList)+ROWS(FList),COLUMN(FList),4,1,$J$4),
     ADDRESS(ROW(WORKT!E4),COLUMN(WORKT!E4),4,1,$J$4)) ・・・ FListが定義される前はWORKT!E4とします。
   ・フォルダ名には文字数が多くなる可能性を見込み|Pシート2!D51|と指定してセルD51を参照しています。
   ・ファイル種類はFOLDER:を設定しています。
   ・出力範囲名をFListで再定義して出力した結果のセル位置を取得するのに利用します。
D セルリンクボタン「指定ボタンを条件に応じて押す(BtPushIf)」で取得したフォルダ名の有無により処理を分岐します。
   フォルダ名の有無はセルI38の式の結果で判断します。
   セルI38(フォルダ設定判定)には以下の式が入力されています
    =IFERROR(IF(INDEX(FList,1)="",0,1),0) ・・・ 出力した範囲の1行目が空白の場合はサブフォルダが無いと判断。
   ・ボタン名,シート名 or シート位置はPシート2のI38を参照します。
   ・ボタン,シート,条件1,オプションの1行目はI38=1のときに実行させるボタン名(E BTN11_03)を設定しています。
   ・ボタン,シート,条件1,オプションの2行目はI38が1以外のときに実行させるボタン名(F BTN11_04)を設定しています。
E セルリンクボタン「セルに値をセットする(BtSetValue)」で取得したサブフォルダ名を上位のフォルダ名と結合させリストに設定します。
   ・対象範囲には以下の式が入力されています。
    =IFERROR(ADDRESS(ROW(FList),COLUMN(WORKT!F4),4,1,$J$4)&":"&
     ADDRESS(ROW(FList)+ROWS(FList)-1,COLUMN(WORKT!F4),4,1),"") ・・・ 取得したサブフォルダ名の範囲。
   ・セット値には以下の式が入力されています。
    ==INDEX(WORKT!F:F,Pシート2!$I$58+3)&"\"&INDEX(WORKT!E:E,ROW())
     ※このボタンで先に読み出した上位のパスと今回読み出した範囲の個々のサブフォルダ名とを連結してリストに設定しています。
F セルリンクボタン「指定範囲に名前を定義(BtOffsetName)」でサブフォルダが無いときの措置を行います。
   具体的には空白で作成されたFListの範囲を1行上に修正を施します。
   ・範囲には以下の式が入力されています。
   =IFERROR(ADDRESS(ROW(FList)-1,COLUMN(FList),4,1,$J$4),"")
   範囲以外は1とFListの固定値で設定しています。
モジュールB(繰返し処理:処理行数=カウントUP):図のGH
G セルリンクボタン「指定シートの指定ボタンを押す(BtPush)」でセルD58を参照しカウントアップと実行制御を行います。
   セルD58(繰返し判定)には以下の式が入力されています。
   =IF(OR($I$58>$S$58-3,$I$58>300),0,1) ・・・ 取得したリスト行数を超えるか300行まで繰り返す。
(再帰呼び出しを行っているため繰返しを300回に制限しています)
   またセルS58(処理行数)には以下の式が入力されています。
   =IFERROR(ROW(FList)+ROWS(FList)-1,0) ・・・ 現在の取得リストの最終行。
  ・ボタン名,シート名の1行目には以下の式が入力されています。
   =IF($D$58=1,E35,"") ・・・ ボタン名(Aボタン連続実行 BTN11)を設定しています。
  ・ボタン名,シート名の2行目には以下の式が入力されています。
   =IF($D$58=1,H71,"") ・・・ ボタン名(H BTN12_02)を設定しています。
  ・ボタン名,シート名の5行目には以下の式が入力されています。
   =IF($D$58=1,E55,"") ・・・ ボタン名(Bボタン連続実行 BTN12)を設定しています。 ・・・ 再帰呼び出し。
H セルリンクボタン「入力範囲の値を出力範囲にセットする(BtSetMultiCell)」でセルM58をコピーしてカウンタを加算します。
   セルI58はモジュール@のボタン番号Aで1がセットされます。
   セルM58には以下の式が入力されています。
   =I58+1 ・・・ 1つカウントアップ。
  ・入力範囲1にはPシート2!M58を設定しています。
  ・出力範囲1にはPシート2!I58を設定しています。
なお各モジュールの先頭にある「ボタン連続実行(BtPush)」ボタンは以下の通り設定されています。
【@ボタン連続実行】(初期設定処理:BTN10)
  1.画面表示停止(STILLDISPOFF)
  2.@(リスト範囲名の削除:BTN10_01)
  3.A(カウント初期化:BTN10_02)
  4.B(リスト範囲の初期化:BTN10_03)
  5.【Aボタン連続実行】(フォルダ名採取&リスト設定処理:BTN11)
  6.H(フォルダ読込行(カウント)設定:BTN12_02)
  7.【Bボタン連続実行】(繰返し処理:処理行数=カウントUP):BTN12)
【Aボタン連続実行】(フォルダ名採取&リスト設定処理:BTN11)
  1.C(フォルダ名出力:BTN11_01)
  2.D(下位フォルダの確認:BTN11_02)
【Bボタン連続実行】(繰返し処理:処理行数=カウントUP):BTN12)
  1.G(フォルダ名採取&リスト設定処理:BTN12_01)
■ ご参考までに                        
1.本処理では階層順に検索してフォルダ名を表示します。
   上図の出力イメージのようにフォルダ名のパス順に表示する場合は最後に(BtSort)で出力リスト範囲をソートしてください。
(各ボタンの設定内容の詳細はStiLLヘルプをご確認ください)  
Copyright(C) アイエルアイ総合研究所 無断転載を禁じます