Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
他ファイルを開かずにデータを取得する際のファイルパス指定方法について
投稿日時: 23/04/14 10:49:52
投稿者: nikutamasoba

あるフォルダに格納された複数のエクセルファイル(同じ形式)をファイルを開かずに別ファイルに取り込み予定です。(取り込みファイルがパワークエリが使えないバージョンなのでVBAでのデータ取り込みを予定しています。
絶対パス参照すると@のコードで可能なのですが、保存先フォルダが変わる可能性があるため、a2セルに記載したファイルパス内のエクセルファイルを指定した形式を考えておりAのコードを作成しました。
しかし、フォルダ指定がうまく参照できません。
  
 @
  read_folder = Range("a2").Value
  read_file = Dir(read_folder & "\")
 ‘ ファイルが見つからなくなるまで繰り返す
  Do While read_file <> ""
  cnt = cnt + 1
  Cells(cnt + 4, 1) = read_file
  Cells(cnt + 4, 2) = "=+'D:\〇フォルダ\[" & read_file & "]data1'!B3"
  cells(cnt + 4, 2) = Cells(cnt + 4, 2)
    read_file = Dir()
  Loop
  
 下記でa2セルのファイルパスを参照してデータを取得を試みるのですが、ファイルのありかを聞いてきます。どうやると指定できるでしょうか?
ちなみにa2セルには、D:\〇フォルダ と入力されています。
A
 read_folder = Range("a2").Value
  read_file = Dir(read_folder & "\")
  ’ファイルが見つからなくなるまで繰り返す
  Do While read_file <> ""
  cnt = cnt + 1
  Cells(cnt + 4, 1) = read_file
  Cells(cnt + 4, 2) = "=+'read_folder [" & read_file & "]data1'!B3"
  Cells(cnt + 4, 2) = Cells(cnt + 4, 2)
    read_file = Dir()
  Loop

回答
投稿日時: 23/04/14 11:20:43
投稿者: taitani
投稿者のウェブサイトに移動

動作確認は行っていませんが、
 
Cells(cnt + 4, 2) = "=+'read_folder [" & read_file & "]data1'!B3"
 
ではなく、
 
Cells(cnt + 4, 2) = "=+'" & read_folder & "[" & read_file & "]data1'!B3"
 
とか?
 
次回から、「どんなエラー」かも記載したほうがいいですよ。

投稿日時: 23/04/14 11:50:11
投稿者: nikutamasoba

ありがとうございます。
Aのコードを動かすと、ファイル参照のウインドウが開いて参照先を指定するよう促してきます。
そこで該当ファイルを指定すると正しく転記されますが、一ファイル毎に実施が必要になってしまいます。
 
ファイル参照先を指定するよう促す画面のウインドウの左上には、
 値の更新:ファイル名date1 という標記がされています。
 
教えていただいたコードも同じような状態になってしまいます。。
 

回答
投稿日時: 23/04/14 12:05:21
投稿者: taitani
投稿者のウェブサイトに移動

うーん、こんな感じかな。
 

read_folder = Range("A2").Value
read_file = Dir(read_folder & "\")
' ファイルが見つからなくなるまで繰り返す
Do While read_file <> ""
    cnt = cnt + 1
    Cells(cnt + 4, 1) = read_file
    full_path = read_folder & "\" & read_file
    Cells(cnt + 4, 2) = "=+'" & full_path & "\[data1]'!B3"
    Cells(cnt + 4, 2) = Cells(cnt + 4, 2)
    read_file = Dir()
Loop

回答
投稿日時: 23/04/14 12:06:13
投稿者: simple

既に指摘があったとおりかと思いますが、再度念のため。
 

Cells(cnt + 4, 2) = "=+'read_folder [" & read_file & "]data1'!B3"  
の前に、↓を追加してステップ実行してみれば、
Debug.Print "=+'read_folder [" & read_file & "]data1'!B3"
実際にどんな式を設定しようとしているかわかります。
(イミディエイトウインドウの内容を確認してください)
 
想定どおりにいかなかったら、内容を確認する必要があります。
そのためのデバッグ手法をマスターしておくことも、
コードを書くことと同じように大切なことです。
・ステップ実行
・ローカルウインドウの見方
・イミディエイトウインドウの使い方
・ブレークポイントの設定の仕方 等々
 
"=+'read_folder [" のように、
変数(read_folder)を "と"で挟んでしまうと、それはもう変数の意味が失われ、
単にそういう文字列と見なされます。

回答
投稿日時: 23/04/14 12:29:26
投稿者: simple

想定される手順は以下のようなものです。

1. マクロではなく、手作業で参照式を作成。
2. その式(文字列)を、変数を使って再現するコードを作成
3. 繰り返しのコードに反映する。

1.のステップを飛ばしていませんか?

回答
投稿日時: 23/04/14 15:42:24
投稿者: WinArrow

引用:
ちなみにa2セルには、D:\〇フォルダ と入力されています。

 
"D:\〇フォルダ\"
最後の「\」が必要と思いますが・・・・

回答
投稿日時: 23/04/14 15:56:56
投稿者: simple

こんなことになりませんか?

Sub test()
    Dim read_folder As String
    Dim read_file   As String
    Dim cnt         As Long
    Dim s           As String

    read_folder = Range("A2").Value & "\"
    read_file = Dir(read_folder)
    Do While read_file <> ""
        cnt = cnt + 1
        Cells(cnt + 4, 1) = read_file
        s = "='" & read_folder & "[" & read_file & "]data1'!B3"
        ''Debug.Print s
        Cells(cnt + 4, 2) = s
        Cells(cnt + 4, 2) = Cells(cnt + 4, 2)
        read_file = Dir()
    Loop
End Sub

投稿日時: 23/04/14 18:46:46
投稿者: nikutamasoba

できました。ありがとうございます。
もう一度よく確認して勉強します。お世話になりました。