Excelのデータの並べ替えは(データ→並べ替え)で出来ますよね。
ところが一枚のシートにデータが入りきれず、複数のシートになった場合、
どのようにデータの並べ替えを摺るのでしょうか教えてください。
宜しく、お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ピポットを使ってデータの参照時に複数のワークシートを指定してみるというのはどうでしょうか。

    • good
    • 0

もしどなたからも(VBAを使わない)エクセルだけでの解答が出なければご参考にしてください。


sheet1のA列のデータ数+SHEET2のデータ数が6万数千の
エクセルの許容行数を越えていると言うことでしょうか。
それだと下記はだめですが、SHEET1のデータ数+SHEET2
のデータ数<エクセルの許容行数と仮定して述べます。
大型コンピュターのバッチ・プログラムでよく使ったマージの
ロジックです。ソート結果をSHEET1のB列にセットしています。
SHEET1のA列とSHEET2のA列はエクセルのソートをして後
最終行の下のセルにowariといれ、下記を実行してください。
6万数千のエクセルの許容行数を越えているときは、下記の
CELLS(I、2)の3箇所のところをディスクファイルに書き出だせば、
目的は達せられます。
Sub sort1()
x = 1 ’sheet1のスタートは第1行から
y = 1 ’sheet2のスタートは第1行から
i = 1 ’sheet1のソート後のデータのセットは第1行から
'------------
p1:
If Worksheets("Sheet1").Cells(x, 1) ="owari” Then
'cells(x,1) はSHEET1のA列x行を表す
Worksheets("Sheet1").Cells(x, 1) = 99999999
End If
If Worksheets("Sheet2").Cells(y, 1) ="owari" Then
'cells(y,1) はSHEET2のA列y行を表す
Worksheets("Sheet2").Cells(y, 1) = 99999999
End If
'---------等しい時
If Worksheets("Sheet1").Cells(x, 1) = Worksheets("Sheet2").Cells(y, 1) Then
If Worksheets("Sheet1").Cells(x, 1) = 99999999 Then GoTo owari
Worksheets("Sheet1").Cells(i, 2) = Worksheets("Sheet1").Cells(x, 1)
'cells(i,2) はSHEET1のB列 i 行を表す
i = i + 1 '直下の行にセットする
x = x + 1 '直下の行を見る
Else
'--------SHEET1が小
If Worksheets("Sheet1").Cells(x, 1) < Worksheets("Sheet2").Cells(y, 1) Then
Worksheets("Sheet1").Cells(i, 2) = Worksheets("Sheet1").Cells(x, 1)
i = i + 1
x = x + 1
Else
'--------SHEET2が小
Worksheets("Sheet1").Cells(i, 2) = Worksheets("Sheet2").Cells(y, 1)
i = i + 1
y = y + 1
End If
End If
GoTo p1
owari:
End Sub
    • good
    • 0

Excelだけで行うとすると、


(1)元の複数のシートをシート単位にソートしてしまいます。
(2)データ量と、どのようなデータか分かりませんが、例えばソートキーが1万未満、1万番台、2万番台・・・
   という感じで元のシートから別シートに集めて、そのシートを再度ソートしたらどうでしょうか。

10万件程度なら必要なシートは2枚で、2分割する位置を決めれば1回この操作を行えば可能だと思いますが・・・
    • good
    • 0

ACCESSを利用して、並べ替えたデータをシートにするのが


簡単と思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q複数シートの一部をシート一枚にまとめるには?

住所録があります。 一枚のシートに住所、名前、電話番号が横にならんで3つのセルに記載されているのですが毎月100シートほど出来上がっておりこれを一枚のシートに手入力で転記しております。
あまりにも非効率的なのでVBA等で一括処理をしたいのですがどうすればよいでしょうか?

Aベストアンサー

こんにちは。
既に回答は出ているようですが、こんな風にしたらどうでしょうか。

iHEAD オプションのタイトルというのは、

 住所  名前  電話番号

こうなっていることです。

すでに集計用のシートが決まっているなら、このようにします。
ただし、集計用のシートは、右端に追いやられます。

