
貼付画像のようなリストがあります。
リストはあらかじめ新しいものが上にくるようにしてあり、並べ替えの必要はありません。
このリストを元に、出席番号や名前の一部(山田、佐藤等)で特定し、過去5回分の成績表を
作成し、印刷したいと思います。
お尋ねしたいのは、個人特定の入力して印刷する方法と、印刷リスト(出席番号や全部)を
作って印刷を掛ける方法です。
やはり、マクロになりますか?
過去5回分の成績表は、自分でも出来そうですがそれはあくまで一人一人の出席番号や名前を指定して
データを取り出して単にまとめたものになりそうです。
でも、実際には数十人から百人を超えてきますので、一人一人やっている時間がありません。
そこで、印刷するための出席番号やら、名前一覧から印刷する人のリストを作成して、
それを元にデータをピックアップして、表にし、印刷するまでを行いたいのです。
エクセルやマクロに詳しい方、よろしくお願いいたします。

A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
'続き
'テンプレートシートに差し込み印刷
Dim i As Long
i = 6 ' i はデータ書き込み行番号で6行目から
Do While Not rs.EOF
With ThisWorkbook.Worksheets(SHEET_NAME_TEMPLATE)
.Cells(3, "B").Value = rs.Fields("出席番号").Value
.Cells(3, "D").Value = rs.Fields("氏名").Value
.Cells(i, "A").Value = rs.Fields("日付").Value
.Cells(i, "B").Value = rs.Fields("英語").Value
.Cells(i, "C").Value = rs.Fields("数学").Value
.Cells(i, "D").Value = rs.Fields("理科").Value
.Cells(i, "E").Value = rs.Fields("国語").Value
.Cells(i, "F").Value = rs.Fields("社会").Value
With .Cells(i, "G") '合計欄(テンプレートに最初から埋め込むも可)
.FormulaR1C1 = "=SUM(RC[-5]:RC[-1])"
.NumberFormatLocal = "0;;"
End With
.Cells(i, "H").Value = rs.Fields("コメント").Value
End With
i = i + 1 '次の行番号のためインクリメント
rs.MoveNext
Loop
'印刷処理ほか
With ThisWorkbook.Worksheets(SHEET_NAME_TEMPLATE)
'(↓コメント解除)
.PrintOut
' 次に備えて上記差し込みデータの消去
.Range("B3,D3,A6:H10").ClearContents
End With
Finally_:
On Error Resume Next
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub

