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

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

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

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

Q&A

解決済

1回答

1091閲覧

ファイル名が配列に一致(ワイルドカード)したとき、検索を行い、ヒットしたセルの右となりにファイル名を表示したい

Dis

総合スコア19

VBA

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

0グッド

0クリップ

投稿2021/05/09 14:34

VBA

1Sub ファイル名取得() 2 3 '配列を取得----------------------------------- 4 Dim i As Long 5 Dim MyArray1 As Variant '列C 6 ReDim MyArray1(0) 7 8 For i = 3 To 55 9 If ThisWorkbook.Sheets(2).Range("B" & i).Value <> "" Then 10 ReDim Preserve MyArray1(UBound(MyArray1) + 1) 11 MyArray1(UBound(MyArray1)) = ThisWorkbook.Sheets(2).Range("B" & i).Value 12 End If 13 Next i 14 15 '配列のEmptyを削除----------------------------------- 16 Dim j As Long 17 j = LBound(MyArray1) 18 Dim k As Long 19 20 For k = LBound(MyArray1) To UBound(MyArray1) 21 If MyArray1(k) <> "" Then 22 MyArray1(j) = MyArray1(k) 23 j = j + 1 24 End If 25 Next k 26 ReDim Preserve MyArray1(j - 1) 27 28 'ファイル名取得----------------------------------- 29 Dim filePath As Variant 30 filePath = Application.GetOpenFilename( _ 31 FileFilter:="Excelブック(*.xlsx;*.xlsm;*.xls),*.xlsx; *.xlsm; *.xls;", MultiSelect:=True) 32 33 Dim r As Long 34 Dim wb As Workbook 35 Dim rng As Range 36 37 If IsArray(filePath) Then 38 For r = LBound(filePath) To UBound(filePath) 39 Set wb = Workbooks.Open(filePath(r)) 40 If wb.Name Like "*" & MyArray1(i) & "*" Then 41 rng = ThisWorkbook.Sheets(2).Columns("B").Find(MyArray1(i)) 42 rng.Offset(0, 1).Select 43 ActiveCell.Value = Dir(filePath) 44 End If 45 Next r 46 Else 47 Exit Sub 48 End If 49 50End Sub

B列には東京、神奈川、福岡、札幌などがあらかじめ入力されており、B列を配列に格納します。
ブックを開き、ファイル名が配列に一致(ワイルドカード)したとき
B列を配列で検索し、ヒットしたセルを選択後、右隣にファイル名を表示したいです。

VBA

1If wb.Name Like "*" & MyArray1(i) & "*" Then

初歩的だとは思うのですが
エラー9 インデックスが有効範囲にありません。
と出ます。

どなたかご教示いただけたらと思います。
よろしくお願いいたします。

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

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

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

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

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

jinoji

2021/05/09 14:44

i とは何なのか。哲学的ですな。
Dis

2021/05/09 14:59

たった一言で迷路から抜け出せました。 本当にありがとうございました!笑
guest

回答1

0

ベストアンサー

このコードだと、iは55で、UBound(MyArray1)は53とかじゃないでしょうか。

あらためてMyArray1を順番にループする手もありますが、たとえばこんな感じでどうでしょう。

VBA

1If UBound(Filter(MyArray1, wb.Name)) > -1 Then 2

投稿2021/05/09 14:54

jinoji

総合スコア4585

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問