先頭に、(') をいれ、コメントブロックします。
  'Set DataSh = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))

コードのコメントブロックを外します。
 ''集計用のシートがすでに決まっているなら、上の行に、「'」を付けて、ここに登録する
  Set DataSh = .Worksheets(シート名)
  If DataSh.Index <> .Worksheets.Count Then
    DataSh.Move After:=.Worksheets(.Worksheets.Count)
  End If

行が満杯になったら、新しいシートが右隣に、加えられます。

標準モジュール
'-----------------------------------------------
Sub TransferData()
  Dim DataSh As Worksheet
  Dim i As Integer
  Dim j As Long
  Dim n As Long
  Dim k As Integer
  Const iHEAD As Integer = 1 '(0はタイトルなし、1はタイトルあり)
  If iHEAD > 1 And iHEAD < 0 Then MsgBox "iHEAD エラー!", , "定義エラー": Exit Sub
  Const mErrNum As Integer = 513
  
  With ActiveWorkbook
    '--------------------
    Set DataSh = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
    
    ''集計用のシートがすでに決まっているなら、上の行に、「'」を付けて、ここに登録する
    'Set DataSh = .Worksheets("Sheet1")
    'If DataSh.Index <> .Worksheets.Count Then
    ' DataSh.Move After:=.Worksheets(.Worksheets.Count)
    'End If
    
    If iHEAD > 0 Then
      .Worksheets(1).Range("A1:C1").Copy DataSh.Range("A1")
    End If
    '--------------------
    k = 1 'データ集計シート
    
    On Error GoTo ErrHandler
    For i = 1 To .Worksheets.Count - k
      Application.ScreenUpdating = False
      With .Worksheets(i)
        j = DataSh.Cells(Rows.Count, 1).End(xlUp).Offset(1).Row
        If iHEAD = 0 And j = 2 Then j = 1
        n = .Cells(Rows.Count, 1).End(xlUp).Row
        If (j + n) < Rows.Count Then
          .Range(.Range("A1").Offset(iHEAD), .Cells(Rows.Count, 1).End(xlUp).Offset(, 2)).Copy _
          DataSh.Cells(j, 1)
        Else
          Err.Raise 513
        End If
      End With
      Application.ScreenUpdating = True
    Next

ErrHandler:
    If Err.Number = mErrNum Then
      Set DataSh = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
      i = i - 1
      If iHEAD > 0 Then
        .Worksheets(1).Range("A1:C1").Copy DataSh.Range("A1")
      End If
      k = 2
      Resume Next
    ElseIf Err.Number > 0 Then
      MsgBox Err.Number & ": " & Err.Description
    End If
  End With
  Set DataSh = Nothing
End Sub

こんにちは。
既に回答は出ているようですが、こんな風にしたらどうでしょうか。

iHEAD オプションのタイトルというのは、

 住所  名前  電話番号

こうなっていることです。

すでに集計用のシートが決まっているなら、このようにします。
ただし、集計用のシートは、右端に追いやられます。

先頭に、(') をいれ、コメントブロックします。
  'Set DataSh = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))

コードのコメントブロックを外します。
 ''集計用のシートがすでに...続きを読む

Q複数のシートのデータを1つのシートにまとめる

年 月 日   摘要   (相手勘定) 借方 貸方   内消費税

27 10 1  帰省旅費    交通費 1,200 88
10 1 ヤマダ電機   消耗品 25,100 1,859

元帳で勘定毎に元帳(普通預金)、元帳(現金)、元帳(仮払)でシートを分けてあります。
各シートから相手勘定を絞って別のシートへ表示させる方法を教えて頂きたいです。
よろしくお願い致します。

関数、マクロどちらでもあればお願いします。

Aベストアンサー

ん~、こちらにも同じ質問をされていたのですね。
質問の内容は、マクロが必要です。
でも、所詮、シートは3枚ですので
新しく、シートを準備して
年 月 日   摘要   (相手勘定) 借方 貸方   内消費税 種別
という項目を準備して、3枚のシートのデータを張り付ける。
種別の列には
普通預金、現金、仮払 のいずれかを入れていく。
このシートが出来れば、今後は、こちらのシートを使っていく。

>相手勘定を絞って別のシートへ表示
フィルターオプションをマクロ化してプログラムを考える。
これでスッキリするはずです。
シートの構成は、マクロとか勉強する前にしっかりと勉強された方が良いと思います。
こちらを間違うと、今回の質問の様に難しい事になっていきます。

Qエクセルでふたつのシートにある複数の範囲を一枚の紙に印刷したい

助けてください。エクセルでトラブルが生じて別々のシートの範囲を一枚の紙に印刷したいのです。図のリンク貼り付けで作成していたのですが文字化けや妙な空白が表示されてしまいうまくいかなくなりました。印刷の設定で対処したいのですがどうすれば2つのシートにあるA4の内容を一枚のA3に印刷できましょうか。すみませんよろしくご教示おねがいします。

Aベストアンサー

印刷補助用のソフトを使用する方法ですが、

FinePrint5
http://www.nsd.co.jp/share/fineprint/

を使うと簡単です。
ただ、登録しないと一部に「試供版」の文字が出ますので、提出用の文書に使うとまずいかも。

--
あるいは、不要なシート、行、列を[表示]-…-[表示しない]で非表示にして、印刷時に「ブック全体」を印刷するとなんとか。

「カメラ」機能で2枚並べたシートを作るか。

参考URL:http://www.nsd.co.jp/share/fineprint/

Qデータシートから各シートへデータを貼り付けるマクロ

いつもお世話になっております。
現在、データシートから各シートへデータを入力するマクロを作成しようとしています。

ブックの一枚目のシートにデータシートがあり
データシートは以下のようになっています

A   B     C     D     E    F   G
No  社員番号 氏名   所属   日付  数値1 数値2
1 1 123  ○○××  AAA  2016/1  30   20
2 2 123  ○○××  AAA  2016/2  40   15
3 3 123  ○○××  AAA  2016/3  20   90
. .
. .
. .
12 12   123  ○○××  AAA  2016/12  70   50
13 12   345  □□△△  BBB  2016/1   20   60
14 12   345  □□△△  BBB  2016/2   40   10
.
.
.

タイトル行は実際には存在しません
各シートは所属別に分かれていて各所属人数はまちまちです。

データシートを上から順に調べ、各シートの該当社員の該当セルへを貼付したいです。
コピーする範囲は7項目×12月分の全ての部分(最初の人で言えばA1:G12の範囲)
貼り付ける範囲は各シートに社員毎に表があるのでセルとしては社員番号の右上(Offset(該当セル,-1,1)へ貼付)

流れとしては
まず一枚目のB列を上から順に12個飛ばしで取得する(最初はB1)
Offset("B1",0,-1,12,7)の範囲をコピーする
次に4枚目のワークシートから調べていく(2,3枚目は別の必要なデータがあるため)
4枚目のワークシートのB列を調べ、取得した値と一致すればOffset(該当セル,-1,1)の位置に貼付
なければ検索を続け、そのシートに該当する社員番号がなければ次のシートへ
これを最終シートまで繰り返し、また一枚目のワークシートの検索からはじめる

といった処理をしたいと考えています。

自力で考えたものが下のものです

-------------------------------------------
Sub テスト()

Dim results As Variant, i As Long, j As Long, k As Long

With Worksheets(1)
Do Until Cells(i, 2) = ""
Worksheets(1).Range.Offset(Cells(i, 2), 0, -1, 12, 7).Copy
For j = 4 To Worksheets.Count
Sheets(Sheets(j).Name).Select
For k = 1 To 100
If Worksheets(1).Cells(i, 2) = Worksheets(j).Cells(k, 2) Then
Worksheets(j).Active.Range.Offset(Cells(k, 2), -1, 1).PasteSpecial Paste:=xlPasteValues

End If
Next k
Next j

i = i + 12
Loop
End With
End Sub
----------------------------------------------

そもそもこんな単純なものではないとは思っていて、根本的に間違っているかもしれません。
実際に「アプリケーション定義 または オブジェクト定義のエラーです。」
と表示され実行できません。
どこから手をつけていいかわからないため、ご教授いただければと思います。
宜しくお願いいたします。

いつもお世話になっております。
現在、データシートから各シートへデータを入力するマクロを作成しようとしています。

ブックの一枚目のシートにデータシートがあり
データシートは以下のようになっています

A   B     C     D     E    F   G
No  社員番号 氏名   所属   日付  数値1 数値2
1 1 123  ○○××  AAA  2016/1  30   20
2 2 123  ○○××  AAA  2016/2  40   15
3 3 123  ○○××  AAA  2016/3  20   90
. .
....続きを読む

Aベストアンサー

No.1です。
コードがコピペできないのでこちらで確認していないのですが

行うことはNo.1で書いたことと同じです。

使用している変数の値を確認する → 問題の行の直前にMsgBoxで表示させて確認する。
その値が適切なパラメータとなっているか確認する
 →Worksheets(j)なら、Msgbox Worksheets(j).Name でシート名を表示させてみるとか

No.1ではループの最初で問題が起こりましたが、今回が何回かループしてから問題が起こるのかもしれませんね。

# VBEには、ステップ動作とか、ウォッチウィンドウとかデバッグ用の機能も搭載されていますので、確認してみて下さい。

Q別シートのデータを抽出して並べ替えたい

シート1のA列だけに1行飛ばしで名前、住所、電話番号のデータが入っています。ついでに、次の情報との間は2行飛ばしになっています。

   A         B
―|―――――|――――――
1|名前a  |
2|     |
3|住所a  |
4|     |
5|電話番号a|
6|     |
7|     |
8|名前b  |

といった感じです。

このデータを下のように、シート2に綺麗に並べ替えたいのですが…

    A      B         C
―|―――――|―――――|―――――――|
1| 名前a | 住所a | 電話番号a |
2| 名前b | 住所b | 電話番号b |
3| 名前c | 住所c | 電話番号c |
ひとつずつコピペで移そうと考えていたのですが、データが何百件と増えてしまったため困っています。
簡単にできる方法があれば教えてください。
よろしくお願いします。

Aベストアンサー

必ずその規則にしたがってデータが入力されているのであれば、
シート2のA1に
  =INDIRECT("Sheet1!A"&(ROW()*7-6))

B1には =INDIRECT("Sheet1!A"&(ROW()*7-4))

C1には =INDIRECT("Sheet1!A"&(ROW()*7-2))

と入力して下方向にコピーします。


人気Q&Aランキング

おすすめ情報