【Excel VBA】If Elseとは違う条件式(Select Case)について
エンジニアのIMMRです。Excel VBAの条件式には、以前に説明したExcel VBA 条件式(If Else)とこれから説明するSelect Caseの二つあります。1.従来のIf Else条件式If Elseは条件に合った時は処理Aを、条件に合わなかったら処理Bを実行します。では、下記のようなデータがあり、複数の条件があるとします。If Elseを使用して作成すると2種類の方法が浮かぶと思
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
こんにちは。IMMRです。
フォルダー内にどんな名前のフォルダーがあるか、という資料を作成されたご経験はあると思います。
例えば、こんな感じです。 ※取得するのはフォルダー名のみです。テキスト等が同じフォルダー内に存在しても対象としません。
図1 -1 フォルダー内のフォルダー
図1 -2 フォルダー内のファイル一覧
フォルダーという名のフォルダーの中には、
「AAA」というフォルダー、「BBB」というフォルダーがあって・・・
という感じで調べて、作成していくと思います。
フォルダー数が少ない場合はこれでよいですが、フォルダー数が多いと大変です。(涙)
このような作業をVBAで行うと簡単に出来ますのでその方法について説明致します。
ここでは、「フォルダー内のフォルダー名を取得する」ことを説明しますが
フォルダー名ではなく、ファイル名を取得する記事も下記にて公開しています。
フォルダー内のファイル名を全て取得するするには、下記メソッドが必要です。
Set FSO = CreateObject("Scripting.FileSystemObject")
Scripting.FileSystemObjectは、フォルダーに存在するサブファイルのコレクションです。
セットするのはオブジェクト変数です。そのため、変数は、「Dim FSO As Object」と宣言しています。
Set TARGET = FSO.GetFolder(フォルダーのパス
).SubFolders
GetFolderは、指定したフォルダー内のフォルダー情報を検索するオブジェクトです。
セットするのはファイル変数です。そのため、変数は、「Dim TARGET As Files」と宣言しています。
これにより、変数「TAGET」に指定フォルダー内のフォルダー情報(複数)が取得されます。
しかし、これでは、フォルダー内のフォルダー情報全てが「TAGET」内に格納されているだけです。
1つ1つのファイル名を取得するには、
「TAGET」内に格納されているフォルダー情報をひとつずつにしてから取得しなくてはいけません。
取得するにはEachメソッドを使用します。
For Each TEMP In TARGET
BOOK_NAME = TEMP.Name
Next
For Each TEMP In TARGET
先ほど取得したオブジェクト変数「TARGET」に格納されている全てのフォルダー情報から
1つずつ取り出して、TEMPに格納します。TEMPは「Dim TEMP As Object」で宣言しています。
BOOK_NAME = TEMP.Name
TEMPに格納されたファイル情報からフォルダー名をString変数に格納します。
そのため、「Dim BOOK_NAME As String」で宣言しています。
For Each TEMP In TARGET から Nextの間にある処理が繰り返し行われます。
つまり、フォルダー名「aaa, bbb, ccc」が格納されていた場合は
フォルダー名(aaa)を取得して、処理を行って。次にフォルダー名(bbb)を取得して、処理を行って。
フォルダー名(ccc)を取得して処理を行うことになります。
1の作業(フォルダー内のフォルダー名を全て取得する方法)では、
「全てのフォルダー情報をTARGETに格納」→「TARGETから1つずつのフォルダー情報取得」
→「1つのフォルダー情報からフォルダー名を取得」
ということをやってきました。
ここでは取得したフォルダー名をセルにセットしていきます。
取得方法は単準に変数BOOK_NAMEに格納したフォルダー名を =によって、cellにセットしていきます。
Cells(i, 2) = BOOK_NAME
iはカウンタとして使用するのでint形で宣言しています。
また、上記には記載していませんが「i = i + 1」も忘れないでください。
では、実際にフォルダー内のファイル名を全て取得する方法を行っていきます。
今回は、下記のフォルダ「C:\VBA」配下にあるフォルダー(ファイル)を使用します。
図2 フォルダー名を確認するためのフォルダー
図3 フォルダー内のフォルダー
複数のフォルダーが格納されています。フォルダー以外のテキストファイルがありますが
今回は、フォルダーが対象なので対象外とします。
このフォルダー内のフォルダー名を全て取得するサンプルコードは以下になります。
サンプルコード
Sub test27()
Dim i As Integer
Dim FILE_PATH As String
Dim FSO As Object
Dim TARGET As Object
Dim TEMP As Object
FILE_PATH = "C:\VBA\フォルダー"
'ヘッダーの作成
Cells(1, 1) = FILE_PATH & "内にあるフォルダ一覧"
'3行目からファイル名を記載します。
i = 3
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TARGET = FSO.GetFolder(FILE_PATH).SubFolders
For Each TEMP In TARGET
Cells(i, 1) = TEMP.Name
i = i + 1
Next
Columns("A:B").AutoFit
End Sub
ちなみにColumns("A:B").AutoFitで行っているのは、A列とBt列の幅自動調整です。
今回の処理に関係しているところではありません。
見易さをよくするために行っています。
フォルダー内の全てのフォルダー名を取得するためにはVBA内の詳細設定を確認または、設定が必要になります。
設定方法は、下記「フォルダー内のファイル名を取得する」の
「4.サンプルコードを実行してフォルダー内の全てのファイル名を取得する前に」をご参下さい。
フォルダー内のファイル名を全て取得できるか、上記のサンプルコードを使用して実行をして確認します。
まず、処理を開始する前のブックは以下のように何も記載していません。
図4 処理開始前のブック
そして、今回処理を行うフォルダは、「C:\VBA\フォルダー」とします。
フォルダー内には、以下のようはフォルダーが投稿されています。
図5 処理を行うフォルダー内のフォルダー
それでは、サンプルコードを実行します。実行した結果が以下になります。
図6 実行結果
フォルダー名のみがきちんと記載されています。
これにより、フォルダー内のフォルダー名を全て取得することが出来ました。
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート