• ベストアンサー

36回のソート&コピ&ぺを、1度のマクロ実行で行うには?

初心者です。WinXP、Excel 2002を使用してます。 四苦八苦しております ブックのシート数は変動しますが、例えば、 1、37シート目(集計1)に、1行目とA列が項目で、37行(37行以下)かつ100列(100列以下)のデータ表(小数点以下の桁数1以下、空白もあり)があります。それをまず「行列を入れ替え」(私が、縦方向の方がソートしやすいと思ったため)ます。 2、次に、その1行目とA列が項目の、100行(100行以下)かつ37列(37列以下)のデータ表の、データ部分を縦方向に「昇順で並べ替え」(小数点以下の桁数1以下、空白もあり)ます。 3、うち縦方向のトップ7までだけのデータを、再度、「行列を入れ替え」て、次シートの38シート目(集計2)へ貼り付けます。元の37行(8列)のデータ表に戻ります。 ちなみに、最初(元)はソートするデータが列方向のため、縦方向でソートしたほうが良いと思いまして、2回の「行列を入れ替え」を入れました。 また、「行列を入れ替え」が2回もあるので、39シート目(集計3)のシートも追加しても構いません。 以上 36回のソート&コピー&ペースト を1回のマクロ実行で行うことができればと思っております。    どうかよろしくお願い致します。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#1です。 > 注意して、実行前に目的のシートをアクティブシートにして > おけばよいかと思っております。 確かにその通りです。 ただ、連続で実行させる場合は意図しないシートがアクティブな状態で前のマクロが終わる事が無いように注意が必要だと言うだけです。

oshietecho-dai
質問者

お礼

度々、誠にどうも有難うございます。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#1です。 複数のマクロを順番どおりに実行するには実行用の Sub を作って他のマクロを Call してあげると簡単です。 また、単独で実行する事が無いなら Sub を Private Sub にしてやるとマクロ実行のダイアログに出てこなくなり、Test1の次にTest2を実行しないとダメというケースの場合に有効です。 (但し、同一モジュールに記載されていないとダメ) '------------------------------------ Sub Jikkou()   Call Test3   Call Test4 End Sub '------------------------------------ Private Sub Test3()   MsgBox "Test3だ" End Sub '------------------------------------ Private Sub Test4()   MsgBox "Test4だ" End Sub あと、「自身でちょっと編集しました」と言う事ですが、繋ぎの部分が少し気になります。   Columns("A:D").Select   Selection.Delete Shift:=xlToLeft や   Range("C:C,D:D,E:E,F:F,G:G,H:H").Select   Range("H1").Activate   Selection.Insert Shift:=xlToRight という記述はシートを指定していませんので、実行した時にアクティブだったシートに対して処理されてしまいます。 処理したいシートを明示的に指定しないと別シートのデータを削除してしまったなんて事に成りかねません。 例えば、   Worksheets("集計1").Activate   Columns("A:D").Select   Selection.Delete Shift:=xlToLeft 又は   Worksheets("集計1").Columns("A:D").Delete Shift:=xlToLeft のように事前にアクティブシートを変更してやるか、直接指定するなどの対応が必要かと思います。

oshietecho-dai
質問者

お礼

バッチリ、Callできました。 誠に、有難うございます。 一箇所だけ、ご報告だけさせて頂きます。 -------------- > Worksheets("集計1").Activate   Columns("A:D").Select   Selection.Delete Shift:=xlToLeft -------------- の部分ですが、このまま貼り付けてみましたが、 シート名が相違(例:Sheet2)してましても、エラーにならずに、編集前と同様に書き込まれますが、 私の編集方法のどの点が悪いかが、解りません。 でも 注意して、実行前に目的のシートをアクティブシートにしておけばよいかと思っております。 下記をまた、もし、可能でございましたら、一度ご査収願います(今度は、違う形体のブックでございます)。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2309773

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

この質問にある内容だけで、完全に要望にfitするマクロは作れないかもしれません。 手順が毎回同じなら「ツール」→「マクロ」→「新しいマクロの記録」で操作を行って手順通りのマクロを作って見たらいかがですか? そのマクロが思ったように動かなければ、再度マクロを掲載して相談する方が早いのではないでしょうか。 なお1~3を読んでも「36回のソート&コピー&ペースト」は発生しないように思うのですが、補足していただければ幸いです

oshietecho-dai
質問者

お礼

