• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルデータの並べ替えに関して)

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

このQ&Aのポイント
  • エクセルデータの並べ替え方法やマクロの利用について、教えてください。
  • エクセルデータを縦長に使用している場合、印刷面の右側が空白になってしまいます。マクロを利用して96行ごとに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