No.10
- 回答日時:
こんにちは。
Excel で差込印刷は需要はあるかも、、ですね。
シンプルな書き方もありますが、ある程度汎用性のあるサンプル書いてみました。拙いですが。
SQL でデータ抽出の仕様にしてます。
長いので2回にわけます。
シート名やセルの構成は添付図を参照して下さい。画像荒いかもです。
#解像度どのぐらいのサイズでアップするのが良いのだろ?
サンプルなので main プロシージャは適当に変更して下さいね。
Sub main()
' 必要なだけループで引数に出席番号を渡す
' サンプルなので出席番号10 の結果だけ
Call PrintoutPersonalData(1000)
End Sub
Private Sub PrintoutPersonalData(ByVal personal_id As Long)
'設定:ワークシート名
Const SHEET_NAME_TEMPLATE = "印刷テンプレート"
Const SHEET_NAME_DATSORCE = "試験結果リスト"
'ADO Connection 接続文字列 Excel2007以降版
Const ADO_CON_STR As String = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Extended Properties=Excel 12.0;" _
& "Data Source='$_source_filename_$';"
'SQL(出席番号のデータを最新5件)
Dim sql As String
sql = ""
sql = sql & "SELECT TOP 5 *"
sql = sql & " FROM [" & SHEET_NAME_DATSORCE & "$]"
sql = sql & " WHERE [出席番号] = " & personal_id
sql = sql & " ORDER BY [日付] DESC;"
'ワークシートにADOで接続してデータ抽出
Dim connection_string As String
connection_string = Replace$(ADO_CON_STR, _
"$_source_filename_$", _
ThisWorkbook.FullName)
Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
cn.CursorLocation = 3 '3:adUseClient
cn.ConnectionString = connection_string
cn.Open
Dim rs As Object: Set rs = cn.Execute(sql)
'0件例外処理
If rs.EOF And rs.BOF Then
MsgBox "出席番号" & CStr(personal_id) & "レコードなし"
GoTo Finally_
End If
’続きます
No.9
- 回答日時:
No8です。
>下記にサンプルが載っていました。
>こういうことをしたいのですよ。
その手のサンプルは沢山転がっています。
(単純番号を変えて、プリントすれば良いだけなので・・)
ここの質問でも、何度も見かけた記憶があります。
まぁ、元のご質問文からこれを妄想するのは難しいと思いますけれど・・
No.8
- 回答日時:
No4です。
>シート③で出来上がった個人票は、グラフや文章などが付きますので、
>一枚の個人票のつもりでいます。
>ですから、その個人票を印刷すると一人分しか印刷できません。
あのね・・・
あくまでも方法を要領として回答しています。
ご質問文には「別々に印刷したい」としか書いてありませんし・・
とは言え、同じことですね。
同じ要領で、一人分抜き出すシートを作成したら、それを100枚コピーして連番を振れば出来上がりです。
手作業でやっても1、2、4・・とコピーすれば100枚あっても7回のコピーでおつりが来ます。
まぁ、違う方法をお求めのようなので、理解していただく必要もないですけれど。
同じようなことで悩んでいる人はいないかなって
検索してみました。
下記にサンプルが載っていました。
こういうことをしたいのですよ。
ttps://excel.syogyoumujou.com/vba/printout_1.html
No.7
- 回答日時:
No3です。
>難しい、出来そうにないのは、一人一人ではなく、
>例えば指定した10人とか全員分の印刷ルーチンです。
その方法を回答したつもりですけれど・・・?
文章を読む気や、理解するおつもりがないのなら、間接的な(=文章等での)回答では所詮無理だと思います。
関数でも可能という例として、添付図にミニチュア版を作成してみました。
・A:E列を元データとします。
・H列に1)の方法でリストを作成します。(これだけは手操作です)
・J:N列を印刷用の部分と仮定します。
わかりやすいように空白行を1行空けるようにし、直近の3回分の日付の
データをピックアップするようにしてあります。
・A列の日付はシリアル値と仮定しています。
このJ:N列の範囲を5行ごとに改ページするように印刷設定すれば、ご質問のようになると思いますけれど・・・?
なんか、勘違いしていますか?
※ 添付図では、No3で述べた3)のセルは省略して、式に入れ込んであります。
また、タイトルや空白行も含めて、全部を同じ式で対応するようにしてしまったので、少々長い式になってしまいましたけれど、J1セルに
=IFERROR(IF(MOD(ROW(A1),5)=1,INDEX($A$1:$E$1,COLUMN(A1)),INDEX($A$1:$E$999,MOD(AGGREGATE(14,6,(INT($A$1:$A$999)+ROW(A$1:A$999)/1000)/($B$1:$B$999=INDEX($H:$H,INT(ROW(A10)/5))),CHOOSE(MOD(ROW(A5),5),1,2,3)),1)*1000,COLUMN(A1))),"")
を入力して、必要な範囲にフィルコピーしてあります。
※ 実際には、タイトルや空白行等は別に設定しておく方が、無駄な計算が減るので、賢い方法と言えるでしょう。