ご回答どうも有難うございます。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

http://okwave.jp/kotaeru.php3?q=2297614 こちらの次のステップでしょうけど、正直に言って何をどうしたいのか良く解りません。 行列を入れ替えて、縦方向にソートして、再度、行列を入れ替える? 並び替えにはオプションがあって、行方向、列方向を指定出来るのですが、、、 どんなデータをどんな結果にしたいのか具体的なサンプル例と記録マクロを出された方が良いかも。 一応、下記は最終シートの A2から最終行までのデータを「列単位」で「昇順」に並び替えます。 試すならテスト環境で。 Sub Test2() Dim r As Range With Worksheets(Worksheets.Count) For Each r In .Range("A2", .Range("A65536").End(xlUp))    r.Offset(0, 1).Resize(, 255).Sort key1:=r.Offset(0, 1), _     Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _     Orientation:=xlLeftToRight Next r End With End Sub

oshietecho-dai
質問者

補足

誠に有難うございます。完璧でございました。 「Test2」にて、私の望んでいる表になったと思います。 「行列の入れ替え」は、自身が作業しやすいと勝手に思ったことでございますので意味はございません。 またサンプルと言いましても、数字のデータだけでございまして、それを整理するのに四苦八苦してる状況です。 290.9 318 660.2 673 392.9 523  … 27.6 49.5 705.4 796.3 1324.3 54   …  726.8 731.7 1161.2 52.8 621.1 562.3 … 大変恐れいりますが、ご教示願います。 前回(下記)のご回答「Test」 と 今回の「Test2」 を1回の実行で行うには、どのようにつなげて編集すればよろしいのでしょうか? 各コードの後編だけ、自身でちょっと編集しました(確認済、間違いがあるかも知れませんが!)。 --------- Sub Test() Dim i As Integer On Error Resume Next For i = 1 To Worksheets.Count - 1 Worksheets(i).Range("A65536").End(xlUp).Offset(-2, 0).EntireRow.Copy _ Destination:=Worksheets(Worksheets.Count).Range("A65536").End(xlUp).Offset(1, 0) Next i Columns("A:D").Select Selection.Delete Shift:=xlToLeft End Sub --------------------- Sub Test2() Dim r As Range With Worksheets(Worksheets.Count) For Each r In .Range("A2", .Range("A65536").End(xlUp)) r.Offset(0, 1).Resize(, 255).Sort key1:=r.Offset(0, 1), _ Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _ Orientation:=xlLeftToRight Next r End With Range("C:C,D:D,E:E,F:F,G:G,H:H").Select Range("H1").Activate Selection.Insert Shift:=xlToRight End Sub ---------------------- 補足:実際は、「Test」の前段階で1度マクロ作業をしております。 当作業は、元々は同ファイルで、1つのフォルダにある同CSVファイルからの作業なんですけど、複数の作業段階があリまして、それを1度にうまくまとめて質問書きする力が私にはありませんので、それぞれ区分けしてご質問をさせて頂いたわけでございます。 できれば、前段階のコードもつなげることが可能でしたら、また、改めて、ご質問をさせて頂きます。

