エクセルデータの並べ替え方法とは?

このQ&Aのポイント
  • エクセルデータの並べ替え方法やマクロの利用について、教えてください。
  • エクセルデータを縦長に使用している場合、印刷面の右側が空白になってしまいます。マクロを利用して96行ごとに2列に分けたいと思っています。
  • 切り取って出来た空欄を削除して上方向にシフトする操作を繰り返す方法を教えてください。
回答を見る
  • ベストアンサー

エクセルデータの並べ替えに関して

エクセルデータの並べ替えに関して A列からH列まで数値が入っていて、それが8,000行くらいあります。(毎回変動します。) A1からH8000くらいのセルに値が入っています。 エクセルを縦長に使用しているので、このまま印刷をすると印刷面の右側半分以上が空白に なってしまいます。 マクロを利用して、これらの値を96行ごとに2列分けたいと思っていますが、どうやったら 良いか、教えていただけないでしょうか。 (マクロ実行前)--------------  A B C D E F G H 1 1 2 3 4 5 6 7 8  2 2 3 4 5 6 7 8 9 3 3 4 5 6 7 8 9 10 4 4 5 6 7 8 9 10 11 ・・・・・・ ---------------------------- のように下方向に数字が並んでいる場合、マクロを実行したら 次のようにしたいと思っています。 (マクロ実行後)--------------  A B C D E F G H (I) J K L M N O P Q 1 1 2 3 4 5 6 7 8(1行空き)97 98 99 100 101 102 103 104 2 2 3 4 5 6 7 8 9(1行空き)98 99 100 101 102 103 104 105 3 3 4 5 6 7 8 9 10(1行空き)99 100 101 102 103 104 105 4 4 5 6 7 8 9 10 11(1行空き)100 101 102 103 104 105 106 ・・・ 96 96 97 98 99 100 101 102 103(1行空き)192 193 194 195 196 197 198 199 97 193 194 195 196 197 198 199 200(1行空き)289 290 291 292 293 294 295 296 ・・・・・・ ---------------------------- (1)A1からH96までを切り取って、J1に貼り付ける。 (2)「(1)」で切り取って出来た空欄を削除して上方向にシフトする。 (3)A97からH192までを切り取って、J97に貼り付ける。 (4)「(2)」で切り取って出来た空欄を削除して上方向にシフトする。 といった操作を「切り取って出来た空欄を削除して上方向にシフトする。」という操作を しようとしたら上方向にシフトするデータがなくなるところまで続けたいと 思っています。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

NO1です。 sheet1、sheet2はオブジェクトでシートタブ名ではありませんので、紛らわしかったと思いますので以下のコードをお試しください。 因みにデータの空白は意識していませんのでエラーとは関係ありません。 Sub test() cc = Val(InputBox("分割行数を入力して下さい。", "分割行数の入力", 96)) If cc < 8 Then Exit Sub Set a = Worksheets("sheet1") '元データシート Set b = Worksheets("sheet2") '印刷用シート last = a.Cells(Rows.Count, 1).End(xlUp).Row / cc If a.Cells(Rows.Count, 1).End(xlUp).Row Mod cc Then last = last + 1 End If For i = 1 To last If i Mod 2 Then b.Cells(1, 1).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ a.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value Else b.Cells(1, 10).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ a.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value End If Next End Sub

donald1982
質問者

お礼

ありがとうございます。 少し進みました。 ただ、ABCD列の情報は指定した行ごとにJKLM列に移るのですが、 EFGH列の情報がなくなってしまいました。 マクロを使い始めて半年くらいの身では、解読しにくく、 ステップインで実行したところ次の部分でEFGH列のデータがなくなってしまいました。 b.Cells(1, 1).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ a.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value この辺りを少し詳しく教えていただけませんか?

donald1982
質問者

補足

いろいろ調べながら作成しています。 分割行数に200を入れると、4,001行目から下のデータが残っている。 分割行数に100を入れると、3,901行目から下のデータが残っている。 分割行数に50を入れると、3,851行目から下のデータが残っている。 という問題点が出てきました。 もう少し調べてみます。

その他の回答 (3)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.4

NO2です。 >分割行数に200を入れると、4,001行目から下のデータが残っている。 >分割行数に100を入れると、3,901行目から下のデータが残っている。 >分割行数に50を入れると、3,851行目から下のデータが残っている。 >という問題点が出てきました。 >ただ、ABCD列の情報は指定した行ごとにJKLM列に移るのですが、 >EFGH列の情報がなくなってしまいました。    ⇒回答しましたコードをそのまま貼り付けて頂ければこのような事はないのですが。   同様のデータを使ってシミュレートしてもそのような振舞になりません。   因みに動作環境は、win XP、エクセル2007です。    >ステップインで実行したところ次の部分でEFGH列のデータがなくなってしまいました。 >b.Cells(1, 1).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ >a.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value  ⇒奇数回はA1、偶数回はJ1を基準にCC行数×8列分を範囲コピーしているだけです。

  • kuma56
  • ベストアンサー率31% (1423/4528)
