質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1175閲覧

配列に格納したファイルパスをMsgBoxで表示したい

s.s.s.s.

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/05/24 03:38

編集2022/05/24 03:45

初めまして。プログラミング初心者です。

【実行したい処理】
①フォルダを選択
②フォルダ内のパスを取得し配列に格納
⇒「sh」が含まれないもの(.logのもののみ)取得したい

③格納した配列を使用しテキストファイルを1行ずつ読み込む

現在②の処理で躓いてしまっています。
for文内でMsgBoxを指定すると正しくすべてのファイルのパスが表示されるのですが、
for文の外だと最初の1件しかパスが表示されないのです。
この後、配列として処理を追記したいのですがどこをどうしたらいいのかわかりません。

初歩的な質問で申し訳ありませんが教えていただけますと幸いです。
よろしくお願いします。

Sub ファイルパスの取得() ' '【変数の宣言】 ' Dim FSO As Object Dim Folder As Variant Dim File As Variant Dim FilePath As Variant 'フォルダ指定用のダイアログを表示します With Application.FileDialog(msoFileDialogFolderPicker) 'カレントディレクトリを指定します .InitialFileName = ThisWorkbook.path '設定しなかったら終了します If .Show = False Then Exit Sub '設定したフォルダを表示します 'Dim Fname Fname = .SelectedItems(1) End With '参照設定 'Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") 'Dim FilePath As Variant ReDim FilePath(1 To 200) '指定フォルダ内の.logファイルを探索します i = 0 For Each File In FSO.GetFolder(Fname).Files If InStr(File.Name, "sh") > 0 Then Else If InStr(File.Name, ".log") > 0 Then i = i + 1 FilePath(i) = File.path 'ファイルのフルパスを取得 'ここで設定したMsgBoxは正しく表示される 'MsgBox FilePath(i) End If End If Next MsgBox FilePath(i) End Sub

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/05/24 03:45

> for文内でMsgBoxを指定すると正しくすべてのファイルのパスが表示されるのですが、for文の外だと最初の1件しかパスが表示されないのです。この後、配列として処理を追記したいのですがどこをどうしたらいいのかわかりません。 forループ内で配列を生成すれば良いのではないでしょうか?
s.s.s.s.

2022/05/24 03:59

for文内で FilePath(i) = File.path 'ファイルのフルパスを取得 と指定しているため、ループ内で配列を生成している気でいたのですが これでは生成できていないのでしょうか?
jinoji

2022/05/24 08:39

FilePathは配列になっているけど、そのコードだとMsgBoxの行は1回しか動かないというだけでは。 (iの値はその直前のForループで最後のファイルの時にセットされた値になっている)
jinoji

2022/05/24 08:42

ちなみに、.log は、画像のように後ろに日付などがついていても処理対象にするのでしょうか。 〜.log は対象とするが 〜.log.20xx-xx-xx のようなファイルは除きたいということなら、修正が必要だと思います。
s.s.s.s.

2022/05/24 10:04 編集

for文内でMsgBoxを設定すると正しく4件のパスが表示されるのですが、 どうやったらfor文の外でこの配列を使用することができるのでしょうか? コードのどこを修正したらいいのでしょうか...。 〜.log 、 〜.log.20xx-xx-xx ともに対象としています。
meg_

2022/05/24 10:13

> FilePath(i) = File.path 'ファイルのフルパスを取得と指定しているため、ループ内で配列を生成している気でいたのですが すみません。見落としていました。 iの値を変化させれば配列にアクセスできるかと思いますよ。
s.s.s.s.

2022/05/24 12:42

すみません。iの値を変化させて配列にアクセスというのがよくわからなくて… もしよろしければ教えていただけますでしょうか?
guest

回答2

0

ベストアンサー

下記コードで取得したパスを表示できますが、FilePathの配列数を200にしていますのでMsgBoxが200回表示されてしまいます。ご参考まで。

VBA

1For Each File In FilePath 2 MsgBox File 3Next

投稿2022/05/24 10:19

meg_

総合スコア10602

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.s.s.s.

2022/05/24 10:33

ありがとうございます。 実装して200回表示、という意味が分かりました。 配列に記入があるとき処理を実行、というIf文を追加してみます。 ありがとうございました。
jinoji

2022/05/24 10:35

その場合、手前で ReDim Preserve FilePath(1 to i ) とすると良いかもしれませんね。 (まあ、本当はhatena19さんのいう通りな気もしますが)
guest

0

前回の下記の質問で解決しているのでは。

for文で取得したパスがどこにあるのかわからない件について

ただ、わざわざ配列に格納しなくても、
現状の For Each ループ内で、テキストファイルを1行ずつ読み込めばいいだけだと思います。

投稿2022/05/24 04:05

hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.s.s.s.

2022/05/24 07:16

それが、上記(質問で記載したコード)では正しく出力されなくて...。 参考にしたソースが配列を使用していたので配列に格納するものだと思っていましたが 配列に格納しなくても、1行ずつ読み込んでその中から指定の文字列を抜き出すことは できるのでしょうか?
hatena19

2022/05/24 16:42

当然、できます。 For Each ループ内で、ファイル名を取得出来ているので、そのファイル名をもとに読み込めばいいだけです。 ちなみに、削除依頼した質問ではUTF8のテキストファイルを読み込みたいとのことでしたが、その場合、 Workbooks.OpenText を使うのが簡単です。 VBA CSV ファイルの読み込み (Workbooks.OpenText 関数を使う) https://www.tipsfound.com/vba/18015
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問