こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel2003の集計および印刷について

いつもお世話になっております。
新年早々ですが、今回はExcelについて質問させてもらいます。

現在、とあるデータの集計を行い、印刷を行う方法を考えていますが、あまり詳しくないので困っています。
何かいい方法があればと思い投稿しました。

まずExcelファイルに「入力用シート」と「出力用シート」の二つのシートがあります。
「入力用シート」には、
C1セル、D1セル、E1セル、F1セル
C2セル、E2セル、F2セル
に表題や番号などを入力します。

また、下記のようにA1セルとB1セルから下へずっとデータを入力します。データ量は多いときは1000行ぐらいです。
例)
1000   5
1200   2
900    10
800    2
1000   1
2400   3
あとフォームのボタンを作りこれを押すと、「出力用シート」にC1,D1,…F2までのセルをそのままコピーし、A1、B1から下へ入力されているデータのみを集計し表示を行いたいと思ってます。
集計の条件はA列ごとに集計し降順で表示です。

結果として「出力用シート」には
以下のように表示したいと思ってます。

あいうえお かきくけこ 111111 222222
さしすせそ       333333 444444

2400   3
1200   2
1000   6
900   10
800    2

ですが、A列とB列に入力するデータが多くなった際、印刷すると右半分が白紙の状態で、できれば右半分にもと思ってます。つまり1枚に2ページ分印刷と言うことです。
データは1枚に30行ぐらいで左半分と右半分で60件ぐらい表示。
(文字を大きく表示させるため)
それ以上になると2枚目に1枚目と同じように1行目2行目は1枚目と同じで印刷できればと。

例)
-----1枚目-----

あいうえお かきくけこ 111111 222222
さしすせそ       333333 444444

2400    3    440    2     
1200    2    430    22
1000    6    415    9
900    10    409    2
800     2    399    8
500     1    395    5
450     3    393    2

-----2枚目-----

あいうえお かきくけこ 111111 222222
さしすせそ       333333 444444

391    1    
320    2
311    22

説明が長くなりましたが、何卒よろしくお願いします。

投稿日時 - 2008-01-01 01:05:10

QNo.3641818

困ってます

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

修正点は2点です。
並べ替え後の、

ws.Columns("A:B").Sort Key1:=ws.Range("A1"), Order1:=xlDescending 'sort
ds.Cells.Clear '印刷シートクリア

の間に、

'集計
ws.Cells(1, 3).Formula = "=IF(COUNTIF($A$1:A1,A1)=1,ROW(),"""")"
ws.Cells(1, 3).Copy Destination:=ws.Range(ws.Cells(2, 3), ws.Cells(rowCount, 3))
ws.Cells(1, 4).Formula = "=IF(ROW(D1)>COUNT(C:C),"""",INDEX(A:A,SMALL(C:C,ROW(A1))))"
ws.Cells(1, 5).Formula = "=IF(D1="""","""",SUMIF(A:A,D1,B:B))"
rowCount = WorksheetFunction.Count(ws.Columns(3))
ws.Range(ws.Cells(1, 3), ws.Cells(1, 5)).Copy Destination:=ws.Range(ws.Cells(2, 3), ws.Cells(rowCount, 5))

を入れてください。
データ部へコピーする部分の

ds.Cells(row + rowOffset, col * 2 - 1) = ws.Cells(srcRow, 1)
ds.Cells(row + rowOffset, col * 2) = ws.Cells(srcRow, 2)



ds.Cells(row + rowOffset, col * 2 - 1) = ws.Cells(srcRow, 4)
ds.Cells(row + rowOffset, col * 2) = ws.Cells(srcRow, 5)

に変更してください。

ワークシート(sheet2)を見てもらえればわかりますが、並べ替え後のデータを集計して、その結果を印刷シートにコピーしてます。
集計は、
http://oshiete1.goo.ne.jp/qa3380455.html
の、ANo.1さんを参考にさせていただきました。(と言うかそのままですが)

投稿日時 - 2008-01-06 04:47:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

質問がごたごたしていてわかりにくい。
課題は2つあるようで
(1)集計
(2)印刷
ーー
(2)は1列的(A,B列)なデータを、2列的に印刷したいということのようです。印刷で使う紙を節約したり、1ページに出るデータの一覧データ数を少しでも多くできるように、そうしたいのはわかります。
ーー
(1)の集計はどの項目をどういうまとめで集計するのか。
>集計の条件はA列ごとに集計し
とは、1000行なりのデータのB列の1-1000行の合計を結果1つを最終に出せばよいのか?。
質問の意味を捉えられず、(1)集計については以下説明で回答できてない。
ーーー
私はこういう課題はVBAでやるべきというのが持論だが、質問者はVBAの経験が無いのではないかと思う。
それで数式・関数で下記を工夫した。モデル的にやってみて私の方法の主旨をじっくりフォローして理解してください。
ーー
具体的に(2)印刷は、
別シートに入力データをシートコピーし
別シートA,B列を、A列で降順にソートする。