ありがとうございました。
そういうことではないのです。
補足に書かせて頂いたシート③は、人間に優しい個人票です。
個人毎にデータを寄せ集めたものを一度に印刷処理をするのではありません。
シート③で出来上がった個人票は、グラフや文章などが付きますので、
一枚の個人票のつもりでいます。
ですから、その個人票を印刷すると一人分しか印刷できません。
>
シート①のデータを
シート②で仮に出席番号をキーにして、個人データを抽出します。
シート③で個人票(人の目で見やすい表)を作ります。
この一連の作業を簡略化するために、例えば出席番号をキーにした、
印刷リストを作成して、100名以上の個人票を印刷したいのです。
この部分が欲しいのです。
No.6
- 回答日時:
簡単なものですが、
後は、アレンジください
シートは4つ
シート「設定」
シート「データ」から抽出条件の設定
セル「A4」開始日 対象日付の開始日
セル「B4」終了日 対象日付の終了日
セル「C4」出席番号
シート「名簿」からのリスト選択
名簿追加時は、データの入力規則を変更必要
コマンドボタンで、VBA処理
シート「成績表」
シート「データ」から抽出した内容
シート「データ」
シート「名簿」
出席番号、氏名
シート「設定」のVBA
Private Sub CommandButton1_Click()
成績表抽出
End Sub
標準モジュール
Dim 設定 As Worksheet
Dim 成績表 As Worksheet
Dim データ As Worksheet
Dim 名簿 As Worksheet
Dim 件数 As Integer
Dim 行数 As Integer
Dim 格納件数 As Long
Dim 開始日
Dim 終了日
Dim 出席番号 As Integer
Dim 範囲 As String
Dim i As Long
Sub 成績表抽出()
'
準備処理
'
抽出処理
End Sub
Function 準備処理()
Set 設定 = Worksheets("設定")
Set 成績表 = Worksheets("成績表")
Set データ = Worksheets("データ")
Set 名簿 = Worksheets("名簿")
開始日 = 設定.Range("A4").Value
終了日 = 設定.Range("B4").Value
出席番号 = 設定.Range("C4").Value
'
成績表.Select
件数 = 成績表.Cells(2, 2).CurrentRegion.Rows.Count + 2
範囲 = "B3:J" & LTrim(Str(件数))
Range(範囲).Select
Selection.ClearContents
'
格納件数 = データ.Cells(2, 2).CurrentRegion.Rows.Count + 2
End Function
'
Function 抽出処理()
行数 = 3
For i = 3 To 格納件数
Select Case データ.Cells(i, 3).Value '出席番号
Case 出席番号
Select Case データ.Cells(i, 2).Value '日付
Case 開始日 To 終了日
成績表.Cells(行数, 2).Value = データ.Cells(i, 2).Value '日付
成績表.Cells(行数, 3).Value = データ.Cells(i, 3).Value '出席番号
成績表.Cells(行数, 4).Value = データ.Cells(i, 4).Value '氏名
成績表.Cells(行数, 5).Value = データ.Cells(i, 5).Value '英語
成績表.Cells(行数, 6).Value = データ.Cells(i, 6).Value '数学
成績表.Cells(行数, 7).Value = データ.Cells(i, 7).Value '理科
成績表.Cells(行数, 8).Value = データ.Cells(i, 8).Value '国語
成績表.Cells(行数, 9).Value = データ.Cells(i, 9).Value '社会
成績表.Cells(行数, 10).Value = データ.Cells(i, 10).Value 'コメント
行数 = 行数 + 1
End Select
End Select
Next i
End Function

