• ベストアンサー

エクセルで複数ファイルコピー保存

こういうことがやりたいです。 1、新規ブック作成 2、1997フォルダー内の19970303日報1を開きA1:K38をコピーし新ブック(sheet1)A1に貼り付け、次に19970303日報2を開きB3:K36をコピーし新ブック(sheet1)L5に貼り付ける。名前をつけて保存(新ブックのK2をファイル名にする)。すべて閉じる。また1からはじめ、同じ作業を次のファイル19970304日報1、19970304日報2に対して行う。  日報ファイルはファイル名が日付になっているため順番に並んでいます。またシートは1つです。  前にこのサイトで教えていた大ことを参考に作ってみましたが、日報ファイルが開いてコピーまでは動いていますが、貼り付けができないです。また名前をつけて保存もできないです。  初心者のため完全に理解して作っていなくておはづかしいですがご教授よろしくお願いします。 Sub copybook7() Dim myPath As String 'このブックのパス Dim DataFile As String 'Dir()で開くブック名 Dim copybook As Workbook '開いたブック Dim DataSht As Worksheet 'このブックの貼り付けシート Dim i As Long '貼り付け行カウンタ Workbooks.Add With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With With ActiveSheet.PageSetup Range("A1:G1,L1:AG1").ColumnWidth = 9 Range("H1:K1,AH1").ColumnWidth = 12 End With With ThisWorkbook Set DataSht = .Worksheets(1) myPath = "C:\1997\" DataFile = Dir(myPath & "*.xls", vbNormal) i = 1 Do While DataFile <> "" If DataFile <> .Name And _ InStr(1, DataFile, "日報") > 0 Then Set copybook = Application.Workbooks.Open( _ Filename:=myPath & DataFile, ReadOnly:=True) If InStr(1, DataFile, "日報1") > 0 Then copybook.ActiveSheet.Range("A1:K38").Copy DataSht.Range("A1").PasteSpecial Paste:=xlAll ElseIf InStr(1, DataFile, "日報2") > 0 Then copybook.ActiveSheet.Range("B3:K36").Copy DataSht.Range("L5").PasteSpecial Paste:=xlAll Else End If Application.DisplayAlerts = False copybook.Close SaveChanges:=False Application.DisplayAlerts = True Set copybook = Nothing End If DataFile = Dir ActiveWorkbook.SaveAs Filename:=ActiveSheet.Range("K2") & "日報" .Close Loop Set DataSht = Nothing End With End Sub

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

  • ベストアンサー
  • avanzato
  • ベストアンサー率54% (52/95)
回答No.3

#1です。 個人用マクロブック=自分自身という意味です。 個人用マクロブックがどういう物かは分かりませんがとりあえず実行用のブックが日報と同じフォルダに入っているとして改修した以下のプログラムをお試しください。 Sub copybook7()   Dim MyPath As String 'このブックのパス   Dim DataFile As String 'Dir()で開くブック名   Dim CopyBook As Workbook '開いたブック   Dim NewBook As String '新しいブック   Dim NewFileName As String '新しいファイル名   MyPath = ThisWorkbook.Path & "\"   DataFile = Dir(MyPath & "*.xls", vbNormal)   Do While DataFile <> ""     If DataFile <> ThisWorkbook.Name And InStr(1, DataFile, "日報") > 0 Then       Set CopyBook = Application.Workbooks.Open(Filename:=MyPath & DataFile, ReadOnly:=True)       Select Case Mid(DataFile, 9, 3)         Case "日報1"           Workbooks.Add           NewBook = ActiveWorkbook.Name           With Workbooks(NewBook).ActiveSheet             .PageSetup.PrintTitleRows = ""             .PageSetup.PrintTitleColumns = ""             .Range("A1:G1,L1:AG1").ColumnWidth = 9             .Range("H1:K1,AH1").ColumnWidth = 12           End With           CopyBook.ActiveSheet.Range("A1:K38").Copy           Workbooks(NewBook).ActiveSheet.Range("A1").PasteSpecial Paste:=xlAll           Application.CutCopyMode = False           CopyBook.Close         Case "日報2"           CopyBook.ActiveSheet.Range("B3:K36").Copy           Workbooks(NewBook).ActiveSheet.Range("L5").PasteSpecial Paste:=xlAll           Application.CutCopyMode = False           CopyBook.Close           Application.DisplayAlerts = False           NewFileName = Workbooks(NewBook).ActiveSheet.Range("K2").Value & "日報.xls"           Workbooks(NewBook).SaveAs MyPath & NewFileName           Application.DisplayAlerts = True           Workbooks(NewFileName).Close       End Select     End If     DataFile = Dir   Loop   MsgBox ("完了") End Sub

