• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel2003の集計および印刷について)

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

このQ&Aのポイント
  • Excelファイルの集計および印刷方法について、詳しく知りたいです。入力用シートと出力用シートがあり、特定の条件でデータを集計し、表示したいと思っています。データ量が増えた場合にも右半分にデータを表示して印刷したいです。
  • 【Excel2003の集計および印刷方法について】Excelファイルには入力用シートと出力用シートがあります。データを特定の条件で集計し表示する方法を知りたいです。また、データ量が増えた場合にも右半分に表示して印刷する方法も教えてください。
  • Excel2003の集計および印刷方法を教えてください。入力用シートと出力用シートがあり、特定の条件でデータを集計し表示したいです。データ量が増えた場合にも右半分に表示して印刷する方法も知りたいです。

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

  • ベストアンサー
回答No.3

修正点は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さんを参考にさせていただきました。(と言うかそのままですが)

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.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に 1 a1 2 a2 3 a3 4 a4 5 a5 ・・・ 195 a195 196 a196 197 a197 198 a198 199 a199 200 a200 を作る。データは何でも良く、上記データの値に付いて意味は無い。 ーー 別シート(第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行の式を複写すると 1 a1 31 a31 2 a2 32 a32 3 a3 33 a33 ・・・・(略) 27 a27 57 a57 28 a28 58 a58 29 a29 59 a59 30 a30 60 a60 となる。これを手動(またはVBAで)印刷する。 印刷後、G1を2と変えると、瞬時に 31 a31 61 a61 32 a32 62 a62 33 a33 63 a63 ・・・(略) 57 a57 87 a87 58 a58 88 a88 59 a59 89 a89 60 a60 90 a90 となります。 ーー 簡単のため、ここでは2列的に構成するにとどめているが、式を少し変えて、設定列を増やすと3,4、5列的に増やせることは判りますね。 ーー ここでこれを手動(またはVBAで)印刷する。 G1を1増やすー>印刷の操作を、表示されるデータが最終行を越えるまで繰り返す。(1000行なら、1000/60*2ほぼ9回) ーー G1セルの値を、VBAで1ずつ自動でアップして印刷(PrintOut)するのを繰り返すコードに興味があれば書きますが略。

sako77
質問者

お礼

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

回答No.1

こんなのでどうでしょう? 元データを壊さないように作業シートを使います。 必要に応じて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

sako77
質問者

お礼

お礼が遅くなりまして申し訳ありません。 早速のご回答ありがとうございまた。 さっそく試してみましたが、希望通りに表示はされましたがよく見ると集計がされていませんでした。 例えば、 920  5 920  2 1000  6 上記の3行だけのデータの際は、 1000  6 920  7 と表示されるようにしたいのですが、もう一度お願いできないでしょうか?

関連するQ&A