【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フォルダー内のファイル一覧
ファイルというフォルダーの中には、
「データaのtxtファイル」があって、「データAのBookファイル」があって・・・
という感じで調べて、作成していくと思います。
ファイル数が少ない場合はこれでよいですが、ファイル数が多いと大変です。(涙)
このような作業をVBAで行うと簡単に出来ますのでその方法について説明致します。
フォルダー内のファイル名を全て取得するするには、下記メソッドが必要です。
Set FSO = New FileSystemObject
FileSystemObjectは、フォルダー・ファイル等を操作する時に必要としているオブジェクトです。
セットするのはオブジェクト変数です。そのため、変数は、「Dim FSO As Object」と宣言しています。
Set TARGET = FSO.GetFolder(フォルダーのパス).Files
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 フォルダー内のファイル
「Accessのファイル」「Excelのファイル」「Power Pointのファイル」等、いろいろ格納されています。
このフォルダー内のファイル名を全て取得するサンプルコードは以下になります。
サンプルコード
Sub test25()
Dim i As Integer
Dim FILE_PATH As String
Dim FSO As Object
Dim TARGET As Files
Dim TEMP As Object
FILE_PATH = "C:\VBA\ファイル"
'ヘッダーの作成
Cells(1, 1) = FILE_PATH & "内にあるファイル一覧"
'3行目からファイル名を記載します。
i = 3
Set FSO = New FileSystemObject
Set TARGET = FSO.GetFolder(FILE_PATH).Files
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列の幅自動調整です。
今回の処理に関係しているところではありません。
見易さをよくするために行っています。
フォルダー内の全てのファイル名を取得するために上記、サンプルコードを実行すると以下のようなエラーになる場合があります。
図4 実行後のエラー
VBA内の詳細設定を確認または、設定が必要になります。
下記のようにVBE画面で「ツール」→「詳細設定」を選択する。
図5 詳細設定画面を表示させる方法
↓
図6 詳細設定画面
上記のように詳細設定画面が表示されるので
「Microsoft Scripting Runtime」がチェックされているか確認します。
チェックされていない場合は選択する必要があります。
下記のようにありますのでれレ点をチェックして、「OK」を押す
図7 詳細設定画面-Runtimeを選択
詳細設定画面が閉じられますので、
図5の「詳細設定画面を表示させる方法」 をもう一度する。
そうすると
図8 詳細設定画面-Runtime選択後
「Microsoft Scripting Runtime」がチェックされていることが確認できます。
これで詳細の設定は完了です。
フォルダー内のファイル名を全て取得できるか、上記のサンプルコードを使用して実行をして確認します。
まず、処理を開始する前のブックは以下のように何も記載していません。
図9 処理開始前のブック
そして、今回処理を行うフォルダは、「C:\VBA\ファイル」とします。
フォルダー内には、以下のようはファイルが投稿されています。
図10 処理を行うフォルダー内のファイル
それでは、サンプルコードを実行します。実行した結果が以下になります。
図11 実行結果
ファイル名がきちんと記載されています。
これにより、フォルダー内のファイル名を全て取得することが出来ました。
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート