• ベストアンサー

EXCEL VBAのファイルオープンについて

1列のセルそれぞれに同フォルダのファイル名が入力されていて(ファイル数は変化する)それを、一度に開くか、もしくは1つずつ開いていくかの構文で悩んでいます。ファイル数が特定されていないので、Do Untilでカウンタ変数をたててしているのですが、1つ目のファイルは開くのですが、後のファイルがエラーになってしまいます。 説明がうまくできていないかもしれませんが、もしわかりましたら、是非教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

>1つ目のファイルは開くのですが、後のファイルがエラーになってしまいます。 >・・・もしわかりましたら、是非教えてください。 エラー原因なら・・・内容がわからないので、分からないとしかいいようがありませんが・・・ 質問にあるような状態で、不特定の複数Bookを開くようにコードを書いてみました。参考にして下さい。 下のコードは、A1にフォルダ名がセットされていて、B列にB1から不特定数(>0)のファイル名が連続にセットされている例です。ファイルが存在しない場合などのエラー処理は省略しています Sub xlsFilesOpen()   Dim myFolder As String '共通のフォルダ名   Dim rw As Long '行カウンタ   Dim ThisBookname As String 'このブック名   ThisBookname = ThisWorkbook.Name   myFolder = Range("A1")     If Right(myFolder, 1) <> "\" Then myFolder = myFolder & "\"   With Range("B1")     'ファイル名が登録されていれば開く     While .Offset(rw, 0) <> ""       'Bookを開く       Workbooks.Open myFolder & .Offset(rw, 0)       '次のセル(B列の次の行になる)       rw = rw + 1     Wend   End With   '最初のBookを表示しているだけです   Workbooks(ThisBookname).Activate End Sub

moon623
質問者

お礼

できました!! while~Wend 本で探せませんでした。 これからも活用できそうです。 ありがとうございました。ほんとに勉強になりました。 ここでちょっと質問なのですが、Ifに対してもEnd Ifがなくてなぜエラーがでないのでしょうか?

その他の回答 (1)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

>ここでちょっと質問なのですが、 >Ifに対してもEnd Ifがなくてなぜエラーがでないのでしょうか? If~Then~Else ステートメントの書き方については、VBAのヘルプを見ると、 『条件が真 (True) の場合のステートメントの実行   条件が真 (True) の場合に 1 つのステートメントだけを実行するときは、   If...Then...Else ステートメントの1行の構文を使います。   次の例は、キーワードElseを省略した1行の構文を示しています。    Sub FixDate()      myDate = #95/2/13#      If myDate < Now Then myDate = Now    End Sub                 』 とあります。 条件が成立した時、1つのことだけを行う場合にこう書けます。 X = a: If y < 0 Then x = b のような使い方をして行が長くならないようにしています。癖かもしれません。 >while~Wend 本で探せませんでした。 >これからも活用できそうです。 while~Wendは少し古い書き方かもしれません。 Do~Loopでも当然できます。こちらをマスターしたほうがいいかもしれません。 個人的にはwhile~Wendの方がなれているのでこちらを使うことが多いです。 Do~Loop についても、Help等でみて下さい。 Do~Loop例:B1~B3に何か入力しておいて実行してみて下さい。最初の回答と同じような意味合いです。 Sub DoLoopTest()   Dim rw As Long   With Range("B1")     Do Until .Offset(rw, 0) = ""       MsgBox "セル" & .Offset(rw, 0).Address & "の値は" & .Offset(rw, 0)       rw = rw + 1     Loop   End With   MsgBox "おしまい" End Sub

moon623
質問者

お礼

丁寧な回答ありがとうございます。 仕事で初めてVBAをやり出し、聞く人もいなく本だけを見て作っているので、 これが本当に正しいのか?など不安になる事が多く、今回質問をして、 回答頂き、とても嬉しく思っています。