• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで複数のブックを開かずに処理する方法)

VBAで複数のブックを開かずに処理する方法

このQ&Aのポイント
  • VBAを使用して、複数のブックを開かずに特定のシートから値を参照し、別のシートに書き出す処理を行いたいと思っています。
  • 複数のブックにある特定のシートから値を参照する必要がありますが、フォーマットが異なるため、条件分岐が必要です。
  • 現在、繰り返し処理を使用してブックを一つずつ開いて参照していますが、エラーが発生しています。どのようにすれば処理が可能でしょうか?

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

例えば、同一フォルダ内にあるBook1、Book2、Book3のそれぞれSheet1のA1にある値を抜き出すとしたらこんな感じで出来ますが、、、 マクロを記述したブックを必ず上記ファイルと同じフォルダに保存してから実行します。 Sub Test()  For i = 1 To 3   Range("A" & i).Value = _     "='" & ThisWorkbook.Path & _     "\[Book" & i & ".xls]Sheet1'!A1"   Range("A" & i).Value = Range("A" & i).Value  Next i End Sub > やるべきかと思い、Workbook Openで組んでみましたが > 別のブック扱いなので、やはりエラーが出て悩んでます。 > 自分としては、どちらの処理でも構わないと思っています。 Open 出来るなら、変数に代入して処理すれば良いのです。 Sub Test1() Dim wb As Workbook  Set wb = Workbooks.Open(ThisWorkbook.Path & "\Book1.xls")  MsgBox wb.Name & "の最初のシートは" & vbCrLf & wb.Worksheets(1).Name  MsgBox wb.Name & "を閉じます", vbInformation  wb.Close End Sub

kenken-papa
質問者

補足

papayukaさん、説明不足な内容に 2つの方法を教えて頂きありがとうございます。 教えて頂いた方法は知らなかった訳ではないのですが 処理上の問題なのか、上手く動作してくれなかったのです。 まず以下のプログラムでユーザーフォームのリストボックスに フォルダ内のプログラム実行ファイル以外を読み込ませています。 '***************[ 取込み ]*************** Private Sub GetSheetsButton_Click() Dim exBookPath As String Dim exlBook As String Dim nCount As Integer '■ 絶対パスの取得 exBookPath = ThisWorkbook.Path '■ エクセルファイルのみをDir関数で取得 exlBook = Trim(Dir(exBookPath & "\" & "*.xls", 16)) If exlBook = "" Then MsgBox "ファイルがありません!" Exit Sub End If '■ リストの初期化 ChangeCsvForm.ExlFilesListBox.Clear '■ 見積関連のエクセルブック取込み nCount = 1 Do While exlBook <> "" If Left(exlBook, 2) <> "出力" Then ExlFilesListBox.AddItem exlBook End If exlBook = Dir nCount = nCount + 1 Loop End Sub このリストカウントを元に、出力を行いたくプログラムを 以下で組みましたが上手くいきません。 根本的に何かを間違ってるとは思うのですが。。。。。 '***************[ 一括出力 ]*************** Private Sub DateOutputButton_Click() Dim i As Integer Dim ListTotal As Integer Dim ChoiceBtn As String Dim FileDate As String Dim wb As Workbook '■ 出力の有無を確認 ChoiceBtn = MsgBox("リスト内のファイルデータを出力します。宜しいですか?", vbYesNo) If ChoiceBtn = 7 Then Exit Sub End If ListTotal = ChangeCsvForm.ExlFilesListBox.ListCount '■ リストにデータが無い場合の処理 If ListTotal = 0 Then MsgBox ("リスト内にブックデータが存在しません!") Exit Sub End If For i = 1 To ListTotal i = i - 1 FileDate = ChangeCsvForm.ExlFilesListBox.List(i) Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileDate) If Worksheets("見積").Range("A5") = "A" Then Workbooks("出力").Sheets("出力用データ").Cells(i, 10).Value _ = Worksheets("見積").Range("B2").Value ElseIf Worksheets("見積").Range("A5") = "B" Then Workbooks("出力").Sheets("出力用データ").Cells(i, 10).Value _ = Worksheets("見積").Range("B3").Value ElseIf Worksheets("見積").Range("A5") = "C" Then Workbooks("出力").Sheets("出力用データ").Cells(i, 10).Value _ = Worksheets("見積").Range("B4").Value End If Next i End Sub 説明用にブック・シート・セルの取得などは仮の物です。 また、テスト段階で更に複雑に処理する事になります。 このプログラムをステップで確認していくと 条件分岐の所で「インデックスが有効ではない」エラーが 発生します。とても初歩的な内容かもしれませんが。。。 このような感じで、先に進めずに困り果てている状態です。 自分なりに色々調べてみたりはしてるのですが 要求内容が複雑なので、助言頂ければ助かります。 宜しくお願いします。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#2です。 ここまで書けるなら、単なるポカでしょうか?  For i = 1 To ListTotal   i = i - 1 これだと i はどうなります? For の変数をループの中で操作すると思わぬ落とし穴にハマります。 また、List の最初のIndexは 0 ですので ListCount値までループを繰り返す事は出来ません。 ListCountが 5 でも、List の Index は0~4です。 それに その後の IF文で Else が無い事を考えると i と Cells の変数を別け、最終行を常に見にいった方が確実に思えます。  For i = 0 To ListTotal - 1 '  i = i - 1   j = Workbooks("出力.xls").Sheets("出力用データ"). _       Cells(65536, 10).End(xlUp).Offset(1, 0).Row   FileDate = ChangeCsvForm.ExlFilesListBox.List(i)   Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileDate)    If Worksheets("見積").Range("A5") = "A" Then      Workbooks("出力.xls").Sheets("出力用データ").Cells(j, 10).Value _       = Worksheets("見積").Range("B2").Value

kenken-papa
質問者

お礼

papayukaさん、度々の助言ありがとうございますm(_ _)m おっしゃる通り、単なるポカみたいです(^^; Listの最初が0なので、1 To ●● を極当たり前の ように使っていて、リストの最初のファイル名を 取得してこないので、単純に-1でループ内に 入れてしまっていた事が、悩みの原因だったようで。。。 ご指摘ありがとうございました。 papayukaさんの参考ソースで変更したところ 上手く処理が出来るようになりましたm(_ _)m また何かありましたら宜しくお願いします。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

こんばんは。 For i = 1 To ListTotal i = i - 1 この i=i-1 が原因です。 スタートで i = 0 になるので後のIF文   If Worksheets("見積").Range("A5") = "A" Then Workbooks("出力").Sheets("出力用データ").Cells(i, 10).Value の Cells(i,10) は Cells( 0, 10 ) となりエラー。 それよりも大問題があります。 i = i - 1 では永久ループになりませんか? R = i - 1 とか別の変数で受けるべきだと思いますが。 以上です。

kenken-papa
質問者

お礼

taocatさん、回答ありがとうございますm(_ _)m よもや、ループカウンターに落とし穴があるとは 気づいてすらいませんでした。 まだまだ勉強不足ですね(^^; また何かありましたら、宜しくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

開いては行けない理由とは何ですか? 開いて処理するならば、目的の処理が実現できている、と読めますが。 ScreenUpdating = False を設定すれば、画面上では 更新中画面が「見えなく」なりますのでお試しください。 終了時にはScreenUpdating = Trueを忘れずに。

kenken-papa
質問者

補足

bin-chanさん、回答ありがとうございます。 >開いては行けない理由とは何ですか? 説明不足で申し訳ないです。 特に開いてはいけない理由はありません。 開いても開かなくてもエラーになるので ご質問させていただきました。

専門家に質問してみよう