• ベストアンサー

エクセルVBAでのエラー

おはようございます。 昨日ここでいろいろ教えていただき、300のエクセルファイルから特定の範囲のデータ抽出方法を書いてみたのですが、セルが多すぎて実行できません、というエラーがでてしまいます。 これはどのように解消すればよろしいのでしょうか? Sub Test() Dim FPath1 As String, FPath2 As String Dim FName As String, myBook As String Const startROW As Long = 14, lastROW As Long = 20 Const startCOL As Long = 8, lastCOL As Long = 10 Const shtNAME As String = "sheet1" Application.ScreenUpdating = False FPath1 = "D:\MR5567\" FPath2 = "D:\New Microsoft Excel Worksheet\" Workbooks.Add myBook = ActiveWorkbook.Name FName = Dir$(FPath1 & "*.xls") Do While FName <> "" Workbooks.Open Filename:=FPath1 & FName ActiveWorkbook.Sheets.Select Sheets(1).Activate Sheets.Copy After:=Workbooks(myBook).Sheets(Sheets.Count) Workbooks(FName).Activate Application.DisplayAlerts = False ActiveWorkbook.Close FName = Dir$ Loop ActiveWorkbook.SaveAs Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal ActiveWorkbook.Close Application.ScreenUpdating = True End Sub

  • KIite
  • お礼率48% (55/114)

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

昨日のマクロを特定フォルダの全エクセルファイルに対して実行するならこんな感じですね。 ExecuteExcel4MacroのほうがOPENメソッドよりファイルを開かないだけ早いと思います。 Sub 他ブック参照2() Dim idxR, idxC, pos, ofROW, ofCOL As Integer Dim curROW, curCOL As Long Dim wkSTR1, wkSTR2, wkSTR3, buf As String Const startROW As Long = 14, lastROW As Long = 20 '行範囲を指定 Const startCOL As Long = 8, lastCOL As Long = 10 '列範囲を指定。H:8、J:10 Const shtNAME As String = "Sheet1" 'シート名は固定。ここで指定する curROW = 1 wkSTR1 = "D:\MR5567\" buf = Dir(wkSTR1 & "*.xls") Do While buf <> "" ActiveSheet.Cells(curROW, 1).Select ActiveCell.Value = buf ofROW = 1 ofCOL = 1 For idxC = startCOL To lastCOL For idxR = startROW To lastROW wkSTR3 = "'" & wkSTR1 & "[" & buf & "]" & shtNAME & "'!R" & idxR & "C" & idxC Selection.Cells(1, 1).Offset(ofROW, ofCOL) = ExecuteExcel4Macro(wkSTR3) ofROW = ofROW + 1 Next idxR ofROW = 1 ofCOL = ofCOL + 1 Next idxC curROW = Range("b65536").End(xlUp).Row + 1 buf = Dir() Loop End Sub

KIite
質問者

お礼

ありがとうございました。 お蔭様で無事解決いたしました。 ExecuteExcel4Macroは初めて使いました。 また勉強しなきゃですね。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 コードを読ませていただきました。7行のコピーだから、ひとつのシートにまとめてしまえばよいのでは? 7*300 = 2,100行ですから、そんなに数があるわけではありません。 シートを1,000もしくは、それ以上も増やすのは、物理的に無理だと思います。 前の質問で、早々締めないで、もう少し粘ったほうが良かったですね。回答者の方も、そういう回答だけしかなくて、回答したわけではないので、そちらで解決できたかもしれません。 以下は、元のコードに手を入れてみました。十分テストされているわけではありませんので、ある程度テストをしてから行ってください。特に、今は、ファイルのオープンのエラーは、こちらではありませんので、想像の範囲の中で書いています。エラーが発生した場合は、コピーされたブックは開いたままになります。セル自体のエラーは、コピーされます。 '------------------------------------------------------------------ Sub Test2()  Dim FPath1 As String, FPath2 As String  Dim FName As String, myBook As String  Dim sh As Worksheet  Dim DataBook As Workbook  Dim i As Integer     Const startROW As Long = 14, lastROW As Long = 20  Const startCOL As Long = 8, lastCOL As Long = 10  Const shtNAME As String = "Sheet1" '書き込み用シート' ただし、既存のSheet1.. という名前しかできません。    Application.ScreenUpdating = False    FPath1 = "D:\MR5567\"  FPath2 = "D:\New Microsoft Excel Worksheet\"    Set DataBook = Workbooks.Add    FName = Dir(FPath1 & "*.xls")    i = 1 'コピー先初期行  Do While FName <> ""   On Error GoTo ErrHandler   If FName <> ThisWorkbook.Name Then   With Workbooks.Open(Filename:=FPath1 & FName)       For Each sh In .Sheets     With sh     If WorksheetFunction. _       CountA(.Range(.Cells(startROW, startCOL), .Cells(lastROW, lastCOL))) > 0 Then      .Range(.Cells(startROW, startCOL), .Cells(lastROW, lastCOL)).Copy _       DataBook.Worksheets(shtNAME).Cells(i, 1)             i = i + (lastROW - startROW + 1) '次の行の準備     End If     End With         Next sh    .Close False   End With   FName = Dir()   End If  Loop    DataBook.SaveAs _  Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal  DataBook.Close ErrHandler:  If Err.Number > 0 Then    MsgBox FName & "で、トラブルが発生しました。マクロを終了します。" & vbCrLf & _    Err.Number & ": " & Err.Description, vbExclamation  Else    MsgBox "正常に終了しました。", vbInformation  End If    Set DataBook = Nothing  Application.ScreenUpdating = True End Sub '------------------------------------------------------------------

