[[20210624114740]] 『同じフォルダ内のファイルを指定した順番に開きた』(初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『同じフォルダ内のファイルを指定した順番に開きたい』(初心者)

はじめまして。お知恵を拝借したく質問させていただきます。
同一のフォルダ内に保存されているファイルを、
こちらの指定した順番に開いて順番に処理をしたいと考えています。

同じファイル内には、北海道から沖縄まで地域別に配布された同じファイルを格納しています。
指定した順番にファイルを開き、sheet1に入力されているA〜D列のデータをコピーして1枚のシートにまとめていきたいです。

頭の中では
1 A列に1から順に開きたいシートの名前を入力する
2 指定のフォルダ内を検索して、1番目のシートを開く
3 A〜D列をコピーする
4 集約シートに貼り付ける
5 A列の2番目のファイルを開く

というループ作業ではないかと考えているのですが、この考え方で実現可能なのでしょうか?
Openで指定するファイルをシート上から取得する方法が分からず先に進めなくなってしまいました。

格納されているファイルを上から順に開くマクロは組んだことがあるのですが、その際はこちらの指定した順番に開くのではなかったため、そういった方法が可能なのか、どう実現できるのか、ご教授いただけますと幸いです。

宜しくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


■1
>この考え方で実現可能なのでしょうか?
可能です。

■2
>Openで指定するファイルをシート上から取得する方法が分からず

>1 A列に1から順に開きたいシートの名前を入力する
これが、アクティブシートのA1セルから順番に、開きたい【ブック名】を入力するだとしたら、こんな感じでよいでしょう

    Sub さんぷる()
        Dim 行 As Long

        With ActiveSheet
            For 行 = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
                MsgBox ThisWorkbook.Path & "\" & .Cells(行, "A").Value & vbLf & "↑を開く処理を実行"
            Next 行
        End With
    End Sub

■3
↓のほうがよいとおもいます。

 4 集約シートに貼り付ける
 5 A列の2番目のファイルを開く
        ↓
 4 集約シートに貼り付ける
 5 開いたブックを保存せずに閉じる
 6 A列の2番目のファイルを開く

(もこな2) 2021/06/24(木) 12:36


もこな2さん>
ありがとうございます。

例えば北海道、東京、沖縄のブックが1つのフォルダに入っていた場合に、

A1 北海道
A2 沖縄
A3 東京

と入力し、
この順番に各ブックのデータをコピーしたいです。

フォルダに保管されている上から順では順不同となってしまうので、
こちらの意図した北海道、東京、沖縄の順に上からコピーしたデータを並べることができません。

1 「北海道.xlsx」を開いてコピー
2 「北海道.xlsx」を閉じる
3 「東京.xlsx」を開いてコピー
4 「東京.xlsx」を閉じる
5 「沖縄.xlsx」を開いてコピー
6 「沖縄.xlsx」を閉じる

という作業を行いたいのですが、開く順をA列に入力すればどうにか指定できないかな…と思った次第です。

宜しくお願いいたします。
(初心者) 2021/06/24(木) 15:30


>宜しくお願いいたします。
なにをでしょうか?
出来る出来ないは答えましたし、パス(ファイル名)を順番を取得する部分は提示しましたよね?

(もこな2) 2021/06/24(木) 16:02


もこな2さん>
癖で最後に宜しくお願いしますとつけてしまいました。失礼いたしました。

サンプルのVBAを実行した際にMsgBoxにパスが表示されるだけでしたので勘違いをしておりました。
頂いたコードと、手元にあるコードをにらめっこしながら、組みなおしてみたいと思います。

ありがとうございます!
(初心者) 2021/06/24(木) 16:13


ファイル名取得のコードと手元にあるコードを組み合わせたのですが、
ワイルドカードが上手く作動しないため、ご教授ください。

'フォルダを選択する

sub test()

Application.ScreenUpdating = False

With Application.FileDialog(msoFileDialogFolderPicker)

        If .Show = True Then
            folder = .SelectedItems(1)
        End If
    End With

        file = Dir(folder & "\*.xlsm")

If file <> "" Then

    For row = 1 To ThisWorkbook.Worksheets("読み取り順").Range("A" & Rows.Count).End(xlUp).row
        Order = ThisWorkbook.Worksheets("読み取り順").Cells(row, "A").Value
→        Set book = Workbooks.Open(folder & "\*" & Order & "*.xlsm")

        file = Dir()
        Application.DisplayAlerts = False ' メッセージを非表示
              book.Close
        Application.DisplayAlerts = True  ' メッセージを表示
        Next row

Else
MsgBox "ファイルが見つかりません"
End If

Application.ScreenUpdating = True

End Sub

矢印のところでファイルが見つからないとエラーが出てしまい、部分一致でフォルダを探すことができません。
"*"を抜いて読み取り順のシートにデータの名前を入力すると問題なく作動します。

前後のワイルドカードの使い方が間違っているのでしょうか?
(初心者) 2021/06/25(金) 11:48


■4
>ワイルドカードの使い方が間違っているのでしょうか?
そうですね。Openメソッドでワイルドカードを使うことはできません。

いままでは、Do〜Loopでフォルダにある全ファイルを巡回して条件(拡張子が".xlm")に合うものをかたっぱしから拾っていたわけですが、そこから考え方を変えないとダメです。

    Sub さんぷる2()
        Dim フォルダパス As String
        Dim ファイル名 As String
        Dim 行 As Long       

        '▼フォルダを指定してもらう処理
        With Application.FileDialog(msoFileDialogFolderPicker)
            If .Show = True Then
                フォルダパス = .SelectedItems(1)
            Else
                MsgBox "処理中止"
            End If
        End With

        '▼ファイルリストに沿ってファイルの有無をチェックする処理         
        With ThisWorkbook.Worksheets("読み取り順")
            For 行 = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
                ファイル名 = Dir(フォルダパス & "\" & .Cells(行, "A").Value & ".xlsm")

                '▼ファイルがあれば(Dir関数で""にならなければ)処理を実行
                If ファイル名 <> "" Then
                    MsgBox フォルダパス & "\" & ファイル名 & vbLf & "↑を開く処理を実行"
                Else
                    MsgBox フォルダパス & vbLf & "↑に↓のファイルはありません" & vbLf & .Cells(行, "A").Value & ".xlsm"
                End If
            Next 行
        End With
    End Sub

要は、かたっぱしから探すんじゃなく、ピンポイントで探してあれば処理するという考え方にすればよいです。

(もこな2) 2021/06/25(金) 12:40


もこな2さん>

ありがとうございます!

ファイル名 = Dir(フォルダパス & "\" & .Cells(行, "A").Value & ".xlsm")

ファイル名 = Dir(フォルダパス & "\*" & .Cells(行, "A").Value & "*.xlsm")
としたら、部分一致でもOpenメソッドが実行でき、希望の作業が実現できました。

勉強になりました。
ありがとうございます。
(初心者) 2021/06/25(金) 13:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.