root38_001
質問者

補足

ありがとうございます。 日報ファイルが開くだけです。 新規のファイルを作り、それに既存のファイルの内容をコピーし名前を付けて保存。また新規のファルを作り、そこへ次の既存のファイルをコピーし名前を付けて保存という作業なのですが、、、。

その他の回答 (5)

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.6

#1です。 NewFileName = Workbooks(NewBook).ActiveSheet.Range("K2").Value & "日報.xls" を次のように変更してください。 NewFileName = Format(Workbooks(NewBook).ActiveSheet.Range("K2").Value, "yyyymmdd") & "日報.xls" K2の値が日付であれば「20100203日報.xls」と言う名前になります。

root38_001
質問者

補足

ありがとうございました。 完成しました。長々とお付き合いくださり本当に助かりました。 これからもよろしくお願いします。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

こんな感じでは? Sub copybook7() Dim myPath As String 'このブックのパス Dim DataFile As String 'Dir()で開くブック名 Dim copybook As Workbook '開いたブック Dim AddBook As Workbook '新規book Dim i As Long '貼り付け行カウンタ myPath = "C:\1997\" DataFile = Dir(myPath & "*.xls", vbNormal) Do While DataFile <> "" If DataFile <> .Name And _ InStr(1, DataFile, "日報") > 0 Then Set copybook = Application.Workbooks.Open( _ Filename:=myPath & DataFile, ReadOnly:=True) If InStr(1, DataFile, "日報1") > 0 Then copybook.Worksheets(1).Copy Set AddBook = ActiveWorkbook ElseIf InStr(1, DataFile, "日報2") > 0 Then With AddBook.Worksheets(1) copybook.Worksheets(1).Range("B3:K36").Copy AddBook.Worksheets(1).Range("l5") .PageSetup.PrintTitleRows = "" .PageSetup.PrintTitleColumns = "" .Range("A1:G1,L1:AG1").ColumnWidth = 9 .Range("H1:K1,AH1").ColumnWidth = 12 AddBook.SaveAs Filename:=myPath & Format(.Range("K2").Value, "yyyymmdd") & "日報" _ , FileFormat:=xlNormal End With ActiveWindow.Close Set AddBook = Nothing End If Application.DisplayAlerts = False copybook.Close SaveChanges:=False Application.DisplayAlerts = True Set copybook = Nothing End If DataFile = Dir Loop End Sub 参考まで

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.4

#1です。 補足を頂きました件ですが日報を開いているということは Select Case Mid(DataFile, 9, 3) の値が処理に影響していると思われます。 質問の中で「19970303日報1」とあったのでMIDで9文字目から3文字抜き取り処理をするようコーディングしました。 仮に199733日報1のようなファイル名があった場合は何も処理されないです。 Select Case Mid(DataFile, 9, 3) を Select Case Mid(DataFile, InStr(1, DataFile, "日報"), 3) に変更して見てください。 一応こちらで数日分のデータを作り実行してみましたが正常な動作を確認しました。

root38_001
質問者

お礼

すみませんようやく動きました。 只1つ問題なのは、ファイル名につける参照のセルが1997/03/03なので このままではファイル名がつけられません。 方法としては 1.1997/03/03を別な表記に変えて保存する。 2.最初にコピーするブック名が970303日報1なので、このファイル名の 970303日報をファイル名にする。 3.970303日報1のファイル名のまま別なフォルダーに保存する。 お忙しいところすみません。よろしくお願いします。

root38_001
質問者

補足

すみません省略してしまって。 開いたのは970303日報1・970303日報2、970304日報1・970304日報2・・・・と目的のファイルは開いたのですが、新規のブックに貼付けされていない、保存されていないということです。  ちなみに、エクセルを起動して、PERSONAL.XLSB!copybook7()を実行すると、"完了"の表示だけがされます。970303日報1と同じフォルダー(1997)内にBOOK1を作りそれにプロシージャを登録して、それを開いて実行すると、970303日報1等のファイルは開くのですが、1997フォルダーには新規のファイルは保存されておらず、また、開いているBOOK1にも何も張り付けられていません。 どこがおかしいのでしょうか?

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.2

