VBAでフォルダ内のファイル名を取得する方法
- VBAを使用して、指定したパス内のExcelファイルのファイル名を取得する方法について教えてください。
- 初心者のため、Excel 2010でVBA(マクロ)を使用して、指定したパス内のExcelファイルのファイル名を取得する方法についてご教示ください。
- ディレクトリ内のExcelファイルのファイル名をVBAで取得する方法についてのコードの修正方法を教えてください。
- ベストアンサー
フォルダ内にあるファイル名を取得するVBA
エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 「マクロ」ファイルにある「実行」Sheetというにある「実行」ボタンで L2に入力したパス内にあるファイル(.xlsや.xlsmや.xlsbが混在しますが、基本的には全てエクセルファイル)のファイル名を K8から下へ取得したいのですが・・ 参考にしたコードでは うまく動作しませんでした。 以下では、L2のパスを参照するのも組めていないため、コード内に直接パスを書き込んでいますが 実際は、パスを変動させて使いたいので、L2を参照できるようになると助かります。 ※パスは、質問用に仮置きで「パス」としています。 Sub Sample() Dim buf As String, cnt As Long Const Path As String = "パス" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 8 Cells(cnt, 11) = buf buf = Dir() Loop End Sub また、このコードでは 実行ファイル自体のファイル名も取得してしまうようなので、 実行ファイル以外のファイル名を取得したいです。 ご指導のほど、よろしくお願い致します。
- Visual Basic
- 回答数5
- ありがとう数8
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
csvファイルもExcelファイルの一種だと考えてファイル名も取得する一方で、textファイルやpdfファイルは取得しない様にした方が宜しいのでしょうか? もしそれで宜しければ次の様なVBA(マクロ)になります。 Sub Sample() FolderPath = Cells(2, 12).Value buf = Dir(FolderPath & "\*.*") cnt = 7 Do While buf <> "" If buf Like "*.xls?" Or buf Like "*.csv" Then cnt = cnt + 1 Cells(cnt, 11) = buf End If buf = Dir() Loop End Sub
その他の回答 (4)
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答No.1、2です。 もし質問者様の仰る「実行ファイル」が、回答No.4様が仰っておられる様に >このマクロを実行している 自分自身のこと 即ち、「本件のマクロを実行しているファイル」の事だとしますと、「本件のマクロを実行しているファイル」がL2に入力されているパスのフォルダー内に保存されている場合には、 And buf <> ThisWorkbook.Name で除外する事が出来ます。 しかし、もし「本件のマクロを実行しているファイル」がL2に入力されているパスのフォルダー以外の場所に保存されている場合で、尚且つ、L2に入力されているパスのフォルダー内に偶々「『本件のマクロを実行しているファイル』と同名のファイル」が存在していた場合には、ファイル名だけで判定したのでは「『本件のマクロを実行しているファイル』と同名のファイル」のファイル名は取得する事が出来ませんので、もしそのフォルダー内にある「『本件のマクロを実行しているファイル』と同名のファイル」のファイル名は取得する必要がある場合には、もう一工夫する必要があります。 Sub Sample() Dim buf As String, cnt As Long, FolderPath As String FolderPath = Cells(2, 12).Value buf = Dir(FolderPath & "\*.*") cnt = 7 Do While buf <> "" If buf Like "*.xls?" Or buf Like "*.csv" And _ FolderPath & "\" & buf <> ThisWorkbook.Path & "\" & ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 11) = buf End If buf = Dir() Loop End Sub
お礼
なるほど。その通りですね。 まだまだ発想が追い付いておらず、すみません。 既に最初に頂いたご回答をベストアンサーとしてしまったため、 「ありがとう」しかできませんが・・・ 丁寧なご教示、感謝致します。ありがとうございました!
- superside0
- ベストアンサー率64% (452/700)
よこから失礼しました。 > 実行ファイルも同じパスにあるため、リストアップされてしまいます。 と言われている "実行ファイル" というのは *.exeファイルのことではなくて このマクロを実行している 自分自身のことでは ないかと 推測しました。
お礼
ありがとうございます!その通りです。 こちらの表現が悪かったようで・・・ 推測していただいて助かりました!!
- superside0
- ベストアンサー率64% (452/700)
自分自身のファイル名は、 ThisWorkbook.Name です なので、#1のご回答の If buf Like "*.xls?" Or buf Like "*.csv" Then を If (buf Like "*.xls?" Or buf Like "*.csv") And buf <> ThisWorkbook.Name Then にすれば、自分自身を除外することになります。
- kagakusuki
- ベストアンサー率51% (2610/5101)
>ご教示いただいたコードでは、実行ファイルも同じパスにあるため、リストアップされてしまいます。 実行ファイルとはexeファイルやcomファイル、binファイル等の 「コンピュータの外部記憶装置などに記録されるファイルで、メモリに読み込んで実行できる形式のプログラムファイル」 で、要するに 「そのファイルを開くだけで中のプログラムを実行出来るファイル」 の事ですよね? 【参考URL】 実行ファイルとは|実行形式|実行可能ファイル|ロードモジュール|実行可能プログラム - 意味 / 定義 / 解説 / 説明 : IT用語辞典 http://e-words.jp/w/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html コトバンク > ASCII.jpデジタル用語辞典 > 実行ファイルとは > パソコンで困ったときに開く本の解説 https://kotobank.jp/word/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-4248#E3.83.91.E3.82.BD.E3.82.B3.E3.83.B3.E3.81.A7.E5.9B.B0.E3.81.A3.E3.81.9F.E3.81.A8.E3.81.8D.E3.81.AB.E9.96.8B.E3.81.8F.E6.9C.AC こちらでもダミーのフォルダーを作成し、その中にxlsファイル、xlsxファイル、xlsmファイル、cvsファイル、exeファイル、txtファイル等を保存してから、お伝えしたマクロを実行してみましたが、exeファイル等の実行ファイルはリストアップされませんでした。 つまり、 >ご教示いただいたコードでは、実行ファイルも同じパスにあるため、リストアップされてしまいます。 という事が起きる原因は、質問者様が仰る「実行ファイル」が特殊なもので、拡張子が一般的な実行ファイルとは異なる拡張子が使われているものとなっている事によるものだと思われます。 ですので、その様な特殊な実行ファイルがリストアップされない様にするためには、その拡張子を持つファイルのみを除外する様にしなければなりません。 そのためには、その特殊な実行ファイルに付けられている拡張子が、どの様な拡張子であるのかを知る必要がありますので、そのリストアップされたという実行ファイルに付けられている拡張子がどの様な拡張子であるのかを御教え願います。
お礼
表現が誤っていただけでしたが、 親切・丁寧にご説明いただき、ありがとうございます! ご面倒おかけしました。
補足
こちらの表現がつたないばかりに、勘違いされてしまったようで すみません。 「実行ファイル」とは、 exeファイルのような事実上の「実行ファイル」のことではなく、 ご教示いただいたマクロを実行させるエクセルファイルのことです。 お騒がせしてしまい、申し訳ありませんでした。
関連するQ&A
- フォルダ内にあるファイルを取得したい
エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 「マクロ」ファイルにある「実行」Sheetというにある「実行」ボタンで L2に入力したパス内にあるファイル(.xlsや.xlsmや.xlsbが混在しますが、基本的には全てエクセルファイル)のファイル名を K8から下へ取得したいのですが・・ 参考にしたコードでは うまく動作しませんでした。 以下では、L2のパスを参照するのも組めていないため、コード内に直接パスを書き込んでいますが 実際は、パスを変動させて使いたいので、L2を参照できるようになると助かります。 ※パスは、質問用に仮置きで「パス」としています。 Sub Sample() Dim buf As String, cnt As Long Const Path As String = "パス" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 8 Cells(cnt, 11) = buf buf = Dir() Loop End Sub また、このコードでは マクロを実行するファイル自体のファイル名も取得してしまうようなので、 自身のファイル名以外のものを取得することは可能でしょうか。 ご指導のほど、よろしくお願い致します。
- 締切済み
- Visual Basic
- 【VBA】 ファイル名の取得
23歳OLです。 会社でマクロを組んでいるのですが、 できないところがあったのでご相談させてください。 ▼やりたいこと ================================================ ・フォルダを自分で指定して、選択したファイルの名前をシートに書き込む 1.txt 2.log 3.xls とフォルダに入っていたら 1.txt 2.log 3.xls とシートに名前を書き込んでほしいです。 ・ファイルの種類はいろいろある。(txt.logなど) ================================================ ▼現在書いてみたコード ======================== Sub Sample1() Dim buf As String, cnt As Long Const Path As String = "" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop End Sub ======================== これだと、初めから指定したフォルダしか取得することができないらしいです。 そもそもConst Path As String = "このぶぶん" このぶぶんにフォルダを指定しても動きませんでした。? どこが原因なのでしょうか? ご教示お願いします。
- 締切済み
- Visual Basic
- VBA:最下層のファイルを取得
最下層にあるファイルのファイル名を取得したく下記の様なプログラミングを組んでみたところ、 「ファイル名または番号が不正です」というエラーが表示されてしまいます。比較演算子などをいじって 試行錯誤してみましたが、どうしてもできません。どのように修正すればよいのでしょうか。ご回答よろしくお願いいたします。 http://syarecowa.moo.jpというサイトのmenu001.htmの下にある"1/3ケタの数字.htm"のファイル名を全て取得したいと考えています。 現在組めているコードは下記の通りです Dim cnt As Long ---------------- Sub Macro5(Path As String) Dim buf As String, f As Object buf = Dir(Path & "/#/###.htm") ★★ここでエラーが生じていしまいます★★ Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(Path).SubFolders Call Macro5(f.Path) Next f End With End Sub -------------------------- Sub Macro6() Dim URL As String 'ファイルパス Dim IE As Object 'オブジェクト Dim Myhtml As Variant 'HTMLタグデータ 'インターネットに接続 Set IE = CreateObject("InternetExplorer.Application") With IE .Navigate "http://syarecowa.moo.jp/menu001.htm" .Visible = Flase Do While .Busy = True DoEvents Loop 'Macro5呼び出し cnt = 0 Call Macro5("http://syarecowa.moo.jp/menu001.htm") End With End Sub
- ベストアンサー
- Visual Basic
- .xlsファイルが存在するパスを表示させたい
エクセルマクロ初心者です。 .xlsファイルをサブフォルダも含め検索し、A列にファイル名、B列にファイルが存在するパスを表示させるにはどうしたらいいでしょうか?検索するベースのディレクトリは決まっている”C:\temp”のでtemp以下、.xlsがどこに存在するのかを検索するマクロを組もうとしています。 いろんな書き込みを探し、サブフォルダを含め、ファイル名を取得するものは発見できたので組み込んでみましたが、、パスの表示方法がわかりません。 cnt = 0 Call Sample3("C:\temp") Callでサブルーチンsample3に渡し、ファイル名を取得しています。 Dim cnt As Long Sub Sample3(Path As String) Dim buf As String, f As Object buf = Dir(Path & "\*.xls") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(Path).SubFolders Call Sample3(f.Path) Next f End With End Sub あとは、どのように書けばいいのでしょうか? 宜しくお願い致します。
- ベストアンサー
- SE・インフラ・Webエンジニア
- エクセル マクロ ファイル名の(追加)取得
エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 現在、マクロ実行ファイル(エクセル)と同じフォルダ内にあるファイルの ファイル名を全て(マクロ実行ファイルに)記載する というマクロを使っています。 ※以下です。 Sub ファイル名取得() FolderPath = Cells(10, 7).Value 'パスは、G10セルから読み込む buf = Dir(FolderPath & "\*.*") cnt = 9 '実施行-1行目を指定 Do While buf <> "" If (buf Like "*.xls?") And buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 6) = buf 'F10からファイル名を記載 End If buf = Dir() Loop End Sub 現在、このマクロだと都度「上書き」になっているのですが 使用上の都合で 上記を実行して記載されたファイル名に 「追加」することもできると助かるのに・・と考えています。 ※以下「2」を質問させていただています! →1.マクロファイルと同じパスにあるファイルのファイル名を取得(記載):上記マクロで実行中 →2.1を実行後、同パスにファイルを追加し、ファイル名取得(記載)も1の後に追記 上記マクロは上記として、別途「追加」機能としてのマクロ(VBA)でも構いませんし、 上記を変更して「追加」にも対応できるマクロ(VBA)でも構いません! 具体的にイメージできていないまま質問してしまっているかもしれないので、 いくつかケース(構造)があるようでしたら、 ご面倒でなければ どのような動きがスムーズなのか? エラーが出にくいのか?等 併せて ご教示いただけますと、幸いです。 尚、説明がわかりにく等あれば 当然、補足させていただきますので、 ご指摘ください! よろしくお願い致します。
- ベストアンサー
- Visual Basic
- エクセルで、ファイル名を(追加で)取得したい
エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 以前、ファイル名を取得するコードをご教示いただいたのですが、 使っている内に 「追加」をする機能を付けたいと思うようになりました。 以下は、現状使用しているコードです。 ※以前質問させていただいた際とは微妙に仕様変更になったので、配列は多少変更しています。 Sub ファイル名取得() FolderPath = Cells(10, 7).Value 'パスはG10から読み込む buf = Dir(FolderPath & "\*.*") '拡張子の指定はしない cnt = 9 '実施行-1行目を指定 Do While buf <> "" If (buf Like "*.xls?") And buf <> ThisWorkbook.Name Then '拡張子はエクセル系 cnt = cnt + 1 Cells(cnt, 6) = buf 'F10から順にファイル名を記載 End If buf = Dir() Loop End Sub 必ず「追加」があるわけではないので、 パターン1:新規・追加を判別して、「追加」であれば、現状入っている値(ファイル名ですが)の下の行からファイル名を追加していく パターン2:上記で「cnt = 9+1」から挿入している部分を変更し、「挿入行」を指定してファイル名を取得する どちらのパターンが エラーになりにくく、より簡単に設定できるものなのか?も わかっていないため、 ザックリとした質問になってしまいましたが、 ご教示いただけますと幸いです。 よろしくお願い致します!
- 締切済み
- Visual Basic
- excelのファイルとセル値を書き出したい
excel2003を利用しています。 とあるフォルダにある excelファイル名(自分自身のファイルを除く) を全て書き出して、 且つ A1セルの値をB列に書き出すことを、やろうとvbaを作ってみましたが。 最後のファイルのA1セルを書きだすところで、エラーになっていまい そこだけ空白になってしまいます。※写真参照 記述は以下の通りです。どのように修正すればよいか 教えていただけないでしょうか? また他にもっと優れた記述があれば、そちらも教えて欲しいです。 よろしくお願いします。 Sub test() Dim buf As String, cnt As Long Dim Path As String Path = ThisWorkbook.Path & "\" buf = Dir(Path & "*.xls") cnt = 2 Do While buf <> "" If buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Workbooks.Open Filename:=Path & "\" & buf MsgBox Workbooks(buf).Worksheets(1).Range("A1").Value Cells(cnt, 2) = Workbooks(buf).Worksheets(1).Range("A1").Value Workbooks(buf).Close End If Loop End Sub
- 締切済み
- Excel(エクセル)
- 複数フォルダに格納されたファイル名取得VBA
お世話になっております。 あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。 ■エラー プロシージャの呼び出し、または引数が不正です 下から3行目、「buf = Dir()」が問題であることはわかるのですが、 何が問題でどのように解決したらいいかわかりません。 どなたかご教授の程よろしくお願い致します(>_<) ------------------------------------------------------------------------ Sub test() Dim buf As String Dim fName As String Dim msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If GetAttr(buf) And vbDirectory Then If buf <> "." And buf <> ".." Then fName = Dir(CurDir & "\" & buf & "\" & "*.jpg") Do While fName <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = fName msg = msg & buf & "\" & fName & vbCrLf fName = Dir() Loop MsgBox msg End If End If buf = Dir() Loop End Sub ------------------------------------------------------------------------ これが実現できないと細かい作業を毎日繰り返す事となり、 かなり業務不可が高いです。。 繰り返しになってしまいますが、どなたかご回答よろしくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- Excel VBA インデックスが有効範囲にない
よろしくお願いします。 Excel VBA 初心のものです。 プログラムを作ってみたのですが、 「インデックスが有効範囲にありません」となってその先に進めません。 ソースですが ------------------------------------------------------ Private Sub CommandButton1_Click() Dim buf As String, cnt As Long Dim TMP As Variant Const Path As String = "D:\Excel\sample\" buf = Dir(Path & "*.xls*") Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = FileDateTime(Path & buf) Cells(cnt, 3) = TMP buf = Dir() Loop End Sub ------------------------------------------------------ エラーになる箇所は Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value のところです。 このプログラムで何をしたいかと言いますと DドライブのExcel>sample というフォルダの中にある ・すべてのエクセルブック名(ファイル数は3個)と、 ・そのブックの作成日時と、 ・testdataというシート(各ブックに必ずあるシートです)のセルA1に入っている値 を実行ファイルのSheet1に書き出す、 というものです。 プログラムの実行ファイルはExcelフォルダ直下にあります。 どこが問題でエラーになっているのか分かりません。 ご指南よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- サブフォルダの親フォルダを変えたい
フォルダの中のサブフォルダを取得してくて、 http://officetanaka.net/excel/vba/tips/tips95.htm の --------------------------------------------------------- Sub Sample4() Dim buf As String, msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If InStr(buf, ".") = 0 Then msg = msg & buf & vbCrLf buf = Dir() Loop MsgBox msg End Sub --------------------------------------------------------- をやってみたら、サブフォルダを取得できたのですが、 上記のコードを実行すると 元々のフォルダのパスが「C:\Users」で、 「C:\Users」のサブフォルダが取得されてしまいます。 でも上記のコードでは、「C:\Users」は指定してないと思うのですが、 なぜ「C:\Users」のサブフォルダが取得されてしまうのでしょうか? 例えば 「C:\Users」ではなく、「C:\Program Files」のサブフォルダを取得するには、 どのようにコードを書き換えればいいのでしょうか? ご教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
補足
ありがとうございます。 試してみたところ、ご教示いただいたコードでは、 実行ファイルも同じパスにあるため、リストアップされてしまいます。 「実行ファイル以外」という条件を付けたいのですが・・・ いかがでしょうか? お手数おかけしますが、ご指導のほど よろしくお願い致します。