重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ExcelVBAにて、同じフォルダ内における複数ブックの特定項目(名前、住所)の集計しようと考えて、以下のように作成しましたが、シートの一行目しか取得できません。2行目以降も取得したいのですが、やり方についてご存じの方がいたら、ご教示ください。

'ボタンをクリックした時の処理
Public Sub sample()

Dim wFile As String
Dim wFilePath As String
Dim i As Long

'Excelファイルが存在していたらファイル名を返す
wFile = Dir(ActiveWorkbook.Path & "\*.xlsx")

'先頭行を指定
i = 2

'カレントディレクトリに存在するExcelファイルを全て読み込む
Do While wFile <> ""

'開くExcelファイルのフルパスを取得
wFilePath = ActiveWorkbook.Path & "\" & wFile

'名前・住所を取得し配列に格納する(区切り文字:|)
strData = Split(File_Load(wFilePath), "|")

'名前
Cells(i, 1) = strData(0)

'住所
Cells(i, 2) = strData(1)

'ファイル名
Cells(i, 3) = wFile

'次のExcelファイルを取得
wFile = Dir()

'行数をカウント
i = i + 1

Loop

End Sub

'Excelファイルを開いてデータを取得
'戻り値:名前|住所 ( | で区切る)
Function File_Load(ByVal wFilePath As String) As String

Dim CurBookName As Variant
Dim ColNo As Long
Dim RowNo As Long
Dim strValue As String
Dim FoundCell As Range
Dim i As Long


'ファイルを開く
Workbooks.Open wFilePath

'開いたExcelのファイル名を取得
CurBookName = Application.ActiveWorkbook.Name

'検索する項目を配列に格納
wItem = Array("名前", "住所")

Dim s As Long



'検索する
For i = LBound(wItem) To UBound(wItem)
Set FoundCell = Cells.Find(What:=wItem(i))
If FoundCell Is Nothing Then
'検索出来なかった場合
If i = 0 Then
strValue = ""
Else
strValue = strValue & "|"
End If
Else
'検索したセルに移動
FoundCell.Select
ColNo = ActiveCell.Column '列番号を取得
RowNo = ActiveCell.Row '行番号を取得
'住所を取得する
If i = 0 Then
'最初の項目
strValue = Cells(RowNo + 1, ColNo).Value
Else
'2番目以降の項目は|で区切る
strValue = strValue & "|" & Cells(RowNo + 1, ColNo).Value
End If
End If
Next i

'結果を返す
File_Load = strValue

'開いたExcelファイルを閉じる
Application.DisplayAlerts = False '確認メッセージの非表示
Workbooks(CurBookName).Close
Application.DisplayAlerts = True '確認メッセージの表示

End Function

「ExcelVBAにて、同じフォルダ内にお」の質問画像

質問者からの補足コメント

  • うーん・・・

    申し訳ありません。
    各ブックのシート1の名前、住所を一覧ブックに集計するのは、上記のマクロで問題なく処理できたのですが、また上から新たなものを作成して欲しいと依頼があり、困っております。
    今度は、集計する項目が、受付日、氏名、郵便番号、住所、電話番号、金額、用途、入金日、公表名、公表金額、納入方法、個数、品物と増えたうえ、各ブックのシート1だけではなく、全てのシートに項目がちらばっているため、全てのシートから集計するようにしなければなりません。
    種々試しているのですが、私のスキルが未熟すぎてうまくいきません。
    お忙しいところ、大変恐縮ですが、またご指導、ご鞭撻いただければ幸いでございます。

    No.4の回答に寄せられた補足コメントです。 補足日時:2020/02/14 19:07
  • ご丁寧にありがとうございます。
    別の用事で、会社から出てしまっておりますので再度確認して連絡いたします。

    No.10の回答に寄せられた補足コメントです。 補足日時:2020/02/14 20:06

A 回答 (11件中11~11件)

どういったレイアウトのシートからデータを取り出すのかわからないですが、少なくとも



>'検索する項目を配列に格納
>wItem = Array("名前", "住所")

検索する項目がシートの固定場所ではなく、ブックによってシート内のあちこちに存在する可能性があると言う事なのでしょうか?
レイアウトが全て統一されているのであれば、そのセルは必ず決まってますよね。

あとはSetステートメントについて勉強をすると扱いやすいコードが出来るのではないかなって思います。
正直ユーザー定義関数の存在意味がわかりかねます。
    • good
    • 0
この回答へのお礼

貴重なアドバイス ありがとうございます。
ご意見はごもっとなことでございます。
ただ、今回は複数事業者が絡んでいるので、レイアウトの統一性が難しい可能性があるため、行・列の追加等を鑑みて、今回のようなややこしい式ににしてしまいました。
私が、事前調整を上手くできればいいのでしょうが、情けない話でございます。

お礼日時:2020/02/09 14:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!