Excel vbaで、一行ずつコピーし連続保存する

このQ&Aのポイント
  • Excel vbaを使用して、一行ずつ別のシートにコピーし、連続で保存する方法を教えてください。
  • コードの一部を変更した後、保存されるファイルの内容が全て最終行のものになってしまいます。解決策を教えてください。
  • エラーに遭遇したため、情報が不足しているかもしれません。必要な情報を教えていただければ幸いです。
回答を見る
  • ベストアンサー

Excel vbaで、一行ずつコピーし連続保存する

Excel vbaで、一行ずつ別シートにコピーして、そのシートを連続で保存したいです。 まず、Excelで、「全員データ」シートと、「個人別データ」シートを作りまして、 「全員データ」シートのA2からA4までは氏名、B2からC4までは任意の数字等を入力しています。 その状態で、「全員データ」シートに保存したデータを、一人分ずつ「個人別データ」シートにコピーし、 その「個人別シート」を連続で保存する、という作業をしたいと思っています。 ちなみに下記コードでうまくできました。 (セルの値を使ったファイル名の作成も併せて行えました。) そこからさらに、「個人別データ」シートから単純に(=個人別データ!A2というように)リンクさせた「印刷用シート」を同様に連続で保存する、という作業までしたかったのですが、 その場合に、(1)ファイル名の作成は2行目から4行目のものを使ってうまくいくのですが、(2)そのファイルの中身が全て4行目(最終行)のものになってしまいます。 いろいろ試してみたのですが、解決できませんでした。 付け焼刃程度の知識しかなく、お聞きするのに必要なだけの情報を記載できたかもわかっていません。 情報不足であれば、そこもご教示いただければ助かります。 よろしくお願いします。 Sub 保存() ' ' 保存 Macro ' '変数を定義 Dim 保存先 As String Dim 最終行 As Long Dim 該当行 As Long 保存先 = ThisWorkbook.Path & "\個人別フォーム" 最終行 = Worksheets("全員データ").UsedRange.Rows.Count 'ループ For 該当行 = 2 To 最終行 '一行ずつコピー Sheets("全員データ").Select Range(Cells(該当行, 1), Cells(該当行, 3)).Select Selection.Copy '「個人別データ」シートに貼り付ける Sheets("個人別データ").Select Range("a2:c2").Select ActiveSheet.Paste '「個人別データ」シートを名前を付けて保存 Sheets("個人別データ").Select ’⇒「個人別データ」ではなく「印刷用データ」としたい。 Sheets("個人別データ").Copy ’⇒「個人別データ」ではなく「印刷用データ」としたい。 ActiveWorkbook.SaveAs _ Filename:=保存先 & "\個人別データ" & Range("A2") & Range("B2") & Range("C2") & ".xlsx", _ FileFormat:=xlOpenXMLWorkbook ActiveWorkbook.Close Next 該当行 End Sub

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

  • ベストアンサー
回答No.1