回答No.3

>マクロを利用して、これらの値を96行ごとに2列分けたいと思っていますが、どうやったら良いか、教えていただけないでしょうか マクロについて勉強してください・・・・っていう答えは? このサイトはマクロの作成依頼はその主旨にそぐわないことはお存知ですね? マクロについての解説サイトもWEB上で容易に見つける事が出来ると思います。 さらに、エクセルには"マクロの記録"という機能があり、手作業で行った結果をマクロに記録してくれます。 質問文の作業をある程度繰り返す所までこの機能で記録してみましょう。 相対参照と絶対参照をうまく使い分けると、途中から同じ記述が繰り返されるようになります。 その部分は " Do Loop " 等を使って繰り返してやればひとまとめにして一回の記述で済みます。 ただしこのままではずっと繰り返されてしまうので、作業の区切りになる所(質問の場合は 上方向にシフトするデータがなくなるところ)で " IF " で条件分岐させて終わらせてやればいいでしょう。 答えは一つだけとは限らず、先にデータを二行に並べ替えてから印刷する方法や、印刷する一ページ分だけデータを並べて繰り返す方法なども可能でしょう。 >(1)A1からH96までを切り取って、J1に貼り付ける。 ・・・ん? ↑この作業は必要ですか?? >(3)A97からH192までを切り取って、J97に貼り付ける。 J1セルに張り付ける では?

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一例です。 別シートに並び替える方法ですが如何でしょうか。 仮にデータをsheet1として、sheet2タブ上で右クリック→コードの表示→以下のコードを貼り付け、マクロ実行でsheet2に並び替えします。 因みに分割行数を入力する様にしています。(ディフォルト96行で8行未満は無効) Sub test() cc = Val(InputBox("分割行数を入力して下さい。", "分割行数の入力", 96)) If cc < 8 Then Exit Sub last = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row / cc If Sheet1.Cells(Rows.Count, 1).End(xlUp).Row Mod cc Then last = last + 1 End If For i = 1 To last If i Mod 2 Then Sheet2.Cells(1, 1).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ Sheet1.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value Else Sheet2.Cells(1, 10).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ Sheet1.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value End If Next End Sub

donald1982
質問者

補足

集計前のシート名を「Sheet1」として、新しく「Sheet2」という名前のシートを 入れて、「Sheet2」上で教えていただいたマクロを実行しました。 すると、下のエラーが出ました。 「実行時エラー'424': オブジェクトが必要です。」 「デバック」を押すと、次の部分がフォーカスされました。 Sheet2.Cells(1, 1).Offset(((i - 1) \ 2) * cc).Resize(cc, 8).Value = _ Sheet1.Cells(1, 1).Offset((i - 1) * cc).Resize(cc, 8).Value 「Sheet1」の元データのA列に空欄が何度も出てくることが原因でしょうか。