#1です。 環境を合わせて実行してみましたが全体的に改修が必要ですので若干お時間を頂きます。 (他の方が回答されるのが早いかもしれませんが・・・。) ご提示されておられるのコードの流れは現状以下のようになっています。 自分自身をAとした時 新規ブックZを作成しページ設定を行う。 Aのシート1の名前をDataShtにセット。 フォルダ内のエクセルを読んでくる。 (最初に読み込まれたのが日報1と仮定) 日報1のA1:K38をコピーする。 AのDataShtのA1に貼り付けをする。 日報1を閉じる。 次のファイルを読んでくる。 Aを~日報と言う名前で保存 Aを閉じる。 この時点で新規ブックはページ設定が行われた状態で残りAが終了する為マクロも停止。 ThisWorkbookとActiveWorkbookの使い方が間違っているだけかと思いましたが新規ブック作成のコードがループの外にある為仮に日報2を読んできたとしても貼り付けが出来なくなります。

root38_001
質問者

補足

すみません、私の勘違いでしょうか、個人用マクロブックにプロシージャーを作り、何も開いていない状態で(自分自身Aが無い状態で新しいブックZを作り、、、という動作を考えていたのですが、これって間違いなのでしょうか?

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.1

こんにちは。 現在動作確認を行っておりますが不明な点があります。 >日報ファイルが開いてコピーまでは動いていますが とありますが、その前に1回目のループで With ThisWorkbook~.Close で自身を終了していますがこれはActiveWorkbookの方かと思います。 新たに作った日報1枚を残して終了されていませんか?

root38_001
質問者

補足

どうもありがとうございます。 すみません、完全に理解して作ったわけではないのでご迷惑をおかけします。  自分としては、新たに作ったブックに日報1、日報2をコピーして 出来たブックのK2のセルをファイル名にして保存して閉じる。(全てを) その後にまた新しいブックを作り次の日報1,2をコピーして,,, という動作を考えているのですが、すみません見様見真似ですので 、、正直ご質問の”新たに作った日報1枚を残して終了されていませんか?”は自分でもわからないです。  すみませんがよろしくお願いします。

関連するQ&A

  • 複数のブックコピーの繰り返しその2

     このサイトのお力により以下のプロシージャができました。 折角作っていただいたのですが、処理枚数が増えたため1ファイルに1日分だったのが3日分(6ファイル)をコピーすることになってしまいました。どのようにしたらよいでしょうか、お分かりの方いらっしゃいましたらよろしくお願いします。  現状は、あるフォルダー内のファイル970303日報1、970303日報2を開いて、新しいブックに貼りつけて保存する。次に970304日報1、970304日報2を開いて新しいブックに貼りつけて保存するという作業の繰り返しです。  これを、970303日報1,2 970304日報1,2 970305日報1,2の3日分を新しいブックにコピーして保存する。次に970306日報1,2 970307日報1,2 970308日報1,2を新しいブックにコピーして保存する。これの繰り返しをしたいのですがどうしたらよいでしょうか。  ファイルのコピーする範囲は一定です。貼り付けるブックのセルは 1日目の日報1がA1、日報2がL5、2日目の日報1がA40、日報2がL44 3日目の日報1がA79、日報2がL83となります。  すみませんよろしくお願いします。 Sub copybook11() Dim myPath As String 'このブックのパス Dim DataFile As String 'Dir()で開くブック名 Dim copybook As Workbook '開いたブック Dim NewBook As String '新しいブック Dim NewFileName As String '新しいファイル名 myPath = ThisWorkbook.Path & "\" DataFile = Dir(myPath & "*.xls", vbNormal) Do While DataFile <> "" If DataFile <> ThisWorkbook.Name And InStr(1,     DataFile, "日報") > 0 Then Set copybook = Application.Workbooks.Open     (Filename:=myPath & DataFile, ReadOnly:=True) Select Case Mid(DataFile, InStr(1, DataFile, "日      報"), 3) Case "日報1" Workbooks.Add NewBook = ActiveWorkbook.Name copybook.ActiveSheet.Range("A1:K38").copy Workbooks(NewBook).ActiveSheet.Range           ("A1").PasteSpecial paste:=xlAll Application.CutCopyMode = False copybook.Close Case "日報2" copybook.ActiveSheet.Range           ("B3:K36,T3:U36").copy Workbooks(NewBook).ActiveSheet.Range           ("L5").PasteSpecial paste:=xlAll Application.CutCopyMode = False copybook.Close NewFileName = Format(Workbooks   (NewBook).ActiveSheet.Range("k2").Value, "yyyymmdd") & "日    報.xls" Workbooks(NewBook).SaveAs Filename:=myPath           & NewFileName, FileFormat:=xlExcel8 Application.DisplayAlerts = True Workbooks(NewFileName).Close End Select End If DataFile = Dir Loop End Sub

  • エクセルで複数のブックの一部を抽出する

    エクセルで複数のブックの一部をBOOK1に1行ずつコピーしたいんですが、いろいろ探して近いものは見つけたのですが、元になるブックの1部の列をコピーするブックの行にコピー出来ないでしょうか? merlionXXさんのhttp://oshiete1.goo.ne.jp/qa4969413.htmlこれを参考にして作っているのですが、 課名D16 商品名B20:B39 枚数H20:H39 金額I20:I39 の部分をbook1に1件1行としてコピーしたいのですができますでしょうか? もとのブックの行数は決まっています。 どうか力を貸してください。よろしくお願いします。 Sub test02() Dim MyFile As String, MyPath As String '変数宣言 Dim x As Long, y As Long Dim wb As Workbook, tb As Workbook Dim ka As String Dim sh1, sh2 Set tb = ThisWorkbook MyPath = tb.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.xls", vbNormal) 'パス内のエクセルファイル Application.ScreenUpdating = False '画面更新停止 Application.Calculation = xlCalculationManual '自動計算停止 Do While MyFile <> "" 'エクセルファイルがなくなるまで If MyFile <> tb.Name Then '自分以外のファイルを対象 Set wb = Workbooks.Open(MyPath & MyFile) '選択したファイルを開く With ActiveSheet ka = .Range("D16").Value '課名取得 x = .Range("B" & Rows.Count).End(xlUp).Row '最終行取得 sh1 = .Range("B20:B" & x).Value '商品名取得 sh2 = .Range("H20:I" & x).Value '数量&金額取得 End With With tb.Sheets("Sheet1") y = .Range("B" & Rows.Count).End(xlUp).Row '最終行取得 y = IIf(.Range("B" & y) = "", y, y + 1) If x >= 20 Then '納品書B20以下にデータがあれば Set myRng = .Range("A" & y).Resize(x - 19, 1) myRng.Value = ka '課名転記 myRng.Offset(, 1).Value = sh1 '商品名転記 myRng.Offset(, 2).Resize(, 2).Value = sh2 '数量&金額転記 End If End With wb.Close (False) '選択したファイルを閉じる End If MyFile = Dir() '次のファイルを検索 Loop '繰り返し Application.Calculation = xlCalculationAutomatic '自動計算停止解除 Application.ScreenUpdating = True '画面更新停止解除 Set tb = Nothing Set wb = Nothing Set myRng = Nothing End Sub

  • エクセルで複数ファイルからコピーをする。

    すみませんが、BOOK1に複数のファイルから部分的にコピーして貼り付けるという作業をしたいのですが、ど素人なもんでわかりません。マクロで記録したモノをいじってみてるのですが、根本的にコードが分かっていなくギブアップです。  やりたいことは、フォルダーの中の970305日報1、970305日報2、970306日報1、970306日報2のようなファイルが山ほどあるのですが、 この970305の日報1と2を開き、それぞれファイルの決まった列を順番にをBook1の行へ行列を入れ替えて貼りつけていき(1日が1行)保存して閉じてから、次の日970306のデータをBOOK1の2行目に貼り付けるということをしたいのですが、どなたか教えていただければ助かります。よろしくお願いします。 Sub Macro2() Dim MyFile As String, MyPath As String Dim wb As Workbook, tb As Workbook Set tb = ThisWorkbook MyPath = tb.Path & "\" MyFile = Dir(MyPath & "*.xls", vbNormal) Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Do While MyFile <> "" If MyFile <> tb.Name Then Set wb = Workbooks.Open(MyPath & MyFile) With ActiveSheet Windows("970305日報1.xls").Activate Range("B34:B38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("C1").Select Selection.PasteSpecial Paste:=xlPasteAll,         Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970305日報1.xls").Activate Range("C33:C38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("H1").Select Selection.PasteSpecial Paste:=xlPasteAll,       Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970305日報1.xls").Activate ActiveWindow.Close Windows("970305日報2.xls").Activate Range("B31:B36").Select Selection.Copy Windows("日報リスト.xls").Activate Range("N1").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970305日報2.xls").Activate Range("D31:D36").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("T1").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970305日報2.xls").Activate ActiveWindow.Close Windows("970306日報1.xls").Activate Range("B34:B38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("C2").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970306日報1.xls").Activate Range("C33:C38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("H2").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970306日報1.xls").Activate ActiveWindow.Close -----------------------------------------

  • マクロでファイル名(を含む)を検索しPDFを開く

    マクロでファイル名(セルの値)を含むPDFファイルを検索し、ファイルが存在していればそのファイルを開きたいのですがうまく行きません。 Sub を含むPDFファイルを開く() Dim keyword As Variant Dim myPath As Variant Dim fName Dim pname Set my = ActiveSheet keyword = my.Range("D2").Value '検索する値 myPath = my.Range("F1").Value  'フォルダパス fName = Dir(myPath & "*" & keyword & "*" & ".pdf") pName = (myPath & "*" & keyword & "*" & ".pdf")  '"*" & keyword & "*"が良くないのだと思います。 If fName = "" Then MsgBox ("該当するファイルが存在しません。") Exit Sub End If With CreateObject("Wscript.Shell")  .Run pname, 5  'ここでエラーが出ます。 End With End SUB 'pname内の"*" & keyword & "*"をkeywordのみにすると完全一致のファイルは開けるのですが部分一致で開きたいため”*”を使用したところエラーが出てしまいます。 また、検索するPDFファイルにスペースが含まれていても開けるようにしたいのです。 どうかご指導のほうをよろしくお願いします。

  • 複数ファイルのA1だけを抽出して別ファイルにしたい

    すみませんが、教えてください。 特定のフォルダ内に入っているcsvのA1列目のみ抽出して別ファイルにしたく、検索したところ 同じように困っていた方がいたようで、参考にさせていただいたのですが、 以下を実行しても インデックスが有効範囲にありませんと出ます。 各csvファイルのシート名は 1000近くあるファイル全て違い、別々の名前(コード00-000とか)になっています。 (エクセルで開いたとき) お手数ですが、教えていただきたくお願いいたします。 参考にしたマクロです。 Sub macro1() Dim myPath As String Dim myFile As String myPath = "ファイルの場所\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" Workbooks.Open myPath & myFile With Workbooks("集約.xls").Worksheets("Sheet1").Range("A65536").End(xlUp) .Offset(1, 0).Value = myFile .Offset(1, 1).Value = Workbooks(myFile).Worksheets("概要").Range("C3").Value End With Workbooks(myFile).Close savechanges:=False myFile = Dir() Loop End Sub 宜しくお願いいたします。

  • 複数のファイルのsheet1だけをまとめるには

    sub UsedRangeをOffsetする() Dim rng先 As Range Dim PathMacrobook As String Dim Name元book As String Dim 元Book As Workbook Dim 元Sheet As Worksheet Set rng先 = Workbooks("BOOKALL.xls").Worksheets(1).Range("A2") PathMacrobook = ThisWorkbook.Path & "\" Name元book = Dir(PathMacrobook & "*.xls") Do While Not Name元book = "" If Name元book = ThisWorkbook.Name Then ElseIf Name元book = "BOOKALL.xls" Then Else Set 元Book = Workbooks.Open(PathMacrobook & Name元book) For Each 元Sheet In 元Book.Worksheets With 元Sheet.UsedRange .Offset(1).Copy rng先 Set rng先 = rng先.Offset(.Rows.Count - 1, 0) End With Next 元Book.Close False End If Name元book = Dir() Loop End Sub このコードではフォルダにあるブックのすべてのシートをBOOKALLのシート1に 上書きコピーしてしまう事がわかりました。 やりたい事 オープンするブックのsheet1だけを、.end(xlup)を使って一覧にしたいです。。 どの様にしたらよいでしょうか?

  • VBA 探しているFileがないときの処理方法

    現在、下記のようにしてマクロ実行ブックと同じ階層のフォルダ名を取得してAに、フォルダ内のabc.XLSのC9の値をBに、abc.XLSの更新日時をCに表示させています。 このとき、フォルダ内にabc.XLSが無い場合にファイル名をAに書き出してB及びCは空白というように表示したいのですが、どのようにすればよろしいでしょうか。 macro1は以前質問させて頂いたものがベースになっています。ExecuteExcel4Macroを使っている関係でファイル名が無いときの処理はDirを使ってできるとmougで調べてわかりましたが、自分の知識ではできず、macro2を作成したのですが、指定ファイルがない場合の処理がうまくできずにいます。 macro1はファイルオープンの窓が開きます。macro2はファイルが存在しないという窓が開きます。 どちらの場合でもかまいませんのでお力をお貸し頂けませんでしょうか。 Sub macro1() Dim myPath As String Dim myFolder As String Dim r As Long r = 3 myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" Application.ScreenUpdating = False Range("A3:C60").Clear Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1) = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[" & myBook & "]Sheet1 '!R9C3") On Error Resume Next Cells(r, 3) = FileDateTime(myPath & myFolder & "\" & myBook) On Error GoTo 0 If Cells(r, 3) = "" Then Cells(r, 2) = "myBook" End If Cells(r, 2).NumberFormatLocal = "#,##0_ " Cells(r, 3).NumberFormatLocal = "y""年""m""月""" With Range("A3:C60") .Sort Key1:=Range("C3"), Order1:=xlAscending .Borders.LineStyle = True End With r = r + 1 End If End If myFolder = Dir() Loop Application.ScreenUpdating = True End Sub Sub Macro2() Dim myPath As String Dim myFolder As String Dim myBook As String myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" i = 2 Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Workbooks.Open (myPath & myFolder & "\" & myBook) Range("C9").Activate Selection.Copy ThisWorkbook.Activate Cells(i, 1) = myFolder Cells(i, 2).PasteSpecial xlValues Cells(i, 3) = FileDateTime(myPath & myFolder & "\" & myBook) Workbooks(myBook).Close SaveChanges:=False i = i + 1 End If End If myFolder = Dir() Loop End Sub

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

    下は複数のエクセルファイルを一つにするマクロですが、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

  • 複数のエクセルファイルとシートからデータ抽出したい

    以前に http://soudan1.biglobe.ne.jp/qa8369459.html でやられている内容なのですが、私の場合はシートすべての[i4」のセル値を一覧でひっぱりたいです。 keithinさんご回答の sub macro1()  dim myPath as string  dim myFile as string  dim w as worksheet  mypath = thisworkbook.path & "\"  myfile = dir(mypath & "*.xls*")  application.screenupdating = false  do until myfile = ""   if myfile <> thisworkbook.name then    workbooks.open mypath & myfile    for each w in workbooks(myfile).worksheets    with thisworkbook.worksheets("Sheet1").range("A65536").end(xlup).offset(1)     .value = myfile     .offset(0, 1) = w.name     .offset(0, 2).value = w.cells(w.rows.count, "C").end(xlup).value              ↑をRange("i4").Value      end with    next    workbooks(myfile).close false   end if   myfile = dir()  loop  application.screenupdating = true end sub にて実施しましたが、ファイル名・シート名は正確に抽出するものの 参照したい「i4」のデータが先頭のシートのi4だけを拾ってしまいます 1.xls、2.xls、3xlsがありそれぞれ名前がばらばらなシート「あ」、「い」、「う」の3つがある。2.xlsには「え」、「お」、「か」のしーとがあると仮定、マクロを実行すると、一覧のエクセルに 1、xls  あ  あのシートi4の値 1、xls  い  あのシートi4の値 1、xls  う  あのシートi4の値 2.xls  え  えのシートi4の値 2.xls  お  えのシートi4の値 2.xls  か  えのシートi4の値 子のようなか形で出力されます い のところには いのシートのi4が、う のところには うのシートのi4が、 抽出されるには構文をどう買えればよいのでしょうか

  • Excel VBA連続コピー、貼付処理について

    特定のフォルダ内に格納されている複数のExcelファイルの「sheet1」シートのデータを 所定のExcelファイルにコピー&ペーストしたいのですが、うまくいきません。 (貼付先のファイルを閉じようとするとエラーが発生します。) どうすればできるようになるでしょうか? ご教授の程よろしくお願いいたします。 -------------------------------------------------------------------- Sub copy_test() Dim myPath As String Dim copyFile As String Dim pasteFile As String Dim n As Long myPath = "C:\copy\" copyFile = Dir(myPath & "*.xls*") pasteFile = "C:\paste\paste_data.xlsx" n = 2 Do Until copyFile = "" Workbooks.Open Filename:=myPath & copyFile Workbooks(copyFile).Worksheets("sheet1").Range("A2:L201").Copy Workbooks.Open Filename:=pasteFile 'Workbooks(pasteFile).Worksheets("paste_data").Active Range("B1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveWorkbook.Save Workbooks(pasteFile).Close False Application.CutCopyMode = False Workbooks(copyFile).Close False n = n + 999 copyFile = Dir() Loop End Sub ---------------------------------------------------------------------------------

専門家に質問してみよう