モデル的データとして
A1:B200に
1a1
2a2
3a3
4a4
5a5
・・・
195a195
196a196
197a197
198a198
199a199
200a200
を作る。データは何でも良く、上記データの値に付いて意味は無い。
ーー
別シート(第3のシート、印刷シート)の
(どこでも良いが)G1セルにまず1と入れる。
いわばページ番号数を表している数といえるものである。
1ページ行数、はテスト例なので少なめに30行と設定した。
ーー
A1の式 =INDIRECT("Sheet1!A"&($G$1-1)*30+ROW())
B1の式 =INDIRECT("Sheet1!B"&($G$1-1)*30+ROW())
D1の式 =INDIRECT("Sheet1!A"&($G$1-1)*30+ROW()+30)
E1の式 =INDIRECT("Sheet1!B"&($G$1-1)*30+ROW()+30)
を入れる。
式中の30は1ページ30行を印刷する設定だからで、60行なら60に変える。
第30行まで、各列の第1行の式を複写すると
1a131a31
2a232a32
3a333a33
・・・・(略)
27a2757a57
28a2858a58
29a2959a59
30a3060a60
となる。これを手動(またはVBAで)印刷する。
印刷後、G1を2と変えると、瞬時に
31a3161a61
32a3262a62
33a3363a63
・・・(略)
57a5787a87
58a5888a88
59a5989a89
60a6090a90
となります。
ーー
簡単のため、ここでは2列的に構成するにとどめているが、式を少し変えて、設定列を増やすと3,4、5列的に増やせることは判りますね。
ーー
ここでこれを手動(またはVBAで)印刷する。
G1を1増やすー>印刷の操作を、表示されるデータが最終行を越えるまで繰り返す。(1000行なら、1000/60*2ほぼ9回)
ーー
G1セルの値を、VBAで1ずつ自動でアップして印刷(PrintOut)するのを繰り返すコードに興味があれば書きますが略。

投稿日時 - 2008-01-01 11:05:00

お礼

お礼が遅くなりまして申し訳ありません。
早速のご回答ありがとうございまた。
VBAについてはまだよくわかりませんが、いつか使えるようにがんばりたいと思います。
その時はまたお世話になるかもしれませんがよろしくお願いします。

投稿日時 - 2008-01-05 21:42:56

こんなのでどうでしょう?
元データを壊さないように作業シートを使います。
必要に応じてss,ds,wsのシートの指定を変えてください。
印刷シートのデータ行数をpageRowCountで調整してください。
pageColCountでページあたりの横数が変更できます。

Private Sub CommandButton1_Click()
Const pageRowCount = 50 '1ページあたりのデータ行数
Const pageColCount = 2 '1ページあたりのデータ列数

Dim ss As Worksheet '元データシート
Dim ds As Worksheet '印刷シート
Dim ws As Worksheet '作業シート
Dim rowCount As Long '元データの行数
Dim startRow As Long '印刷ページ毎の印刷する元データの最初の行
Dim srcRow As Long '印刷時の元データの行
Dim row As Integer '印刷データのデータ部の行
Dim col As Integer '印刷データのデータ部の列
Dim rowOffset As Long

Set ss = Sheets("Sheet1") '元データシートの指定
Set ds = Sheets("Sheet2") '印刷シートの指定
Set ws = Sheets("Sheet3") '作業シートの指定
rowCount = ss.Cells(ss.Rows.Count, 1).End(xlUp).row'元データの行数取得

ws.Cells.Clear '作業シートクリア
ss.Columns("A:B").Copy Destination:=ws.Range("A1") 'データを作業シートへ
ws.Columns("A:B").Sort Key1:=ws.Range("A1"), Order1:=xlDescending 'sort
ds.Cells.Clear '印刷シートクリア
'印刷シート作成
For startRow = 1 To rowCount Step pageRowCount * pageColCount

'ヘッダー部
ss.Range("C1:F2").Copy Destination:=ds.Cells(rowOffset + 1, 1) 'ヘッダーデータ
'他にも見出しなんかがある場合
ds.Cells(rowOffset + 4, 1) = "番号"
ds.Cells(rowOffset + 4, 2) = "データ"
ds.Cells(rowOffset + 4, 3) = "番号"
ds.Cells(rowOffset + 4, 4) = "データ"
rowOffset = rowOffset + 4 'ヘッダー部の行数だけプラス

'データ部
srcRow = startRow
Do
For col = 1 To pageColCount
For row = 1 To pageRowCount
If srcRow > rowCount Then Exit Do '元データ終わりチェック
ds.Cells(row + rowOffset, col * 2 - 1) = ws.Cells(srcRow, 1)
ds.Cells(row + rowOffset, col * 2) = ws.Cells(srcRow, 2)
srcRow = srcRow + 1
Next
Next
Loop Until True
rowOffset = rowOffset + pageRowCount

'フッター部
'必要があれば
ds.Cells(rowOffset + 1, 1) = "何かフッター"'いらなければ削除
rowOffset = rowOffset + 1 'フッター部の行数だけプラス(無ければ+0)

Next
End Sub

投稿日時 - 2008-01-01 08:46:33

お礼

お礼が遅くなりまして申し訳ありません。

早速のご回答ありがとうございまた。
さっそく試してみましたが、希望通りに表示はされましたがよく見ると集計がされていませんでした。
例えば、
920  5
920  2
1000  6

上記の3行だけのデータの際は、
1000  6
920  7
と表示されるようにしたいのですが、もう一度お願いできないでしょうか?

投稿日時 - 2008-01-05 21:06:14

あなたにオススメの質問