関連するQ&A

  • エクセルでデータ並べ替えをおこないたいです。

    イメージですがC列とF列を比較して 同じ値だったら同じ行に並べる。F列でデータの無いところの行は削除する。 最終結果のようなものがほしいです。実際データは1000行以上ありセルのデータも 50文字くらい有ります。

  • エクセルで空白せるだけ削除したい

    エクセルの操作で困っています。 どなたか、ご教授お願い致します。 例えば(4列4行のセルとお考えください)   A  空欄  F  空欄  空欄  C  空欄 空欄   B  空欄 空欄  H  空欄  D   E   G を空欄だけ削除して上に詰めて   A   C   F   H   B   D   E   G のように並び変えたいのですが良い方法はないでしょうか? 空欄を削除したい範囲は非常に広範囲で、どの列も昇順や降順で並んでいる訳ではなくランダムな文字列です。

  • Excel 2007のマクロ記述について

    Excel 2007で、B4セルからI最終行までの整数のみを小数点以下1桁にする処理をマクロで実行したいのですが、どのように記述したらよいか教えてください。 最終行とはI列にセルの値がある最後の行です。 下記の例のマクロ実行結果は、1→1.0、2→2.0となります。 (例)      列      A  B    C    D    E   F  G   H  I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2   2  2   CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6   1   1  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1   1  1.5  1.5  CIRCLE  CIRCLE マクロ実行結果      列      A  B    C    D    E   F  G   H   I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2  2.0  2.0  CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • 別のエクセルファイルの値をコピーをしたいです

    別のエクセルファイルの値をコピーをしたいです。 現在、仕事でファイルAにファイルBの値をコピーペーストをする作業を行っております。 しかし、量が多いのでいちいちファイルを開いてコピーして貼り付けという作業は時間がかかるのでマクロでやりたいと考えています。 そこで教えてほしいのですが、以下のような操作をマクロでするにはどうしてらよいのでしょうか? 1.ファイルAの列範囲F~J、行は9から下にファイルBの値をコピーしたい。 2.コピーするファイルBの値の範囲は、列E~I・行は1から下。 3.コピーするファイルBの行は毎日更新されるため、行の範囲は不特定です。 つまりは 昨日のファイルBの行は10まであり、マクロを実行するとファイルBのE1~I1からE10~I10の値がファイルAのF9~J9から下にコピーされる。 今日のファイルBの行は4まであり、マクロを実行するとE1~I1からE4~I4の値がファイルAのF9~J9から下にコピーされる。 という操作をマクロで実行したいと思っております。 また、ファイルBの名前も不特定のため、ファイルはダイアログで指定し、指定したファイルのE1~I1から下の値をコピーできるようにしたいです。 毎日の作業ですので、これが出来れば効率はぐっと上がります。 わかる方、どうか回答宜しくお願いいたします。

  • エクセルで数字の下1桁を見て並び替える

    エクセルで下記の様な数字が並んでいます。 A列の下1桁の数字は上から順に増えていて、ある数字で1に戻りまた増えています。 その数字は毎回同じではなく、6までの場合もあれば10までの場合もあります。 下記の例では上から6行、次は4行、次は7行と下1桁の数字によってグループ分け出来ますよね? それで上から6行目までのB列の値(462~530)をコピーしてSheet2のA1から横方向に並べます。 その次は7行目から10行目までのB列の値(356~487)をコピーしてSheet2のA2から横方向に並べます。 その次も同じように並べます。 B列が空欄の場合もありますが、その場合はそのままSheet2にも空欄のセルを作ります。 1グループ全部のB列が空欄でもそのままSheet2に空欄の行を作ります。 この動作をマクロで出来る式を教えて頂けないでしょうか? A列          B列 0213240101     462 0213240102    387 0213240103    556 0213240104    585 0213240105    536 0213240106    530 0213240201    356 0213240202    632 0213240203    486 0213240204    487 0213240301    586 0213240302    670 0213240303    619 0213240304 0213240305    645 0213240306    487 0213240307    651 0213240401 0213240402 0213240403 0213240501    455 0213240502    623 0213240503    411 Sheet2 A列   B列    C列   D列    E列    F列   G列 462    387    556    585    536    530 356    632    486    487 586    670    619            645    487    651    455    623    411

  • データ エクセルの改行

    いつもお世話になります。 取引先からあるデータをエクセルで頂きましたが、それはA列に1行~8000行まであるデータでした。それをそのまま印刷しようとすると、A4用紙で60枚以上になり大変です。A列にしかないので指定した行で改行し1ページにそのデータをなるべくまとめて印刷したく思います。 1    (株)A社 2    (有)b社 3    (株)c社 4    d商店 5    e商事 |    ・・・・ 7998 f会社(株) 7999 g社 8000 h商店 マクロ組むしかないでしょうか?それしかないならマクロ初心者の私にも出来る方法あれば本あるいはHP教えていただけないでしょうか? よろしくお願いします。

  • excelのセルの並べ替え。

    Excelの操作で迷っています。詳しい方の知恵を拝借できたらと思います。 以下のようにデータの入力されたセルが並んでいます(アルファベット1文字が1セルです)。 A B C D E F G H I J K 横に何セル並んでいるかは、行によってまちまちです。このようなデータが、数千行あります。これを、以下のように1列に並べ替えたいのです。 A B C D E F G 「行列を入れ替えてコピー」ではなかなかに大変なので、何か良い方法を探しています。よろしくお願いいたします

  • エクセル・マクロについて教えてください

    こんにちは。エクセルのマクロについて教えてください。 エクセルの表で毎日20000~30000行くらいのデータがあり、フィルタを掛けてやるのもいいですが、業務効率を考えて、マクロを使用したいと思っています。 実行したい内容は、C列(担当)は8と721以外は削除、F列(地域)は渋谷と品川以外は削除、G列(コード)は1000未満と空白行は削除、H列(数量)は0以下を削除 簡易記録マクロで記録してみましたが、毎回データの内容が異なるため、H列のマイナスが削除されていなかったり等、実行したい結果が得ることができませんでした。 マクロも少し勉強していますが本やネットでも検索したりしましたが、うまくできませんでした。ご教授ください。

  • Excelである行を挿入で他の行のずれ

     A列、B列にデータが入っていて、C列には「=if(A1<>B1,1,"")」のような式が入っています。すなわち、隣り合うA列とB列のデータが異なるときC列の該当行に1を表示し、あっている場合は空欄となるようにしてあります。B列のある行(例えばB10)を右クリックして「下方向にシフト」としますと、C列が影響を受けてしまい、「=if(A10<>B11,1,"")」のようになってしまいます。Bがシフトした分だけ、修正してくれちゃうんですね。  私がしたいのは、シフトした後であっても、A列とB列の同じ行を比較したいのです。B行の「下方向にシフト」の操作をしても、C行に影響を与えない方法がありましたら、お教えください。

専門家に質問してみよう