ありがとうございました。
他でも書いていますが、成績表作成くらいは普通に関数で私でも抽出できます。
ご相談したいのは、全体数50~150人程度の成績表を印刷するルーチンはどうしたものかということです。
No.5
- 回答日時:
[No.4]における書き忘れ、m(_._)m
Sheet2!B4: =IFERROR(INDEX(INDIRECT(B$3),$I4),"")
これを右方6列にズズーッとオートフィル
範囲 C4:H4 の書式は G/標準に設定後、
範囲 B4:H4 を下方に(100行以上?)ズズーッとオートフィルしておけば好い!
No.3
- 回答日時:
こんにちは
>元にデータをピックアップして、表にし、印刷するまでを行いたいのです。
要は、5行からなるページを、人数分プリントしたいってことでしょうか?
(何だか枚数がものすごく多くなりそうですけれど・・)
>リストはあらかじめ新しいものが上にくるようにしてあり、
>並べ替えの必要はありません。
「新しいもの」というのが日付が最近のものという意味なら、ご提示のデータは逆順になっているとしか思えませんけれど・・・?
他にも、はっきりしない点がいくつかあるので、以下は考え方のみですが、
>あくまで一人一人の出席番号や名前を指定して
>データを取り出して単にまとめたものになりそうです。
それができるのなら、関数のみでも実現は可能でしょう。
1)出席番号をIDとして利用できるものとして、事前準備として、
印刷対象外の列にC列をコピペし「重複の削除」を行うことでリストが
作成できます。
(別シートに作成しておいても良いです)
2)次に1ページ分の行数の所に改ページを設定しておきます。
(5+α)行で1セット(=1ページ)になるものと推測)
いちいち改ページをセットしなくても、行数で改ページが決まるので、
印刷設定の余白等で同様になるようにしておいても良いです。
こちらの方が簡単そうですね。
3)ページの始めの行になるところへ、
1)のリストを順に参照する関数式を設定しておきます。
(行数を計算する方法をご存じなら、簡単と思います)
(これも印刷範囲外のセルに設定しておけば印刷はされません)
以上で、準備は完了。
4)1ページ分の表を埋める関数式を作成します。
3)のセルを参照して、その人の最近5回分の結果を表示する式を
作成すれば良いでしょう。
(これは「できる」とご質問文に書いてありましたので、
方法等については省略します)
5)4)をシート全体に必要な範囲までフィルコピー
(オートフィル機能を利用すれば、複数行のセットを繰り返し
フィルできます)
以上で、1シート内に一人分ずつで改ページされるデータが表示されますので、そのシートを印刷すれば終了です。
(関数式の作成に手間取らなければ、10~15分ほどの作業でできそうです。
この回答を書く方が時間がかかっているかも・・(笑))
※ もちろんマクロでも可能ですが、質問者様は作成できないご様子ですので省略しておきす。
考え方は上記同様で、最初に必要なリストを作成して、あとはその順に処理を行えばよいだけですね。
ありがとうございました。
補足を入れました。
印刷したいのは、人間の目で見やすい個人毎の個人票です。
それを印刷する仕組みの部分です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロで複数シートを両面印刷するには? 2 2022/12/08 23:23
- その他(音楽・ダンス・舞台芸能) チケットに座席番号のみを印刷する方法 4 2023/02/10 11:21
- 会計ソフト・業務用ソフト 一太郎で封筒の宛名印刷したいです。 1 2023/07/20 10:14
- 年賀状作成・はがき作成 エクセルで作った住所録をワードの差し込み印刷ではがきに印刷したい 3 2022/09/26 15:47
- Visual Basic(VBA) VBAで不特定枚数印刷をしたいです。 4 2022/08/02 07:30
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Excel(エクセル) エクセルの罫線が印刷できない 4 2023/02/04 10:48
- 会計ソフト・業務用ソフト タックインデックスシール 2 2023/04/28 05:14
- 年賀状作成・はがき作成 Wordによる宛名印刷 2 2023/01/04 15:36
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
メッセージボックスのOKボタ...
-
ExcelVBAでPDFを閉じるソース
-
TERA TERMを隠す方法
-
Excel マクロ VBA プロシー...
-
Excel_マクロ_現在開いているシ...
-
エクセルに張り付けた写真のフ...
-
Excel・Word リサーチ機能を無...
-
IF関数を使ってマクロを実行さ...
-
VBA 登録ボタンを省略してエン...
-
EXCEL VBAでApplication.waitを...
-
wordを起動した際に特定のペー...
-
ダブルクリックで貼り付けた画...
-
一つのTeratermのマクロで複数...
-
エクセルのマクロをセルの値に...
-
一定時間経過したExcelの...
-
特定文字のある行の前に空白行...
-
組んだマクロをメールで送る
-
システムコールとOSマクロ
-
ExcelのVBAを使ってタイトル行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
一つのTeratermのマクロで複数...
-
Excel_マクロ_現在開いているシ...
-
メッセージボックスのOKボタ...
-
Excel マクロ VBA プロシー...
-
Excel マクロでShearePoint先の...
-
エクセルに張り付けた写真のフ...
-
ExcelのVBA。public変数の値が...
-
エクセルで別のセルにあるふり...
-
TERA TERMを隠す方法
-
ExcelVBAでPDFを閉じるソース
-
エクセルで縦に並んだデータを...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
ダブルクリックで貼り付けた画...
-
【EXCEL VBA】オートシェイプを...
-
マクロで空白セルを詰めて別シ...
-
wordを起動した際に特定のペー...
おすすめ情報
分かりにくくて申し訳ありません。
>
「新しいもの」というのが日付が最近のものという意味なら、ご提示のデータは逆順になっているとしか思えませんけれど・・・?
これは、サンプルデータの間違いです。
実際には、最新のデータを上に追加していきます。
>
他にも、はっきりしない点がいくつかあるので、以下は考え方のみですが、
>あくまで一人一人の出席番号や名前を指定して
>データを取り出して単にまとめたものになりそうです。
それができるのなら、関数のみでも実現は可能でしょう。
これは、
シート①のデータを
シート②で仮に出席番号をキーにして、個人データを抽出します。
シート③で個人票(人の目で見やすい表)を作ります。
ここまでは、自分でもできるのですが、それは一人一人についでのことです。
難しい、出来そうにないのは、一人一人ではなく、例えば指定した10人とか全員分の印刷ルーチンです。
回答のサンプルから考えてみます。