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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2035閲覧

エクセルVBAで配列に値を格納後、参照するとエラーになる

kometaroimo

総合スコア76

VBA

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/09/14 08:57

わからないこと
エクセルVBAで以下のコードを実行するとout of boundsなエラーが出ます。。

vba

1Sub FileSearch(Path As String) 2 Dim FSO As Object 3 Dim Folder As Variant 4 5 '' ディレクトリパスを格納する為の配列 6 Dim aryPaths() As String 7 '' 配列の要素 8 Dim index As Single 9 10 index = 0 11 12 Set FSO = CreateObject("Scripting.FileSystemObject") 13 For Each Folder In FSO.GetFolder(Path).SubFolders 14 Call FileSearch(Folder.Path) 15 Next Folder 16 For Each File In FSO.GetFolder(Path).Files 17 Debug.Print File.Path '←この結果は期待値通り。結果は10件。 18 ReDim Preserve aryPaths(index) 19 aryPaths(index) = File.Path 20 index = index + 1 21 Next File 22 23Debug.Print aryPaths(0) '※ここでエラー※ 24 '実行時エラー '9'; 25 'インデックスが有効な範囲にありません 26End Sub 27``` 28 29上記で「Debug.Print aryPaths(0)」というコードでエラーになります。。 30要素数は十分なのになぜ、、 31 32と、どはまりしております。。 33きっと、そんなこと、、という内容とは思いますが解決できず困っています。 34原因を教えてもらえませんでしょうか。

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

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

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

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

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

guest

回答2

0

「空のディレクトリ」があるときに、エラーが出ることを確認しました。

以下の構成のディレクトリをルートとして指定すると、new ディレクトリを超えたところでエラーが出ます。

[g:\] |-[new] |-aaa.txt

こんな感じで回避できます。

vba

1 2Option Explicit 3 4'' FileSearch "g:\test" 5Public Sub FileSearch(Path As String) 6 Dim FSO As Object 7 Dim Folder As Variant 8 '' コンパイルエラーに引っかかったので、File 変数を定義。 9 Dim File As Object 10 11 '' ディレクトリパスを格納する為の配列 12 Dim aryPaths() As String 13 '' 配列の要素 14 Dim index As Single 15 16 index = 0 17 18 Set FSO = CreateObject("Scripting.FileSystemObject") 19 For Each Folder In FSO.GetFolder(Path).SubFolders 20 Call FileSearch(Folder.Path) 21 Next Folder 22 23 '' ファイルの数が 0 以上ならば、aryPaths に新規要素を追加。 24 If FSO.GetFolder(Path).Files.Count > 0 Then 25 For Each File In FSO.GetFolder(Path).Files 26 Debug.Print File.Path '←この結果は期待値通り。結果は10件。 27 ReDim Preserve aryPaths(index) 28 aryPaths(index) = File.Path 29 index = index + 1 30 Next File 31 32 Debug.Print aryPaths(0) '※ここでエラー※ 33 '実行時エラー '9'; 34 'インデックスが有効な範囲にありません 35 Else 36 '' なければ、空のフォルダを見たことを Debug.Print. 37 Debug.Print "Read blank folder." 38 39 End If 40 41End Sub 42

ご参考になれば幸いです。

投稿2017/09/14 09:48

tukuroku

総合スコア234

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

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

kometaroimo

2017/09/15 02:28

さっそくのご回答ありがとうござます! 最初にいただいた↓の方にもresさせていただいたのですが、ほんとそうですよね。 そもそも目的は、「ファイル内の文字列検索」でファイルパスの一覧を返すサブファンクションを作っていました。よくよく考えるとわざわざ配列に格納して返却してそのパスを1件づつ検索。。なんてことしなくても上記のご指摘を反映して、「Debug.Print File.Path」のところで、そのファイルパスを検索して一致したら別シートにOUTPUTする、、という処理でよさそうな気がしてきました。 もう少しで達成できそうなのでがんばってみます。ちなみにBAは下記の方にさせていただきましたが、甲乙つけれずスピードでした判断できなかったためです。 すごくわかりやすく感謝しています。 ありがとうございました。
guest

0

ベストアンサー

エラーにならないですね。
エラーからは、配列が作られていないことは確実なので、以下のようにするとどうなりますか?

VBA

1 ReDim aryPaths(FSO.GetFolder(Path).Files.Count) '←追加 2 For Each File In FSO.GetFolder(Path).Files 3 Debug.Print File.Path '←この結果は期待値通り。結果は10件。 4 'ReDim Preserve aryPaths(index) 'コメント 5 aryPaths(index) = File.Path 6 index = index + 1 7 Next File

因みに、Fileは変数として宣言されていませんね。(関係はありませんでしたが)

投稿2017/09/14 09:43

sazi

総合スコア25138

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

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

kometaroimo

2017/09/15 02:22

さっそくのご回答ありがとうございます。なるほどです~私が実施していた検索対象のフォルダ構成ですが、フォルダが3層で最下層のフォルダ内のみファイルなにも無い状態でした。 フォルダを上から順番に処理していった結果、一番したのフォルダ内にはファイルがなく、僕の処理だと配列が初期化(ReDim)されないのですな。。 だから空のフォルダがある場合は配列が初期化されずエラー(out of bounds)になる。。。 いや、助かりました~ Fileの件は焦ってて。。ボンミスおはずかしい。ともかく原因がわかったのでやりなおしてみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問