Excelマクロ行数が不定な場合のコピーペースト等

このQ&Aのポイント
  • Excel2007を使用している場合、複数のBookに格納されたデータをコピーして一つのBookにまとめる方法について教えてください。
  • データの最終行が不定であり、具体的な行番号が分からない場合、最後の行を選択する方法やソートする方法を教えてください。
  • 具体的な行番号を指定せずに、柔軟にコピーしたりソートしたりするExcelマクロの書き方を教えてください。
回答を見る
  • ベストアンサー

Excelマクロ行数が不定な場合のコピーペースト等

こんにちは。 Excel2007を使用しています。 4つのBook(Book1,2,3,4)にそれぞれ60000行ほどのデータが格納されています データーの最終行はそのときによって変わります。(ですので困っています) Book2,3,4をBook1の最後にコピーして一つのBookにしたいのですが 具体的な行番号が書かれてしまい汎用性が有りません。 最後の行を選択する場合の例 Windows("Book1.xlsx").Activate Selection.End(xlDown).Select Range("A595002").Select ソートする場合の例 With ActiveWorkbook.Worksheets("sheet1").Sort .SetRange Range("A1:AP231196") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With このような場合どう書けば良いでしょうか? おわかりの方お教えください。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

ANo.3です。 あぁ、シート名の変更ミスだったのですね。 納得しました。 > 実際にしたいことは4枚のtxtファイル(30列x約65000行のCSVファイル、データーベースのログファイルです)をExcelに読み込ませる。 > 1枚目のtxtファイルに他の3枚の内容を追加する。 > コピーし終わった3枚のファイルは変更せずにtxtのまま終了させる ここまでは出来ているという事ですね……。 で、あればソートはこんな感じでいいと思います。 キーは、先頭の1つだけ指定してあれば大丈夫です。ソートの範囲も列指定でいけます。 ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("I2"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort   .SetRange Range("A:AP") ’30列ならAPではなくADでは?   .Header = xlYes   .MatchCase = False   .Orientation = xlTopToBottom   .SortMethod = xlPinYin   .Apply End With 余談ですが、4つのテキストファイルを以下のような内容のバッチファイルを作って結合させてから開くと楽かもしれません。 copy aaa.txt+bbb.txt+ccc.txt+ddd.txt append.txt

sherman
質問者

お礼

ありがとうございます。 おかげで実用的なマクロになりました。

その他の回答 (3)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

補足に対して…… > ソートする前の段階で困っています どこかで拾ってきたコードの寄せ集めでしょうか。 Activeなシートが何なのか解りませんし、"sheet1"と"0_Ver2_PER_Summary"の関係も不明で 何をしたいのか読み取れませんでした。 やりたい事を具体的に文章で書いてください。

sherman
質問者

補足

ご指摘申し訳ありません。 実際の作業を「マクロの記録」でマクロを作成し、コードを掲載しました。 理解していただきやすいように"0_Ver2_PER_Summary"を"sheet1"に書き換えましたが書き換え忘れです。 実際にしたいことは4枚のtxtファイル(30列x約65000行のCSVファイル、データーベースのログファイルです)をExcelに読み込ませる。 1枚目のtxtファイルに他の3枚の内容を追加する。 コピーし終わった3枚のファイルは変更せずにtxtのまま終了させる 1枚目のファイルの先頭行は項目なのでI行を降順にソートする。 決まった名前をつけてxlsx形式でデスクトップに保存する。 作業を続けたいのでxlsxファイルは開いたままにしておく。 困っていることは4枚目のtxtファイルは毎日行数が増えるので、作業を行うたびに最終行が変わることです。 そのため今回、質問をしました。 よろしくお願いいたします、

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

簡易法1: workbooks("Book2.xlsx").worksheets("Sheet1").range("A1").currentregion.copy _  destination:=workbooks("Book1.xlsx").worksheets("Sheet1").cells(rows.count, "A").end(xlup).offset(1) Book3,4についても同じ。 簡易法2: workbooks("Book2.xlsx").worksheets("Sheet1").range("A1:AP65536").copy _  destination:=workbooks("Book1.xlsx").worksheets("Sheet1").cells(rows.count, "A").end(xlup).offset(1) workbooks("Book3.xlsx").worksheets("Sheet1").range("A1:AP65536").copy _  destination:=workbooks("Book1.xlsx").worksheets("Sheet1").cells(rows.count, "A").end(xlup).offset(1) workbooks("Book4.xlsx").worksheets("Sheet1").range("A1:AP65536").copy _  destination:=workbooks("Book1.xlsx").worksheets("Sheet1").cells(rows.count, "A").end(xlup).offset(1) ゲンミツがいいなら: A:Z列をコピーするとして A列でデータの最下行を検出できるとして workbooks("Book1.xlsx").select worksheets("Sheet1").select with workbooks("Book2.xlsx").worksheets("Sheet1")  .range("A1:Z" & .cells(.rows.count, "A").end(xlup).row).copy _   destination:=cells(rows.count, "A").end(xlup).offset(1) end with Book3,4についても同じ。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

こんな感じでどうでしょう > 最後の行を選択する場合の例 Windows("Book1.xlsx").Activate Selection.End(xlDown).Select Range("A595002").Select ↓ Windows("Book1.xlsx").Activate Cells(Rows.Count, 1).End(xlUp).Select > ソートする場合の例 With ActiveWorkbook.Worksheets("sheet1").Sort   .SetRange Range("A1:AP231196")   .Header = xlYes   .MatchCase = False   .Orientation = xlTopToBottom   .SortMethod = xlPinYin   .Apply End With ↓ With ActiveWorkbook.Worksheets("sheet1").Sort   .SetRange Range("A:AP")   .Header = xlYes   .MatchCase = False   .Orientation = xlTopToBottom   .SortMethod = xlPinYin   .Apply End With

sherman
質問者

補足

ご回答ありがとうございます。 ソートする前の段階で困っています Selection.CurrentRegion.Select ActiveWorkbook.Worksheets("sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("sheet1").Sort.SortFields.Add Key:= _ ActiveCell.Offset(0, 9).Range("A1:A231195"), ---->ここSortOn:=xlSortOnValues, Order:= _ xlDescending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("0_Ver2_PER_Summary").Sort .SetRange ActiveCell.Offset(-1, 0).Range("A1:AP231196")---->削除したら保存された .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With 4行目の処理方法をお教えください

関連するQ&A

  • EXCELでマクロが

    昨日から、期待する動きでなくなりました。 シートに新たに数式を加え、rank関数ではきちんと表示するのですが、マクロを動かすと、 期待した動きでなくなりました。 Sub Sheet2STD昇順並べ替え() ' ' Sheet2STD昇順並べ替え Macro ' ' Range("B6:V24").Select ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("C7:C24") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet2").Sort .SetRange Range("B6:V24") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A1").Select End Sub 図にある下向きの矢印にマクロを登録しています。

  • Excelのマクロでソートがうまく動かない

    *** ソース *** Sheets("Sheet 1").Select Range("B2:H92").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("H3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select Sheets("Sheet 2").Select Range("B2:K49").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("I3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select ... 以下省略 ************* 上記のように複数のシートを一括してソートを行うようにマクロを組んでいます。 ですがマクロを実行するとタイトル行も含めてソートを行うなど、おかしな挙動になってしまいます。 ソートの条件としては「範囲の先頭行」を「タイトル行」で行わせたいのですが、「データ」でソートを行うシートが出てしまうのです。 太字にすると回避できるなど試したのですが、うまくいかなかったです。 Header:=xlYes にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。 よい方法をご存知の方がいましたら、ご教授下さい。

  • エクセルの並べ替えをマクロで

    知識が無くなかなか解決しません。教えて下さい。 エクセル(2000)のマクロの記録で並べ替えを記録すると下記の様になりました。 Range("A1:M57").Select ActiveWorkbook.Worksheets("表2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("C2:C57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("表2").Sort.SortFields.Add Key:=Range("D2:D57"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("表2").Sort .SetRange Range("A1:M57") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select End Sub 次のように改良する方法を探しています。 (1)Range("A1:M57").Select → 表によって行数が違う為、行数とおりに範囲選択したい。 M65536とすれば良いのかもしれませんが、パソコンの処理能力が低く、なるべく負担が掛からない様にしたいのですが。列数はA列からM列の限定です。 (2)ActiveWorkbook.Worksheets("表2")  → ("表2")限定ではなく他のシート名でも並べ替えが出来る様にするにはどのようにすれば良いのでしょうか。 いろいろ試しましたがうまく出来ません。お知恵をお貸し下さい。よろしくお願い致します。

  • マクロ記録で作成した並べ替えのコードを修正したい

    Windows7 Excel2007 使用しているマクロ初心者です。 マクロ記録で、次の2個のスクリプトをつくりました。 二つとも正常に実行できています。 しかし、このコードは .SetRange Range("A3:N26")の部分をいちいち手動で変更しなくてはなりません。 この部分を自動で設定し、しかもどちらの一覧表でも使えるコードにしたいです。 どう修正したらよろしいでしょうか? .Header = xlNo以下のコード省略できますか? Sub 一覧表1のソート() Range("B2").Select Worksheets("一覧表1").Sort.SortFields.Clear Worksheets("一覧表1").Sort.SortFields.Add Key:=Range("B2"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Worksheets("一覧表1").Sort .SetRange Range("A3:N26") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub ---------------------------------------------------- Sub 一覧表2のソート() Range("B2").Select Worksheets("一覧表2").Sort.SortFields.Clear Worksheets("一覧表2").Sort.SortFields.Add Key:=Range("B2"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Worksheets("一覧表2").Sort .SetRange Range("A3:P28") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • マクロのシートでのコピーができません。

    ビスタ エクセル 2007を使用しています。B2~E12まで簡単な表を作り E列で昇り順に並べ替えしました。そして並べ替えからこの表を印刷するまでマクロで完成しました。 ところが、別のシートにコピーすると印刷はされますが、並べ替えがされずに印刷だけされます。同じ表を30枚作成し、それぞれ同じ操作と印刷のマクロを組みたいのですが・・・・どなたか助けてください。 Sub ボタン5_Click() ' ' ボタン5_Click Macro ' ' Columns("E:E").Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("E1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("B2:E12") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub

  • 記述を簡略化させたい

    お世話になります。 下記の記述をスマートにさせたいのですが、ご教示お願いします。         記 Sub 優先順位() Range("A16:Y25").Select Selection.Sort Key1:=Range("Y16"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A43:Y52").Select Selection.Sort Key1:=Range("Y43"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A70:Y79").Select Selection.Sort Key1:=Range("Y70"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A97:Y106").Select Selection.Sort Key1:=Range("Y97"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A16").Select End Sub

  • エクセル・並び替えのマクロ

    エクセルで並び替えのマクロを作ったのですが ___A ______B ______C ______D ______E ______F _____________G 1 (株)カネカ【東証1部 : 4118.T】 2 日付 __始値 _高値 _安値 _終値 _出来高 ___調整後 3 07/07 1,030 1,069 ___941 __974 30,772,000 ___974 4 07/06 1,057 1,093 1,016 1,033 26,904,000 1,033 5 07/05 1,080 1,086 1,023 1,051 26,541,000 1,051 6 07/04 1,113 1,209 1,087 1,098 36,317,000 1,098 7 07/03 1,096 1,128 1,020 1,124 23,988,000 1,124 8 07/02 1,098 1,147 1,020 1,105 28,609,000 1,105 9 07/01 1,100 1,158 1,078 1,082 17,808,000 1,082 このような表で マクロ記録開始 セルA3をクリック データ→並び替え 優先されるキー:日付・昇順 データ範囲の先頭行:タイトル行 マクロ記録終了 で、できたマクロが Sub Macro1() Range("A3").Select Range("A1:G9").Sort Key1:=Range("A3"), Order1:=xlAscending,Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 1行目、2行目の(株)カネカ、日付、始値…、が8行目、9行目になってしまいます そこで、マクロの Range("A1:G9")を Range("A3:G9")に書き換えて Sub Macro2() Range("A3").Select Range("A3:G9").Sort Key1:=Range("A3"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 日付が、07/07、07/01、07/02、07/03、07/04、07/05、07/06 の順番になってしまいます どうしたらよいのでしょう?

  • エクセルマクロのソートについて

    こんにちわ! エクセルマクロのソートについて質問です。 プロシャージャを使ってソート使いまわそうと思うのですが、範囲、並び替えキーを変えたいと思うのですが可能でしょうか? Sub Sort()    Range("A1:c10000").Sort _ Key1:=Range("a1") , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 一応、動作はしませんが下記のようなイメージで動かしたいです。 Sub Sort() Dim key As String Dim hanni As String key = Range("a1") hanni = Range("A1:c10000") 'セルhanniの範囲のデータをkey列をキーに昇順に並べ替えます hanni.Sort _ Key1:=key _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 可能でしょうか? わかる方おりましたらアドバイスの程お願いします。

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • エクセルVBA

    お世話になります。 マクロの記録で、下記のようにC列を基準に表内を並べ替えるように記録されました。 Range("C4").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("AQ5:AQ39" _ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A4:EJ39") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ご教授いただきたい点が2点あります。 1. end行 (今のところ39行め) が毎回変わっても その位置を認識して、対応するようにしたいのですが、 どのように書き換えるとよいのでしょうか? C4は、タイトル行で、毎回固定です。 やはり、毎回最終行の次の行 (今回のケースでいうと、40行目に)に、 endと手作業で入力する方法しかないでしょうか? それしかない場合は、その記述の仕方をお願いします。 例えば、最大500行もあればいいので、途中の空白セルは、無視して 並べ替えをしてくれる記述などで教えていただけるとありがたいのですが・・・ 2. 必ず、active なシートを選択しておいてから、マクロを実行するとして、 シート名の sheet1 も可変にしたいです。 よろしくお願いします。m(_ _)m

専門家に質問してみよう