テンプレートファイルを作って流し込みした方がいいと思います。下記のような。 ■ファイル Book1.xlsx (下の保存マクロとマスタデータ(全員データシート)があること) テンプレート.xlsx (個人別シートがあること、個人別データシートを参照した印刷シートも用意できる。 Book1.xlsx と同じフォルダにあること。) ■マクロ Sub 保存() Dim テンプレート As String Dim 保存先 As String Dim 最終行 As Long Dim 該当行 As Long ' 設定変数 テンプレート = ThisWorkbook.Path & "\テンプレート.xlsx" 保存先 = ThisWorkbook.Path & "\個人別フォーム" 最終行 = Worksheets("全員データ").UsedRange.Rows.Count 該当行 = 2 ' 処理対象の開始行を設定 ' 以下、主処理 Application.ScreenUpdating = False ' 画面更新を抑制 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' テンプレートファイルの存在チェック If Not fso.FileExists(テンプレート) Then Set fso = Nothing MsgBox "テンプレートファイルが見つかりません。処理を中止します。" & テンプレート & "を作成してください。", Title:="エラー" Exit Sub End If ' 保存先フォルダの存在チェック If Not fso.FolderExists(保存先) Then fso.CreateFolder (保存先) End If Dim ms As Worksheet ' マスタSheet Dim tb As Workbook ' テンプレートBook Dim ts As Worksheet ' テンプレートSheet Set ms = ThisWorkbook.Worksheets("全員データ") ' このシート名も設定変数にしておいたほうがいい While 該当行 <= 最終行 Set tb = Workbooks.Add(テンプレート) Set ts = tb.Worksheets("個人別データ") ' このシート名も設定変数にしておいたほうがいい(2) ts.Range("a2:c2").Value = ms.Range(ms.Cells(該当行, 1), ms.Cells(該当行, 3)).Value Dim filename As String filename = 保存先 & "\個人別データ" & ts.Range("A2") & ts.Range("B2") & ts.Range("C2") & ".xlsx" If fso.FileExists(filename) Then ' ファイルがすでに在ったら(とりあえず)削除。(結果として上書き) fso.DeleteFile filename ' ヒント ここで、ファイル名を別名にすることもできます。 End If tb.SaveAs filename:=filename, FileFormat:=xlOpenXMLWorkbook tb.Close ' 処理状況をステータスバーに表示 ' 注意 件数ではなく行番号です。(まぎらわしいかも) Application.StatusBar = "(" & 該当行 & "/" & 最終行 & ")" & filename & "を保存しました。" Set tb = Nothing 該当行 = 該当行 + 1 Wend MsgBox "保存処理が終了しました" Application.StatusBar = False Application.ScreenUpdating = True Set fso = Nothing End Sub

amenbo123123
質問者

お礼

とてもご丁寧な回答、ありがとうございました。 まだまだ勉強を始めたばかりであり、理解するのに時間がかかるため、 まずは一つ一つしっかり確認して、試させていただきたいと思います。 一人で路頭に迷っていたところなので、とても助かります。 ありがとうございました。