KIite
質問者

お礼

ありがとうございました。 あまりVBは得意ではないので、アドバイスいただき助かりました。

関連するQ&A

  • VBAでESCキーを無効にしたいのですが、うまくいきません。

    EXCEL VBA でESCキーを無効にするために、 Application.EnableCancelKey = xlDisabled を使用していますが、 特定のフォルダ内のEXCELファイルを開いて、ある処理をして保存するといったプログラムでは、ESCキーを無効にすることができませんでした。 原因を探るために以下のテストプログラムを作成しましたが、実行中にESCキーを押すと(長押しすると確実に) 「実行時エラー'1004' openメソッドは失敗しました。'Workbooks'オブジェクト」 のメッセージが表示されて止まってしまいます。 どこに原因があるのでしょうか? よろしくお願いします。 以下、テストプログラム ////////// Private Sub CbStart_Click() Dim Fname As String Dim Fpath As String Application.ScreenUpdating = False Application.EnableCancelKey = xlDisabled Fpath = "d:\work\" Fname = Dir(Fpath & "*.xlsx") Do While Fname <> "" Workbooks.Open Fpath & Fname CloseWorkbook Fname Fname = Dir() Loop Application.ScreenUpdating = True End Sub 以上 //////////////////

  • ActiveWorkBook VBA

    Sub test() Dim myCSV As String Dim Fname As Variant Dim Aname As String Dim Fullp As String Application.ScreenUpdating = False Fullp = ActiveWorkbook.FullName Pos = InStrRev(Fullp, "\") Fname = Left(Fullp, Pos) myCSV = Dir(Fname & "*.csv") Do Until myCSV = "" Workbooks.Open Fname & myCSV Aname = Left(Fullp, InStr(1, Fullp, ".") - 1) ActiveWorkbook.SaveAs filename:=Aname & ".xls", FileFormat:=xlExcel9795 ActiveWorkbook.Close myCSV = Dir() Loop Kill Fname & "*.csv" End Sub あるフォルダにあるcsvファイルをxlsで保存したいと思いましたが、アクティブになるBOOKがバラバラ? で、うまくいきません。csvファイルを開いたときに そのファイルがアクティブになり、うまくloopできないでしょうか?

  • フォルダ内全ファイルからデータを取得する方法

    お力をお貸しください。 下記のようなコードを書きました。*ドライブにあるフォルダ内全ファイルからデータを取得して、一つの表にまとめようとしています。 が、Workbooks.Open sFileで、「ファイルが存在しません」というエラーがでます。 変数を確認しましたが、きちっと呼び込んでいるのに、ファイルが存在しないとなるのが分かりません。 ここで、データの最終行を取得するのに、ややっこしいコードを書いているのは、データが虫食い状態で、全部のセルが埋まっているのはC列しかないため、このようなことになっています。 よろしくお願いします。 Sub Macro1() Dim FName As String, FPath As String, cnt As Long, r As Long, m As Long, MyMonth As String Dim LastRows As Long Set Wsh = CreateObject("Wscript.Shell") Set Wsh = Nothing m = Range("A1").Value - 1 MyMonth = m & "月" FPath = "*:\" & MyMonth & "\" ChDir FPath FName = FPath & "*.xls" sFile = Dir(FPath  & "*") ' 画面更新オフ Application.ScreenUpdating = False With ThisWorkbook.Sheets(1) LastRows = Cells(Rows.Count, 1).End(xlUp).Row + 1 Do While sFile <> "" If sFile <> ThisWorkbook.Name Then Workbooks.Open sFile cnt = Cells(Rows.Count, 3).End(xlUp).Row + 1 ActiveSheet.Range("A1:" & "M" & cnt).Copy Destination:=ThisWorkbook.Sheets(1).Cells(LastRows, 1) ActiveWorkbook.Close SaveChanges:=False sFile = Dir() End If Loop End With '画面更新オン Application.ScreenUpdating = True ''名前をつけて保存 ' ' Application.DisplayAlerts = False ' Filedate = Format(Date, "yyyymm") ' ActiveWorkbook.SaveAs Filename:=FPath & "\" & Filedate & ".xls" ' Application.DisplayAlerts = True ' ''画面更新オン 'Application.ScreenUpdating = True ' ' End Sub

  • Excel VBA msoAutomationSecurityForceDisableについて

    マクロを無効にしてファイルを読み込むコードを過去レスを見て作成しましたが、msoAutomationSecurityForceDisableを定数でなく、変数としか認識しないため、うまく機能しません。 下記コードのどこを修正すべきか、ご教示願います。 Sub read() Dim DirN As String Dim Fname As String With ThisWorkbook.Worksheets("手当") .Activate .Range(.Cells(7, 1), .Cells(10000, 40)).ClearContents End With Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False DirN = Worksheets("手当").Range("C2").Value & "\" Fname = Dir(DirN & "*.xls") Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Do While Fname <> "" Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False '追加してファイル名を検索する場合はDir関数の引数はなくす。 Fname = Dir() Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Loop End Sub

  • エクセルVBA【ワークシートのコピー】について

    以下のVBA記述で、とあるエクセルファイルのシートをCSV化しようとしております。記述の場合、すべてのワークシートが対象となっていますが、10個くらいあるWorkSheetの【sheets(8)】のみを対象としたいのですが、どのようにしたら良いのでしょうか? お手数ですがご教授下さい。 Sub test() Dim sh As Worksheet Dim fname As String Application.ScreenUpdating = False For Each sh In ActiveWorkbook.Worksheets fname = "C:\temp\" & sh.Name & ".csv" sh.Copy With ActiveWorkbook .SaveAs Filename:=fname, FileFormat:=xlCSV .Close savechanges:=False End With Next sh Application.ScreenUpdating = True End Sub

  • VBAマクロ Path名取得について

    msoFileDialogFilePickerで選択したファイルのフォルダ名を取得したいのですが、エラーが出てしまいます。 初歩的な話かと思いますが、解決できず困っています。 よろしくお願い致します。 --------------------------------------- Dim Pfile as String Dim fName as String, fPath as String Set objDialog = Application.FileDialog(msoFileDialogFilePicker) If objDialog.Show Then Pfile = objDialog.SelectedItems(1) End If    Set objDialog = Nothing fName = Dir(Pfile) fPath = Workbooks(fName).Path ↑ここで、「インデックスが有効範囲にありません」

  • Do Loopの処理結果が思うように得られません。

    VBAの知識がなく、コピペで作業しています。 笑わないで見てください。 作業内容は 「集計用フォルダ内にあるファイル(60個くらいあります)の情報を取得してデータベース化する」 です。 下記のプログラムを作ってみたのですが、ThisWorkbookに各ファイルのデータが 一行ずつずれて貼り付けられてしまい、最終行の一つ下に貼り付けられていません。 画面を見ていると、ファイルは一つずつ開いて閉じてを繰り返しているのですが、 貼り付けは一括で行われます。 ThisWorkbookの扱いで、散々苦労して作ったのですが、あと一歩というところで つまづいてしまいました。 アドバイス、よろしくお願いいたします。 Sub フォルダ内エクセルファイル値取り出し() Dim FName As String Dim FPath As String Dim cnt As Integer Dim r As Long '画面更新オフ Application.ScreenUpdating = False '累積データがある列のデータ下端を取得 cnt = Cells(Rows.Count, 1).End(xlDown).Offset(1, 0).Row FPath = "C:\Documents and Settings\******\デスクトップ\集計用フォルダ(このフォルダは書込み専用です)" '対象フォルダのパス ChDir FPath FName = Dir("*.xls") Do While FName <> "" Workbooks.Open FName Worksheets(1).Range(Selection, ActiveCell.SpecialCells(xlLastCell)) _ .Copy Destination:=ThisWorkbook.Sheets(1).Cells(cnt, 1) cnt = cnt + 1 ActiveWorkbook.Close FName = Dir() Loop '画面更新オン Application.ScreenUpdating = True End Sub

  • VBA★ブックがactivateできません

    簡単なVBAで躓いています。 新しいエクセルファイルを追加して、アクティブにしたいです。 エクセルファイルの名をフォームで入力させ、mybookという変数にしました。 ---------------- Private Sub CommandButton1_Click() mybook = UserForm1.TextBox1.Text Unload Me End Sub ---------------- そして、mybookという名前のファイルを追加しました。 ここまではうまく行きます。 ただ、その後の Workbooks(mybook).Activate で 「実行時エラー”9” インデックスが有効範囲にありません」 が表示されてしまいます。 ---------------- Public mybook As String ---------------- Sub ファイル名変数() UserForm1.Show MsgBox "ファイル名は" & mybook & "です" Workbooks.Add ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & mybook Workbooks(mybook).Activate End Sub ---------------- 一連の処理の中でactivateしたいな、という箇所が何回か出てくるのですが、 Workbooks(mybook).Activate でエラーが出てしまい困っています。 識者の方、何卒アドバイスをお願いいたします。

  • VBAにて複数フォルダのエクセルファイルからデータ抽出を行いたいのですが…

    現在、下記の方法で複数のブックからデータを抽出し、 一覧表示をしています。(一覧表示をしているブックを仮にAとします。) 今のままだと、同一フォルダ内のブックしか抽出されません。 これを、サブフォルダまで対象にするには、どうすれば良いのでしょうか? 簡単に例をあげると、 フォルダ(1)の中にAを入れておいて フォルダ(1)の下にあるサブフォルダ(1)、サブフォルダ(2)の中にあるブックからデータの抽出を行いたいのです。 現在つかっているVBAは Sub 抽出用() Dim FName As String Dim Folder As String Dim wb As Workbook Dim i As Integer, j As Integer Application.ScreenUpdating = False Folder = ThisWorkbook.Path & "\" i = 1: j = 1 Worksheets(1).Cells.ClearContents FName = Dir(Folder & "*.xls") Do While FName <> "" If FName <> ThisWorkbook.Name Then Workbooks.Open (Folder & FName) Workbooks(Workbooks.Count).Worksheets(5).Rows("1:1").Copy _ ThisWorkbook.Worksheets(5).Cells(i + 3, 1) Workbooks(Workbooks.Count).Close Application.StatusBar = j & "ファイル処理済み" i = i + 1: j = j + 1 End If FName = Dir() Loop Application.StatusBar = "" Application.ScreenUpdating = True MsgBox ("完了しました") End Sub です。 いいお知恵があれば、よろしくお願い致します。

  • 保護されたブックのコピーについて

    現在、ボタンを押すと新規ブックが作成され、最初のブックのシートをコピーするというマクロを組みました。 しかし、元になるブックにはブックの保護とシートの保護を両方かけていて、途中でエラーになるはずなのですが、何故かそうならずに普通に新規ブックにコピーがされます。 上手くいったのですがエラーが出ると予想していたので気持ちが悪く、また個人だけで使うわけじゃないので原因を知っておきたいです。 どなたかよろしくお願いします。 Private Sub makeBookButton_Click() Dim myWorkBook As String Dim newWorkBook As String Dim mySheet As Worksheet Application.ScreenUpdating = False On Error GoTo ErrTrap Application.DisplayAlerts = False myWorkBook = ThisWorkbook.Name Workbooks.Add ActiveWorkbook.SaveAs Filename:=NEWBOOK newWorkBook = ActiveWorkbook.Name Workbooks(myWorkBook).Activate For Each mySheet In ThisWorkbook.Worksheets Workbooks(myWorkBook).Sheets(mySheet.Name).copy after:=Workbooks(newWorkBook).Sheets(Workbooks(newWorkBook).Sheets.Count) Next Workbooks(NEWBOOK).Sheets("Sheet1").Delete Workbooks(NEWBOOK).Sheets("Sheet2").Delete Workbooks(NEWBOOK).Sheets("Sheet3").Delete Application.DisplayAlerts = True Application.ScreenUpdating = True Exit Sub ErrTrap: Call MsgBox("ブック作成時にエラーが発生しました。", vbCritical) End Sub

専門家に質問してみよう