複数のエクセルシートをまとめるマクロ

このQ&Aのポイント
  • エクセルシートをまとめるマクロについて解説します。複数のエクセルファイルを一つにする際、100万件を超える場合はcsvで保存するように変更する必要があります。
  • マクロを実行すると、指定したエクセルファイルの複数のシートを一つのシートにまとめます。ただし、まとめたデータが100万件を超える場合はcsvで保存するように変更してください。
  • 複数のエクセルシートをまとめるマクロの使い方を紹介します。まとめたいシートを指定し、マクロを実行すると一つのシートにまとめられます。ただし、データが100万件を超える場合はcsvで保存するように変更が必要です。
回答を見る
  • ベストアンサー

複数のエクセルシートをまとめるマクロ

下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.5

こんにちは 処理能力高い環境なんですね。 Sub test()   Dim t As Single   Dim strPath As String   Dim strFileName As String   Dim WB1 As Workbook   Dim WS1 As Worksheet   Dim WS2 As String   Dim i As Long   Dim SaveDir As String   Dim ShellObj As Object   Dim j As Long      t = Timer    SaveDir = "C:\temp\" & Format(Date, "yyyymmdd")    If Dir(SaveDir, vbDirectory) = "" Then     MkDir SaveDir   End If   strPath = ThisWorkbook.Path      WS2 = strPath & "\test1222.csv"      strFileName = Dir(strPath & "\*.xls*")   Do While strFileName <> ""     If strFileName <> ThisWorkbook.Name And Not strFileName Like "*.lnk" Then       j = j + 1       Set WB1 = Workbooks.Open(strPath & "\" & strFileName)       Set WS1 = WB1.Worksheets(1)       WS1.Copy       ActiveWorkbook.SaveAs SaveDir & "\" & Format(Now(), "yyyymmdd hhmmss") & "_" & j & ".csv", xlCSV       ActiveWorkbook.Close False       WB1.Close False     End If     strFileName = Dir   Loop    Set ShellObj = CreateObject("WScript.Shell")    ShellObj.Run "CMD.EXE /C type """ & SaveDir & "\*.csv"" > """ & WS2 & """", 0, True    Kill SaveDir & "\*.csv"   RmDir SaveDir   MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub で、試してみて下さい。

ticktak
質問者

お礼

早速ありがとうございます。今度はうまくいきました。動きがBeautifulです。美しいです。 PCスペックは高いです。

その他の回答 (5)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.6

回答No.1です。 大変、申し訳ございませんでした。 WB1.SaveAs Filename:=strPath & "\" & Replace(WB1.Name, "xls", "csv"), FileFormat:="xlCSV" でした。 先ほどのマクロは、自分自身を「csv」形式で保存してしまっていました。 「WB1.Name」で、「WB1」は、質問者が開いている Set WB1 = Workbooks.Open(strPath & "\" & strFileName) ですね。 そのファイルの名前が「WB1.Name」ですが、これには「xls」という拡張子も含まれているので、「Replace()」で、「xls」を「csv」に置換しているわけです。

ticktak
質問者

お礼

「アプリケーション定義またはオブジェクト定義のエラーです」が追加した場所で出てしまいます。対処の仕方を教えていただけますか。

  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.4

私の想像ですが、データが 100万件を超えるということは、出力結果をエクセルでなくほかのプログラムで見るのか目的だと思いました。 ファイルに直接データを書き込むのがいいと思います。 ' Option Explicit ' Sub Macro1() '   Dim t As Date   Dim FileName As String   Dim Camma As String   Dim IY As Long   Dim IX As Integer '   t = Timer   ChDir ThisWorkbook.Path   FileName = Dir("*.XLS*")   Open "OutPut.csv" For Output As #1 '   Do While FileName > "" '     If FileName <> ThisWorkbook.Name Then       Workbooks.Open FileName '       For IY = 1 To Cells(Rows.Count, "A").End(xlUp).Row         Camma = "" '         For IX = 1 To Cells(IY, Columns.Count).End(xlToLeft).Column           Print #1, Camma; Cells(IY, IX);           Camma = ","         Next IX         Print #1,       Next IY       ActiveWorkbook.Close     End If     FileName = Dir   Loop   Close   t = Timer - t   MsgBox "まとめ処理をしました。処理時間 " & Format(t / 86400, "h:mm:ss") ' End Sub

ticktak
質問者

お礼

後想像の通りです。エクセルファイルを一旦まとめてアクセスに取り込みます。 実行してみましたが、動いてはおりますが、OutPutファイルがからのままです。修正点ご指示下さい。

回答No.3

> 100万件を超えるため なのにエクセルで頑張ろうとなさるのですね。   https://support.office.com/ja-jp/article/Excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E5%88%B6%E9%99%90-ca36e2dc-1f09-4620-b726-67c00b05040f ま、1,048,576行を超えないようにご注意ください。 なお、CSVとして保存するときの云々は     ActiveWorkbook.SaveAs Filename:="パス\ファイル名.csv", _                FileFormat:=xlCSV, CreateBackup:=False 「マクロの記録」機能を使うと、こんな感じに書かれます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは Sub test()   Dim t As Single   Dim strPath As String   Dim strFileName As String   Dim WB1 As Workbook   Dim WS1 As Worksheet   Dim WS2 As String   Dim i As Long   Dim SaveDir As String   Dim ShellObj As Object   t = Timer      SaveDir = "C:\temp\" & Format(Date, "yyyymmdd")      If Dir(SaveDir, vbDirectory) = "" Then     MkDir SaveDir   End If      strPath = ThisWorkbook.Path      WS2 = strPath & "\test1222.csv"      strFileName = Dir(strPath & "\*.xls*")   Do While strFileName <> ""     If strFileName <> ThisWorkbook.Name Then       Set WB1 = Workbooks.Open(strPath & "\" & strFileName)       Set WS1 = WB1.Worksheets(1)       WS1.Copy       ActiveWorkbook.SaveAs SaveDir & "\" & Format(Now(), "yyyymmdd hhmmss") & "_1.csv", xlCSV       ActiveWorkbook.Close False       WB1.Close False     End If     strFileName = Dir   Loop      Set ShellObj = CreateObject("WScript.Shell")      ShellObj.Run "CMD.EXE /C type """ & SaveDir & "\*.csv"" > """ & WS2 & """", 0, True      Kill SaveDir & "\*.csv"   RmDir SaveDir   MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub こんな感じで出来ますか?

ticktak
質問者

お礼

ありがとうございます。 しかし実行すると何度も「すでに同じファイルがあります」とメッセージが出て、OKを押し続けて終了すると、一番最後のファイルが書式がクリアーされた状態で開いているだけの状態になりました。合体はされていないようです。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

WB1.Close False の上に WB1.SaveAs Filename:=strPath & "\" & Replace(ThisWorkbook.Name, "xls", "csv"), FileFormat:="xlCSV" とすれば、「csv」ファイルとして書き出されますが、質問者のマクロを見ていると、「xls」しかないのですよね?

ticktak
質問者

お礼

ありがとうございます。 しかし「アプリケーション定義またはオブジェクト定義のエラーです」となります。 追加した部分で止まっているようです。どうしたらよいか教えていただけると助かります。

関連するQ&A

  • 最終セルまでデータを反映させるマクロ

    あるサイトからの利用コードです。 それをアレンジしようとしましたが、つまずきました。 マクロコードをご教示ください。 あるフォルダに複数のエクセルファイルがあります。 構成が同じシート(名前は同じ。仮に "各シート")を、 別ブック(仮に "まとめ")の一つのシートに纏めます。 その時、複数ファイルの D4のデータだけは "まとめ"ブックのL列に反映させたいのですが、 下記コードを使用すると、どこにどのようなコードを入れたら良いのでしょうか? 因みに複数ファイルの8行目からコピーされ、 複数ファイルのCからM列は まとめブックのAからK列に反映されるようになってます。 (まとめブックの1行目は見出し) Dim i As Integer Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long Set WS2 = Sheets("まとめ") strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Sheets("各シート") With WS1.Range("C7") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 11).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With _____ここで つまずく_____    With WS1.Range("D4")     .Copy WS2.Range("L" & WS2.Rows.Count).End(xlUp).Offset(1)     WS2.Range("L" & WS2.Rows.Count).End(xlUp).AutoFill Destination = Range("E1048576").End(xlUp).Row _____ここまで つまずく_____ WB1.Close False End If strFileName = Dir Loop End Sub エクセル2013です。 宜しくお願い致します。

  • 【VBA】複数のブックを1つのシートにまとめる

    あるフォルダ内に複数のブックが入っており、新しいブックに1シートでまとめようとしております。 フィルターを使用すればよいのかもしれませんが、マクロを使用したいです。 (1)全て同じフォーマットである (2)全てA17から数値が入力されているので、16行目まではフォーマットを残し、A17行目以降K列までをコピーして結合したい Sub 結合() '結合したいファイルがあるフォルダの場所 cドライブなら "C:\test\" Const Fol As String = "C:\test\" Dim Fn Dim NewFile As Workbook Dim Wb As Workbook Dim Ws1 As Worksheet Dim R As Range Set NewFile = Workbooks.Add Set Ws1 = NewFile.Worksheets(1) Set R = Ws1.Range("A17") Fn = Dir(Fol, vbNormal) Do Until Fn = "" Set Wb = Workbooks.Open(Fol & Fn) 'ワークシート1をコピーする場合は Wb.Worksheets(1) Set Ws1 = Wb.Worksheets(1) 'タイトル行を設定 If ck = False Then For cnt = 1 To 4 Wb.Worksheets(cnt).Range("A1:J16").Copy Destination:=NewFile.Worksheets(cnt).Range("A1") Next cnt ck = True End If For cnt = 1 To 4 Set Ws1 = NewFile.Worksheets(cnt) Set Ws2 = Wb.Worksheets(cnt) R = Ws1.Cells(Rows.Count, 1).End(xlUp).Row + 1 With Ws2 End With Next 'A17行目からコピーして結合する(→本当はA17行目~K列までを反映したい) Ws2.Range("A17", Ws2.Cells(Rows.Count, 3).End(xlUp)).Resize(, 20).Copy R If R.Offset(1).Value = "" Then Set R = R.Offset(1) Else Set R = R.End(xlDown).Offset(1) End If Wb.Close 'Debug.Print Fn Fn = Dir Loop Set R = Nothing Set Ws1 = Nothing: Set Ws2 = Nothing Set Wb = Nothing: Set NewFile = Nothing End Sub マクロは触ったことない初心者でグーグル検索をしながら作ってみました。 一応実行するとエラーは出ないのですが、結合されたリストが飛び飛びで、理由がわかりません。 どなたかおわかりになりますでしょうか・・・。

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • EXCELマクロ シートのありなし

    EXCELのマクロでシートの存在を返す関数を作っています。 一応動くのですが、ブックをいちいちアクティブにしているのが 気に入りません。スマートな手法を教えて頂けませんか。 よろしくお願いします。 例)  A.xls、B.xls、C.xls、D.xlsのように複数のブックが開かれています。  マクロは、マクロ.xlsというファイルに記述しているとします。  例えば、A.xlsというファイルにsheet4という名前のシートが存在するか調べたい。 Function isExistingSheetName2(Bookname As String, sheetname As String) As Boolean Dim wb As Workbook Dim ws As Worksheet Dim flag As Boolean Dim wbown As Workbook Dim wsown As Worksheet '現在を記憶 Set wbown = ThisWorkbook Set wsown = ActiveSheet '判定 Set wb = Workbooks(Bookname) wb.Activate                  ’←特に気に食わない   For Each ws In Worksheets If ws.Name = sheetname Then flag = True Next ws '元に戻る wbown.Activate                ’←気に食わない    wsown.Select                 ’←若干気に食わない   '戻り値 If flag = True Then isExistingSheetName2 = True Else isExistingSheetName2 = False End If End Function ’excel 2002 SP3 ’windowsXP Pro SP3

  • エクセルVBA フォルダ内のどんなシート名であっても読み込みたい

    フォルダ内の別ブック(D3で指定)の「情報」シートを読み込んで対象年月日に該当するデータを抽出して別ブックに貼り付けるものなんですが、下のコードではSet ws = wb.Worksheets("情報")と、なっていて、限定しているのですが、これをD3のファイルのどんなシート名であっても読み込みたいのですが、どのようにコードにしたらいいでしょうか?D3で指定するブックには必ずひとつのシートしかありません。 よろしくお願いします。 Sub test_1() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("メニュー") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("情報") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With End sub

  • ブック内に特定名のシートがある場合

    はじめまして、こんにちは。 VBAを最近はじめたばかりの者です。質問が初歩的なもので申し訳ないのですが是非教えてください。 以下を使って、複数ブックの○○というシートから指定セルの内容を抜き出したいと思っています。 ところが、ブックによっては○○というシートが存在しない場合があり、その場合には「インデックスが有効でない」というエラーで動作が止まってしまいます。 ブック内に○○というシートがある場合にのみ動作させるようにするにはどのようにすれば良いのでしょうか。 よろしくお願いします。 Dim wb As Workbook, myRow As Long Dim e As Integer myRow = ThisWorkbook.Worksheets(1).Rows.Count With Application.FileSearch .NewSearch .LookIn = ThisWorkbook.Path .SearchSubFolders = True .FileType = msoFileTypeExcelWorkbooks If .Execute() > 0 Then For i = 1 To .FoundFiles.Count If .FoundFiles(i) <> ThisWorkbook.FullName Then Set wb = Workbooks.Open(.FoundFiles(i), UpdateLinks:=0) Application.ScreenUpdating = False ThisWorkbook.Worksheets(1).Range("A" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F6").Value ThisWorkbook.Worksheets(1).Range("B" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F7").Value ThisWorkbook.Worksheets(1).Range("C" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F8").Value ThisWorkbook.Worksheets(1).Range("D" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("Y6").Value wb.Close False End If Next i Else MsgBox "ファイルがありません。" End If End With End Sub

  • 複数ファイルの1つのシート中の総行数を求めるには

    大変お世話になっております。 複数ファイルの1つのシート(カテーログ)中の最終行数を求めるのに、下記のマクロを書いて実行しましたが、エラーは出ませんが総行数など、何も反応がありません。なにも出力しない原因がお分かりでしたら、ご教示頂けると大変たすかります。まだまだマクロは超初心者です。 出力したい情報は、ファイル名とA列の3行目~最終行の総行数です。 Sub データ総行数求め() Dim fpath As String, fname As String Dim wb As Workbook, ws As Worksheet Dim crow As Long, cnt As Long fpath = "C:\Users\Owner\Documents\連結作業\202304-202309\)" fname = Dir(fpath & "*.xlsx") Set ws = ThisWorkbook.Worksheets("test") crow = 1 Do Until (fname = "") Set wb = Workbooks.Open(fpath & fname) If (sheet_chk(wb, "カテーログ") = True) Then cnt = count_row(wb.Worksheets("カテーログ")) Worksheets("カテーログ").Range("A3").Value ws.Cells(crow, 1).Value = fname ws.Cells(crow, 2).Value = "カテーログ" ws.Cells(crow, 3).Value = cnt crow = crow + 1 End If wb.Close fname = Dir() Loop End Sub '戻り値の定義 Function count_row(ByVal ws As Worksheet) As Long Dim k As Long, tmp As Long count_row = 0 For k = 1 To 256 tmp = ws.Cells(ws.Rows.Count, k).End(xlUp).Row If (tmp > count_row) Then count_row = tmp Next End Function Function sheet_chk(ByVal wb As Workbook, ByVal msg As String) As Boolean Dim w As Worksheet sheet_chk = False For Each w In wb.Worksheets If (w.Name = msg) Then sheet_chk = True Exit For End If Next End Function

  • 複数シートをブックにするマクロを応用して。。

    1ブック内にyymmdd(日付)シートが多数あり、それを月別yymmごとブックを作成するマクロです。 これは以前、回答して頂いた「n-jun」さんの構文です(n-junさん、重宝しています、感謝!) Private Sub CommandButton1_Click() Dim myDic As Object Dim wb1 As Workbook Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim myKey Set myDic = CreateObject("Scripting.Dictionary") Set wb1 = ThisWorkbook Application.ScreenUpdating = False For Each sh In wb1.Worksheets myDic(Left(sh.Name, 4) & "_") = Empty Next For Each myKey In myDic.keys For Each sh In wb1.Worksheets If InStr(sh.Name, Left(myKey, 4)) > 0 Then If wb Is Nothing Then wb1.Worksheets(sh.Name).Copy Set wb = ActiveWorkbook Else wb1.Worksheets(sh.Name).Copy after:=wb.Sheets(wb.Sheets.Count) End If End If Next Application.DisplayAlerts = False wb.SaveAs Filename:="C:\仕事\月別" & "\" & Left(myKey, 4) & ".xls" wb.Close Set wb = Nothing Application.DisplayAlerts = True Next Application.ScreenUpdating = True Set myDic = Nothing Worksheets("main").Activate MsgBox "出力完了" End Sub 実は、これをフォルダ内のブックの場合は? として応用ができないか悩んでいます。 つまり、フォルダ内にyymmddブックが多数あり、 これを月別yymmとして、それぞれまとめたいのです。 Set wb1 = ThisWorkbookの箇所が、 フォルダ内のブック指定になると思うのですが、 下記コードでどうなんでしょうか?動きません。 myfdr = "C:\仕事\月別" fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 Set wb1 = Workbooks.Open(myfdr & "\" & fname) 変更箇所、アドバイス頂ければ助かります。お願いします

  • 複数シートを順番に範囲指定してソートしたい

    以下のコードでアクセスからデータをエクスポート後に 複数(50くらい)シート名を変更し、シートを並び替えし、 列幅を整えています。 次にデータをソートしたいのですが、うまく範囲指定が できないで2日くらいすぎてしまいました。 以下の**でかこった部分で定義ができません。 どなたかお助けしていただけないでしょうか? よろしくお願いします。 うまく改行できないですいません・・。 **************************************************** h = 1 o = 29 ws.Columns(h & ":" & o).Select 範囲指定したいのはA列からAC列までのデータの入った 行数までです。 With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToUP)) **************************************************** Private Sub CommandButton1_Click() Dim path$, wb As Workbook, wbName$ Dim ws As Worksheet, i& Dim intLoopA As Integer Dim intLoopB As Integer Dim h As Long Dim o As Long path = ThisWorkbook.path & "\" wbName = Dir(path & "*.xls") Do Until wbName = "" If wbName <> ThisWorkbook.Name Then Set wb = Workbooks.Open(path & wbName) i = 2 For Each ws In wb.Worksheets If Trim(ws.Range("A2")) <> "" Then On Error Resume Next ws.Name = ws.Range("A2") If Err.Number <> 0 Then ws.Name = ws.Range("A2") & " (" & i & ")" i = i + 1 End If On Error GoTo 0 End If For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA With ws.Rows(1) With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToLeft)) .Interior.ColorIndex = 15 .EntireColumn.AutoFit End With End With h = 1 o = 29 ws.Columns(h & ":" & o).Select With ws.Range(.Cells(1), .Cells(ws.Columns.Count).End(xlToUP)) .Sort _ Key1:=Range("G1"), Order1:=xlDescending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End With End With DoEvents Next wb.Save End If wbName = Dir Loop Set wb = Nothing Set ws = Nothing MsgBox "処理が完了しました。", vbInformation, "処理確認" End Sub

  • エクセルVBAでファイル作成

    エクセルVBAで、データをフィルタで抽出し、別なBOOKの指定シートに転記し、名前をつけて保存したいのです。一応、下記のコードでテストは成功しました。 しかし下記コードでは1回ごとにデータの転記先を開かなくてはなりません。 処理する件数が多いので、できればいちいち新たに開き直さなくともよい方法はないでしょうか? 最初から開いておいて、転記後名前をつけて保存すると、開いていたファイルが閉じてしまい、うまくいきません。 別BOOKでなく別シートに転記して、そのシートをMoveして別ファイル保存ならわかるのですが、今回はどうしても別BOOKに転記しなければなりません。 よろしくお願いします。 Option Explicit Sub データ分割転記()   Dim myPth As String, fname As String   Dim myRng As Range, myC As Range   Dim i As Long, x As Long   Dim wb(2) As Workbook   Dim ws As Worksheet   Dim t As Single   t = Timer   Set wb(0) = ThisWorkbook   myPth = wb(0).Path   With wb(0).Sheets("Key")     Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData   End With      For Each myC In myRng     Application.EnableEvents = False     Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm")     Set ws = wb(1).Sheets("List")        With wb(0).Sheets("DATA")       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9")       .ShowAllData     End With     With ws       x = .Cells(Rows.Count, "A").End(xlUp).Row       myC.Offset(, 2).Value = x '行数確認       .Range("A9").Value = 1       If x > 9 Then         .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番       End If     End With     wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm"     wb(1).Close (False)     Application.EnableEvents = True     i = i + 1   Next   MsgBox i & "件を完了" _   & vbCrLf & Timer - t & " Sec." End Sub *Application.EnableEvents = False を使っているのば別BOOKが持つイベントマクロを作動させないためです。

専門家に質問してみよう