• ベストアンサー

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をやり出し、聞く人もいなく本だけを見て作っているので、 これが本当に正しいのか?など不安になる事が多く、今回質問をして、 回答頂き、とても嬉しく思っています。

関連するQ&A

  • ファイル名の取得(エクセルVBA)

     エクセル97を使用しています。 過去ログを見て、ファイル名の取得にDir関数が使えることは、判ったのですが、不特定数のファイル名に対応する方法が思いつきません。  特定のフォルダ内の、数が可変するファイルのファイル名を、検索した時点で、全部セル(または変数でも可)上に取得する方法って、ありますでしょうか?  よろしくお願いします。

  • VBAの構文で教えてください

    VBAの繰り返し処理 Do Until ~について教えてください。 シートの行列を全て書いてしまうと長くなるので 少し省略させていただきます。    A  B  C  D 1 2008 1 ○ 2008 2 2008 2 × 2008 このような羅列がデータ検索の際に何行になるかわからない状態のデータがあります。 C 列はBが1の場合○、2の場合は× D 列はAが数字があればそのままコピーするようにくみました。 ここで教えていただきたいのが、現在私はCとDの構文は AまたはBに数字があればC,Dに反映するという構文ではなく C、Dの列の最後まで全て数式を入力する構文にしています。 なので、A,Bに入力があってもなくても数式が飛ぶような構文になっています。 そこで、DO Until ~ を使用し A列が空白になるまで処理を繰り返すとすればいいのかなとおもうのですが、 Dim n as integer n=1 Do Until Sheets("sheet1").Cells(n, 1) = "" 空白までという構文(正しいかはわかりませんが)で行き詰っています。 これ以降のAが空白ならDに貼り付ける、 B列も同様に空白まで検索し○または×に置き換えるとは どのうように組み立てたらいいのでしょうか? また、申し訳ないのですが Cが×ならその列の背景を色づける(今回の場合なら2の列) とことまでしてみたいのですが・・・ このようなことが可能であれば教えていただければと思います。 VBAははじめたばかりで不勉強な点も多々ありますがよろしくお願いします。

  • エクセルVBAについて質問です。

    現在、マクロで重複データを削除する処理しています。 一応動作はするのですが、すごく遅いです。 およそ私のPC(XPのQuadコア)で1行処理するのに約0.85秒かかっています。 データが1万行以上もあるようなときは、何時間もかかってしまいます。 エクセルのデータは、以下のように、 A列とB列に文字列が何行にも渡って入っているものです。 A列   B列 AAA BBB CCC DDD EEE FFF GGG BBB CCC HHH CCC DDD (以下同様) 上のようなシートで、A列とB列の両方について重複する行を削除したいと思っています。 上記例だと、一番最後の「CCC-DDD」の箇所を削除したいです。 そこで以下のようなマクロを組みました。 (1)はじめに重複をチェックする変数(A列・B列)を取得します。 (2)上から順にチェックを開始します。 (3)A列・B列双方が取得した変数と一緒なら重複カウンターに1を加える。 (1回目の出現では削除しない) (4)チェックを続け、重複カウンターが2以上になった行は削除する。 (5)上記を空白行まで繰り返す。 というような流れです。 (マクロ記述の途中部分からです) '重複する行を削除 counter3 = 1 Do search_word1 = Cells(counter3, 1).Value search_word2 = Cells(counter3, 2).Value counter4 = 1 double_counter = 0 Do If Cells(counter4, 1).Value = search_word1 And Cells(counter4, 2).Value = search_word2 Then double_counter = double_counter + 1 If double_counter > 1 Then '二度以上出現した場合から削除する Cells(counter4, 1).EntireRow.Delete counter4 = counter4 - 1 End If End If counter4 = counter4 + 1 Loop Until Cells(counter4, 1).Value = "" counter3 = counter3 + 1 Loop Until Cells(counter3, 1) = "" 初心者なのもので、冗長や不適切な箇所などあるかと思います。 より効率的、あるいは、より早くできる書き方がありましたら、 ぜひともお教え下さい・よろしくお願いします。

  • EXCEL VBAでファイル名取得

    A1のセルにユーザー定義で書式設定をしたものをそのファイルの名前にしようと思ってます。 書式は「1」と入力すれば「001」と表示されるようになっています。 そのままセル+".xls"で保存しようとすると、「型がちがいます。」というエラーになり、そのセルを変数にしてvalueで表示すると、そのまま「1.xls」というファイル名になってしまします。 「001.xls」というファイル名にするにはどうしたらよいでしょうか? どなたかよろしければ、回答お願いします。

  • エクセルのファイル名に変数を指定して開く方法

    エクセルのVBA初心者です。 最近、といっても2~3日前に始めたのですが、簡単なところで つまづいてしまい、本を読んでもにっちもさっちもいかず、困っております。 下記にやりたいことと、構文を記載しますので、お手数ですがアドバイスを 頂ければ助かります。 <やりたいこと> 特定のセルに記載された文字をファイル名としたエクセルファイルを VBAで開きたい。 <構文> Sub W() Dim ファイル名 As Integer ファイル名 = Range("C5").Value Workbooks.Open "D:\日本\データ\ファイル名.xlsx" End Sub <問題点> 上記のように構文を組んでも、「実行時エラー '1004'」なるメッセージが出て 「***が見つかりません。ファイル名およびファイルの保存場所が正しいか...」とのメッセージが出てしまいます。 C5のセルにはファイル名が記載され、このファイル名を変数としたつもりです。 VBAが入っているファイルは、「日本」というフォルダに入っており、変数によるファイルは「日本」というフォルダの子供である「データ」というフォルダに入っています。 アドバイスよろしくお願いします。

  • エクセルVBAのプログラムで

    特定のHTML構文中のテキストを読みとってセルに入力するプログラムを作りたいのですがどうしたらいいでしょうか?

  • エクセルVBAのSETステートメントについて

    マクロを組み込んだエクセルファイルが完成したのですが、ファイルサイズが大きくなってしまった ため、ファイルサイズを軽くするために現在 試行錯誤を繰り返しています。(シート数:50シート) ファイルサイズを軽くするために今までに取り組んできたのは下記の9項目です。 ・数式を値に変換 ・シートイベントプロシージャをThisWorkbookイベントに変換してマクロ構文を簡素化 ・隠れオブジェクトを全て削除(オブジェクト数を最小限・最小サイズに抑える) ・条件付書式、入力規則、名称登録を最小限に抑える ・必要な条件付書式のセル番地には必ず 『 $ 』 を付ける ・Offset 構文を最小限に抑える ・未使用セルの削除(最終セルの位置を正常化) ・Call マクロを多用してマクロ構文の情報量を極力減らす ・型に応じた変数宣言を徹底(バリアント変数扱いを最小限に抑える) ただ、『 型に応じた変数宣言 』 のSETステートメントの正しい使い方について私自身が良く理解 をしていないためにご指導を頂きたく投稿をさせて頂きました。不明なのは下記の2点です。 (1)『 SET a = ○○○○ 』 はオブジェクト型変数に対してのみ使用するものなのでしょうか?   データ型(Date)や文字列型(String)の変数に対してはSETステートメントは使用しないもの   なのでしょうか?仮にデータ型や文字列型変数に対してSETステートメントを使用した場合の   メリットとデメリットについて教えて下さい。もしかして、データ型や文字列型の変数の場合は   ただ単純に 『 SET 』 の文字が省略されているだけなのでしょうか。この基本的な部分の   理解ができていないので、理屈が分からずに困っております。 (2)『 SET a = Nothing 』 の対応はどこまで必要なのでしょうか?   上記(1)の質問にも絡むのですが、メモリリソースを開放してファイルサイズを軽くするためには   『 SET a = Nothing 』 が有効であるという情報がインターネット上に多数掲載されてますが   データ型や文字列型変数に対してもプロシージャの末尾に 『 SET a = Nothing 』 の構文   を付け加えた方がファイルサイズが軽くなるものなのでしょうか?   また、下記マクロ処理の場合にも 『 SET a = Nothing 』 の構文は必要なのでしょうか?        'Shをオブジェクト型変数として宣言     Dim Sh As Worksheet           :           :     '全てのシートに対して以下の処理を実行     For Each Sh In Worksheets            固有のシートに対してではなく全てのシートに           :                      対してマクロを実行する処理においても           :                      末尾に 『 SET a = Nothing 』 の構文を     '次のブックに対しても同様の処理を実行   付け加えた方がファイルサイズが軽くなる     Next Sh                        ものなのでしょうか? とにかく、正攻法でファイルサイズを軽くする方法を探しています。コメントが長くなり過ぎてしまい ましたが、『 SETステートメントの正しい使用方法 』、『 ファイルサイズを軽くするための裏技 』 などについて、ご存知の方がいらっしゃいましたら是非教えて頂けますよう宜しくお願いします。

  • エクセルVBAで複数のファイルをひとつにまとめる

    はじめまして。 VBA初心者で恐縮なのですが、教えてください。   ブックAAAがあるフォルダ内に複数ある「***.xls」の全てのフイルのシート「A」内の特定のセル(A1:F30)の文字列を、全てブックAAAの1つのシートの特定の列(A:F)に重ねてまとめたいと思っています。 但し、シート「A」は非表示となっていて、また、「***.xls」のファイルは全て「ブックの保護」がかかっているため、シート「A」を表示させるためにはパスワードの入力が必要となります。 これをVBAを使って実行することは可能でしょうか。複雑で手に負えず行き詰っています。 どなたかご存知の方いらっしゃいましたらご教授願います。 エクセル2007を使用しております。  

  • エクセル2007 別ファイル参照

    A列に入力されてる文字列をクリックしたら、別フォルダに登録されているA列に入力されている文字列と同名のファイルを開きたい。 A列 1   → 別フォルダにある、1というファイルを開く。 ABC → 別フォルダにある、ABCというファイルを開く。  別フォルダとは、特定のフォルダになります。

  • VBA

    今、エクセルのVBAの勉強をしているのですが・・・なかなか思うように行きません(-_-;)どなたか教えてくださいませんか?たとえなのですが、A列とB列に数が入っていてc列にA列とB列の合計を順番に表示させたいのです。なおかつA列が空白の時終わる。処理をさせたいのですが。簡単にカウンタを使ってやりたいのですが 何かの本でカウントはI=1+I あと空白はdo until を使ってた気がします。質問の内容の書き方がへたくそでわかりにくいとは思いますがよろしくお願い致します。なかなか理解力がない私ですがお願いします