関連するQ&A

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • 1が6連続登場したらその行をコピーするVBAマクロ

    私は、Excelの「マクロの記録」で自動記述されたマクロを少々いじる程度しかできないスキルです。 行いたい処理がEXCEL VBAで実現できなくて困っています。どうぞお力を貸してください。 毎日、添付した画像の「上の表」のようなデータが出ます。 「下の表」は、二日後のデータに見立てています。このように、日ごとに列が増えていく表です。 (値の部分は、数値で0か1しか入りません。) (上下に表を並べていますが、実際には「月初から本日まで」の1つの表しかありません。) ここで、やりたいことは・・・ 最後の日付から遡って6日間にわたり1が連続したら、その行だけ取り出して別シートにコピーしたいのです。 添付画像には、「すべての6連続した1」に黄色の網掛けをしていますが、 必要なのは「一番最後の日から遡って6日連続しているものだけ」です。 たとえば7/10の時点(上の表)では、工藤さんの行だけが該当。 7/12時点(下の表)では、石井さんだけが該当することになります。 該当した行を丸ごと、別のシートにコピーしたいわけです。 日によって、該当する行が複数行存在するときもあります。 自分で考えた限りでは、 データの右端(合計列)を見つけ、そこから左へ1セルだけオフセット→変数へセット そこからさらに左へ5セルオフセット→変数へセット それを選択範囲の開始セルと終了セルにできれば、 その中身がすべて1だった場合のみ、その行をコピーすればよいのでは・・・ と考えました。 行を1ずつ下に移動しながら最終行まで処理を続ける。 それを、行が終わるまで、繰り返す・・・(日によって行は増えたり減ったりする) (データは0か1かしか入らないので、最終日から6日間を範囲選択している場合、全部1か?という判断をしてもよいし、足して6か?という判断でもよさそうです) しかし、オフセットでセルはセレクトできても、 それを開始セル・終了セルとした「範囲」にすることができず、 また、行が終わるまで繰り返す処理も記述の仕方がわかりませんでした。 全く形になっていないので書く意味はなさそうですが、自分の記述を下記に示します。 繰り返し処理はネットで検索しました。 ---------------------- Sub testMacro() ' ' testMacro Macro ' Dim i As Long Dim MaxRow as Long Range("A2").End(xlToRight).Select '2行目で、データの右端をセレクトする。変数にセットすべき? Selection.Offset(0, -1).Select 'これが選択範囲の最初。変数にセットすべき? Selection.Offset(0, -5).Select 'これが選択範囲の最後。変数にセットすべき? Range(開始セル:終了セル).Select'この範囲指定がわからない MaxRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row '最後の行を知る(どの列でもいい) For i = 1 To MaxRow '1ずつ増やしながら最終行まで繰り返す   '範囲内が全部1かどうか(あるいは足して6かどうか)調べて、そうでなかったら次の行へ。   'もし全部1ならならコピーして別シートへコピー。 Next i End Sub ---------------------- 本当にまったく形になっていなくてすみません。 お力を貸していただけると嬉しいです よろしくお願いします

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

    エクセルVBAについての質問です。  動作環境は  OS:WINDOWS XP  エクセル2003  です。 今、Book1.xlsというエクセルファイルがあります。 このファイルの中に、【sheet1】,【sheet2】,【sheet3】の3つのシートが存在しています。 【sheet1】および【sheet2】には、A列=ユニーク番号、B列=データ1、C列=データ2・・・・n列=データnの値が約1500行(各行で、データの値は異なります。)入っています。 この【sheet1】と【sheet2】のデータの内容を照合して【sheet3】にその結果を反映(TRUEまたはFALSE)します。 仮に【sheet3】のあるセル(仮にD3)の値がTRUEとなったら、【sheet1】のセル(D3)の値を【sheet3】のセル(D3)に代入する。 逆に【sheet3】のあるセルの値がFALSEとなったら、そのセルはFLASEのままにする。プログラムは以下の様にしたのですが、全てを処理するまでに相当時間がかかっています。 VBAのプログラムは今回初めて書いたので、プログラムが悪いのか、プログラムの思想が悪いのかがわかりません。 どなたかご教授していただけませんか?多分、コードの書き方もキレイではないと思います(悲) Private Sub データ照合ボタン_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long Dim area As Range Dim A As Variant Dim WrkRange As String '----シート(1)とシート(2)の各セルの値を比較---- With Sheets("sheet1") WrkRow = .Cells(Rows.Count, 3).End(xlUp).Row End With Sheets("sheet3").Select For i = 12 To WrkRow WrkRange = Range("C" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" WrkRange = Range("D" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" '・           '・           '・ Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("C" & i).Select Selection.Copy Range("C" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("C" & i) = True Then Sheets("sheet1").Select Range("C" & i).Copy Sheets("sheet3").Select Range("C" & i).Select ActiveSheet.Paste Else: End If Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("D" & i).Select Selection.Copy Range("D" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("D" & i) = True Then Sheets("sheet1").Select Range("D" & i).Copy Sheets("sheet3").Select Range("D" & i).Select ActiveSheet.Paste Else: End If Next i          '・          '・          '・    End Sub

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

  • エクセル VBA 繰り返し コピー貼り付け

    以下を繰り返し作業をOffsetを使用して行いたいのですがどうすればいいでしょうか? Sheets("Sheet1").Select Range("A1:C1").Select のA1:C1以下へA1000:C1000ぐらいあります。 Sheets("Sheet2").Select Range("G1").Select は貼り付けたセル3つの数字の組み合わせで公式に使う計算期間がまちまちですので公式を張り付けたり出来ません。 D1の解を heets("Sheet1").Select Range("D1").Select に貼り付けてA1:C1以下1000までの結果を評価出来るようにしたいのですが! ' Macro1 Macro Sheets("Sheet1").Select Range("A1:C1").Select Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D1").Select ActiveSheet.Paste Range("A2:C2").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Range("A3:C3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D3").Select ActiveSheet.Paste End Sub よろしくおねがいします。

  • excel vba DATAの日集計

    excel vba DATAの日集計 いつもお世話になっています。 "DATA"シートのセル"D2"の日付を変えると表の数値が変わるようにしています。 その日毎のデータを"集計"シートの日別の表に飛ぶようにしているのですが、 1日分の転記するセル数が多く、Select Caseで31日分のコードを書くと、あまりにも プロシージャーが大きくなります。(Case1からCase31・・・結果分割してますが) FOR NEXT なのかな~、もっと効率のいい書き方がありましたらよろしくお願いします。 例:"集計"シート1日分は、9行となります。それぞれ"DATA"シートからの転記です。"DATA"シートのF5+F10,G5+G10~AC5+AC10までそれぞれの値を"集計"シートのG5からAD5まで、F6+F12,G6+G12~AC6+AC12までそれぞれの値を"集計"シートのG13からAD13までといった具合です (日の9行はそれぞれ決まったある行とある行の加算です、これが31日分の行があります) Sub macro() Dim myrng As Range Dim c As Range Set myrng = Sheets("DATA").Range("D2") For Each c In myrng Select Case c.Value Case 1 '1行目 Sheets("集計").Range("G5").Value = Sheets("DATA").Range("F5") + Sheets("DATA").Range("F10") | | Sheets("集計").Range("AD5").Value = Sheets("DATA").Range("AC5") + Sheets("DATA").Range("AC10") | | '9行目Sheets("集計").Range("G13").Value = Sheets("DATA").Range("F6") + Sheets("DATA").Range("F12") | | Sheets("集計").Range("AD13").Value = Sheets("DATA").Range("AC6") + Sheets("DATA").Range("AC12")

  • EXCELのVBAですが。

    EXCELのVBAですが。 Sub macro1() Dim mycnt As Integer Dim sheet_name1 As String Sheets("kekka").Select Range("A1").Select Sheets("shiji").Select mycnt = Range("B1").Value sheet_name1 = Range("c" & mycnt) Sheets("kekka").Select Sheets("kekka").name = sheet_name1 Sheets("kansuke").Select Sheets("kansuke").Copy Before:=Workbooks("2007年報告.xls").Sheets(3) End Sub (やりたいこと) B1に入っている数値でC1からC10に入っているあるシートの名前(たとえばkansukeとする)を取り、その名前で kekkaというシート名をkansukeという名前に変える。 名前を変えたkansukeというシートを別の2007年報告というbookにコピーを転送する。 (質問)上のコードで実はkansukeと書いてあるところは,B1の値次第で当然いろいろに 変化するため、そのシート名にとらわれない書き方をしたいのですがどう記述すればいいのか わかりません。以上お願いします。

  • エクセルVBA での繰り返し処理について

    エクセルVBA での繰り返し処理について 以下の作業を20回繰り返そうとしています(別シートから持ってきた値を「行列を入れ替えて」貼り付け)    Sheets("初期設定").Select Range("A6:C6").Select Selection.Copy Sheets(TS).Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True   「初期設定」シートの方は1行ずつ並んでいるので、「2回目」の「2行目」は   「 Range("A7:C7").Select」になり、   「TS」シートの20行後に貼り付けたいので、「2回目」の「5行目」は   「Range("B24").Select」 になります   これを、for ~ next を使い、以下のようにしてみましたが、上手くいきません。    For j = 6 To 26 For k = 4 To 384 Step 20 Sheets("初期設定").Select Range(Cells(j, 1), Cells(j, 3)).Select Selection.Copy Sheets(TS).Select Cells(k, 2).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True Next k Next j  1分程度ループし続けた後、「初期設定」シートの最終行だけが貼り付けられてしまいました。 どこをどのように直せばいいのかお教えください。 よろしくお願いいたします。

  • エクセルVBAの貼付けについて

    エクセルVBAの貼付けについて シートAとBがあって、シートBの1~7列をコピーし、シートAの最終行に貼り付ける方法を教えて下さい。 下記のように書いてみたのですがダメでした。 Sheets("B").Select Rows("1:7").Select Selection.Copy Sheets("A").Select With Range("A1").End(xlDown).Offset(1, 0) .ActiveSheet.Paste End With

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

専門家に質問してみよう