関連するQ&A

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

    エクセルで縦方向(複数列)にデータを入れていっているのですが、 その中の1つの列のデータを昇順とかでソートしたときに、 その列しかソートされません。 行単位で意味を持ったデータなので、 どこの列でソートしても行も追随してソートしたいのですが、 どうすればいいのでしょう?

  • エクセルのソート

    エクセルでソートをかけたいのですが・・・・・・ たとえピポットテーブルで集計をかけたものがあるとします。 集計では、元数字の行とそれに「集計」の文言が入った行になりますが、その「集計」の 行だけを別のシートなりに取り出したいのですが何かいい方法はありませんでしょうか?  例      A列      B列      C列       1  ○○産業   ○○支店   100000     2  ○○産業○○支店 集計  100000     3  ○○商会            500000     4  ○○商会 集計        500000    となった場合2・4行目の「集計」の入った行を抜きたいのです。 宜しくお願いします。

  • コード追加編集方法は?36回のコピ&べを、1度のマクロ実行で行う

    初心者です。WinXP、Excel 2002を使用。 ブックの各シート(1~36シート、1~24シートの時もあり)の最後から3行目だけ(最後行が80行なら78行目全部だけ)を、シート名「集計1」(37シート目)に上から順次書き込むようにするには、下記コードを、どのように追加編集すればよろしいのでしょうか? 1、36シート分(24シート分のときもあり)のシート名は  ・シート1~12  は R02061701、R02061702 ~ R02061712  ・シート13~24  は R03062701、R03062702 ~ R03062712  ・シート25~36  は R08064701、R08064702 ~ R08064712  のように、それぞれ下2桁だけが1~12まで連番で、3セットで繋がっております。  ・シート37(シート25の時もあり)は  集計1 2、各シートの最後の行(全シート100行以内)から3行目全部だけ(最後行が80行なら78行目全部だけ)を、「集計1」(シート37(25))の、セルA2→A37(25)まで順次書き込んで行きます。 下記コードは、  Ctrl+↓(最後のセル) → ↑にて2つ目の行全体を選択 → 「集計1」の、セルA2へ コピー&べースト だけのコードです。 以上 36回コピー&べースト を1回のマクロ実行で行うことができればと思っております。    どうかよろしくお願い致します。 ------------------- Sub 最後から3行目だけコピ&ベ() ActiveWindow.ScrollWorkbookTabs Position:=xlFirst ActiveWindow.ScrollWorkbookTabs Position:=xlFirst Sheets("R02061701").Select Range("A17").Select Selection.End(xlDown).Select Rows("33:33").Select Selection.Copy ActiveWindow.ScrollWorkbookTabs Position:=xlLast Sheets("集計1").Select Range("A2").Select ActiveSheet.Paste Range("A3").Select End Sub

  • マクロで、並び順・行列を入れ替えて貼り付け

    複数の棚式の表から、一つのシートに並び順・行列を変えて貼り付けて 集計表を作りたいと思っています。 マクロは記録から意味を調べたり、範囲の応用をするくらいの初心者です。 Sheet1が集計表、Sheet2~5がそれぞれの現場での棚の表です。 <Sheet1> 集計表  |  A  B    C    D   E  F  G  H  I ----------------------------------------------------------- 1|  連番 店名 お勧め 品名 金額 棚番 棚行 棚列 備考  2|   1   亜   ●   ああ  50  1  2   2  aa 3|   2   亜       いい  80  1  2   3   4|   3   亜   ●   うう  30  2  3   1  bb 5|   4   亜       ええ  20  3  1   1 6|   5   亜       おお  90  4  2   2 <Sheet2> 棚1  |  A  B   C   D   E  -------------------------------------------- 1| 店名  亜  2| 品名     ああ    他 3| お勧め    ●          4| 金額     50         5| 備考     aa  6| 品名   いい  7| お勧め                  8| 金額           80    他 9| 備考                        10| :               <Sheet3> 棚2 <Sheet4> 棚3 <Sheht5> 棚4 以前、逆の方法(集計表→棚)の質問させて頂きました。http://oshiete1.goo.ne.jp/qa3489046.html 他の質問も調べたりして、なんとか応用できないものかと思ったのですが、 恥ずかしながら私のスキルでは対応できません。 今回は棚の表に棚番号、行、列の情報がありません。 現在途中まで組んでみたのは ○空のシートにSheet2!B2:E9をそのまま行列入れ替えで貼り付けて 一つのリストにしてから、改めて集計表に貼り付ける。 ○棚番号、行、列はそれぞれ入力、貼り付けする。 と原始的なものです^^; 2つの質問で恐縮ですが、以下のマクロについて ご指導頂けましたら幸いです。 1.Sheetから棚番号、各シートのセル位置から行列の番号の割り振り。 2.Sheet2~5の表をSheet1の形式に貼り付け。   「他」の部分は後でソートか置き換えで削除するので、 貼り付けの時は残っていても大丈夫です。 ちなみにお勧めや金額は空白の場合もあり、確実に入っているのは品名です。 自分の拙いマクロではSheet1で貼り付ける時に、D列(品名)を参照して、 xlUp、Offsetで左右に移動して貼り付けていました。 分かり辛い説明ですみません。 何かあれば補足させて頂きます。 よろしくお願いいたしますm(_ _)m

  • エクセルでのマクロを教えて

    下記のようなものをみたすマクロは組めますか? ファイルにシートが何種類かあります。 sheet1には各店の集計データーがあります。 その中にA列には集計の項目名がAZ列まであり 1行目には店舗名が10種類あります。 sheet2からはsheet名をsheet1に記入されている1行目にしている店舗名にしてあります。 またA列には集計の項目名がありますが sheet1にある項目と全く同じではなく 項目は少なくなっています。 また、sheet2からの店舗名にはsheet1の集計表にはない 店舗名もあります。 このsheet1のデーターをもとに sheet2の1行目の項目と一致する項目の値や数字を sheet1からコピーするというものです。 よろしくお願いします。

  • ソート表を作りたい(Exce;)

    A列に番号が入っていて(記号を含む、重複はなし)、B,C,D...列にそれぞれの行に対応するデータが入っています。別のシートへ、A列でソートした表を作りたいのですが、よい方法がありましたらお教えください。できるだけ、数式で処理して、最初のデータが変わったら、即座にそちらの表も変わるようにしたいのです。

  • VBA マクロを使って、コピー ソートしたいです

    画像でシート1の状態を、マクロでシート2のようにしたいです。 なにぶん初心者なので、効率のいいスクリプトがかけません。 よろしくお願いします。 条件としては シート1には大きく分けて3つ表がありますが、実際は10個あります。 10個目までシート2上でデータがつながっている感じです。 B,G,L列の連番はデータの個数です。 シート1にあるように、表ごとに入ってる個数はばらつきます。 シート2 のA列はシート1のB,G,Lの2行目の番号が入っています。

  • エクセルのソートのマクロ

    エクセルでのソートのマクロを教えてください。  範囲選択は手動でその都度変更します。優先列、昇順は変更ありません。 例えば、AからE列までデータがあり、第一優先列をD列、第二優先列をA列として、それぞれ昇順でソートします。 範囲はその都度手動で複数行を全列選択します。 つまり、適宜、複数行を選択してからこのマクロを実行すれば常に先の形式でソートできるようにしたいです。  わかりにくい記述で恐縮ですがよろしくお願いします。

  • マクロ ソートをしたいのですが、組み込めますか

    マクロの説明 1.Sub Sample7()はsheet4の列をソートするマクロです。 (単独では、このマクロでソートできる) 2.Sub sample2()はsheet4のソート以外は完成しています。 やりたいこと Sub sample2()の中にsheet4の重複データを削除したもののソートのコードを組み込みたい。 但し、組み込むとしてSub Sample7()のコードでよいのか、初心者なのでよくわかりません。 なお、Sub sample2()のマクロは途中省いています。 Sub Sample7() Sheets("sheet4").Range("A1:A1135").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes End Sub Sub sample2() Dim data As Variant 'データコピー用の使いまわし配列 Dim dic As Object Dim i As Long Set dic = CreateObject("Scripting.Dictionary") 'Sheet4~5のA列をリセット Sheets("Sheet4").Range("A2:A" & Rows.Count).ClearContents Sheets("Sheet5").Range("C3:C" & Rows.Count).ClearContents            ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 'Sheet4に重複していないデータを書き込み With Sheets("Sheet4") .Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(dic.Count).Value = Application.Transpose(dic.keys) 'Sheet4のC列をSheet5にコピー data = .Range("C2:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value End With Sheets("Sheet5").Range("C3").Resize(UBound(data)).Value = data Set dic = Nothing End Sub

  • Excel 2000でソートさせようとすると・・・

    何時も皆さんの明確な回答感心するばかりです。  質問ですが、Excel2000で住所録を作りました。同窓会用なので1つのブックに3枚のシートがあり、それを増やして6枚にして1組から6組までとしました。各シートの1列目に名前、〒、住所、電話、メルアド、てな感じで入力してその下に各人をどんどん入れていきました。ここまでは良かったんですが、各項目でソートをかけたところ2枚目(2組)だけはどんなにソートをかけても1列目はソートされないのに、他のシートは1列目まで一緒にソートされてしまいます。 色々本を見たり会社の得意そうな人に聞いたりしてみましたが、答えが返ってきません。自分なりにいじって見た所、データ→並べ替え、と見ると2枚目は範囲の先頭行がタイトル行に2枚目以外は範囲の先頭行がデータにチェックが入っています。これを換えてOKとするのですが保存されない様で又すぐもとに戻ってしまいます。(表現は正しいのかな?) おそらくこれが原因だと思うのですがどう直すのか、はたまた私がヘンなことしているのかよく解りません。どのシートも同じように造ったつもりなんですがどなたか、教えて下さい。ヘ(x_x;)ヘ

専門家に質問してみよう