「ブロック機能」のリニューアルについて

貼付画像のようなリストがあります。
リストはあらかじめ新しいものが上にくるようにしてあり、並べ替えの必要はありません。

このリストを元に、出席番号や名前の一部(山田、佐藤等)で特定し、過去5回分の成績表を
作成し、印刷したいと思います。

お尋ねしたいのは、個人特定の入力して印刷する方法と、印刷リスト(出席番号や全部)を
作って印刷を掛ける方法です。
やはり、マクロになりますか?

過去5回分の成績表は、自分でも出来そうですがそれはあくまで一人一人の出席番号や名前を指定して
データを取り出して単にまとめたものになりそうです。

でも、実際には数十人から百人を超えてきますので、一人一人やっている時間がありません。

そこで、印刷するための出席番号やら、名前一覧から印刷する人のリストを作成して、
それを元にデータをピックアップして、表にし、印刷するまでを行いたいのです。

エクセルやマクロに詳しい方、よろしくお願いいたします。

「エクセルでキーリストからデータを取り出し」の質問画像

質問者からの補足コメント

  • うーん・・・

    分かりにくくて申し訳ありません。

    「新しいもの」というのが日付が最近のものという意味なら、ご提示のデータは逆順になっているとしか思えませんけれど・・・?
    これは、サンプルデータの間違いです。
    実際には、最新のデータを上に追加していきます。


    他にも、はっきりしない点がいくつかあるので、以下は考え方のみですが、
    >あくまで一人一人の出席番号や名前を指定して
    >データを取り出して単にまとめたものになりそうです。
    それができるのなら、関数のみでも実現は可能でしょう。
    これは、
    シート①のデータを
    シート②で仮に出席番号をキーにして、個人データを抽出します。
    シート③で個人票(人の目で見やすい表)を作ります。
    ここまでは、自分でもできるのですが、それは一人一人についでのことです。

    難しい、出来そうにないのは、一人一人ではなく、例えば指定した10人とか全員分の印刷ルーチンです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/06/27 12:11
  • 回答のサンプルから考えてみます。

    No.8の回答に寄せられた補足コメントです。 補足日時:2022/06/27 14:35
教えて!goo グレード

A 回答 (11件中1~10件)

'続き



  'テンプレートシートに差し込み印刷
  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
「エクセルでキーリストからデータを取り出し」の回答画像11
    • good
    • 0

こんにちは。



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

’続きます
    • good
    • 0

No8です。



>下記にサンプルが載っていました。
>こういうことをしたいのですよ。
その手のサンプルは沢山転がっています。
(単純番号を変えて、プリントすれば良いだけなので・・)
ここの質問でも、何度も見かけた記憶があります。

まぁ、元のご質問文からこれを妄想するのは難しいと思いますけれど・・
    • good
    • 0

No4です。



>シート③で出来上がった個人票は、グラフや文章などが付きますので、
>一枚の個人票のつもりでいます。
>ですから、その個人票を印刷すると一人分しか印刷できません。

あのね・・・
あくまでも方法を要領として回答しています。
ご質問文には「別々に印刷したい」としか書いてありませんし・・

とは言え、同じことですね。
同じ要領で、一人分抜き出すシートを作成したら、それを100枚コピーして連番を振れば出来上がりです。
手作業でやっても1、2、4・・とコピーすれば100枚あっても7回のコピーでおつりが来ます。

まぁ、違う方法をお求めのようなので、理解していただく必要もないですけれど。
この回答への補足あり
    • good
    • 0
この回答へのお礼

同じようなことで悩んでいる人はいないかなって
検索してみました。
下記にサンプルが載っていました。
こういうことをしたいのですよ。

ttps://excel.syogyoumujou.com/vba/printout_1.html

お礼日時:2022/06/27 14:33

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))),"")
を入力して、必要な範囲にフィルコピーしてあります。

※ 実際には、タイトルや空白行等は別に設定しておく方が、無駄な計算が減るので、賢い方法と言えるでしょう。
「エクセルでキーリストからデータを取り出し」の回答画像7
    • good
    • 0
この回答へのお礼

ありがとうございました。

そういうことではないのです。
補足に書かせて頂いたシート③は、人間に優しい個人票です。
個人毎にデータを寄せ集めたものを一度に印刷処理をするのではありません。

シート③で出来上がった個人票は、グラフや文章などが付きますので、
一枚の個人票のつもりでいます。
ですから、その個人票を印刷すると一人分しか印刷できません。


シート①のデータを
シート②で仮に出席番号をキーにして、個人データを抽出します。
シート③で個人票(人の目で見やすい表)を作ります。

この一連の作業を簡略化するために、例えば出席番号をキーにした、
印刷リストを作成して、100名以上の個人票を印刷したいのです。
この部分が欲しいのです。

お礼日時:2022/06/27 13:42

簡単なものですが、


後は、アレンジください

シートは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
「エクセルでキーリストからデータを取り出し」の回答画像6
    • good
    • 0
この回答へのお礼

ありがとうございました。

他でも書いていますが、成績表作成くらいは普通に関数で私でも抽出できます。

ご相談したいのは、全体数50~150人程度の成績表を印刷するルーチンはどうしたものかということです。

お礼日時:2022/06/27 13:30

[No.4]における書き忘れ、m(_._)m



Sheet2!B4: =IFERROR(INDEX(INDIRECT(B$3),$I4),"")
これを右方6列にズズーッとオートフィル
範囲 C4:H4 の書式は G/標準に設定後、
範囲 B4:H4 を下方に(100行以上?)ズズーッとオートフィルしておけば好い!
    • good
    • 0

添付図参照(Excel 2019)


これが参考になれば仕合せかと。(*^_^*)
「エクセルでキーリストからデータを取り出し」の回答画像4
    • good
    • 0

こんにちは



>元にデータをピックアップして、表にし、印刷するまでを行いたいのです。
要は、5行からなるページを、人数分プリントしたいってことでしょうか?
(何だか枚数がものすごく多くなりそうですけれど・・)

>リストはあらかじめ新しいものが上にくるようにしてあり、
>並べ替えの必要はありません。
「新しいもの」というのが日付が最近のものという意味なら、ご提示のデータは逆順になっているとしか思えませんけれど・・・?

他にも、はっきりしない点がいくつかあるので、以下は考え方のみですが、
>あくまで一人一人の出席番号や名前を指定して
>データを取り出して単にまとめたものになりそうです。
それができるのなら、関数のみでも実現は可能でしょう。

1)出席番号をIDとして利用できるものとして、事前準備として、
 印刷対象外の列にC列をコピペし「重複の削除」を行うことでリストが
 作成できます。
 (別シートに作成しておいても良いです)
2)次に1ページ分の行数の所に改ページを設定しておきます。
  (5+α)行で1セット(=1ページ)になるものと推測)
 いちいち改ページをセットしなくても、行数で改ページが決まるので、
 印刷設定の余白等で同様になるようにしておいても良いです。
 こちらの方が簡単そうですね。
3)ページの始めの行になるところへ、
 1)のリストを順に参照する関数式を設定しておきます。
  (行数を計算する方法をご存じなら、簡単と思います)
  (これも印刷範囲外のセルに設定しておけば印刷はされません)

以上で、準備は完了。
4)1ページ分の表を埋める関数式を作成します。
 3)のセルを参照して、その人の最近5回分の結果を表示する式を
 作成すれば良いでしょう。
 (これは「できる」とご質問文に書いてありましたので、
  方法等については省略します)
5)4)をシート全体に必要な範囲までフィルコピー
 (オートフィル機能を利用すれば、複数行のセットを繰り返し
  フィルできます)

以上で、1シート内に一人分ずつで改ページされるデータが表示されますので、そのシートを印刷すれば終了です。
(関数式の作成に手間取らなければ、10~15分ほどの作業でできそうです。
 この回答を書く方が時間がかかっているかも・・(笑))


※ もちろんマクロでも可能ですが、質問者様は作成できないご様子ですので省略しておきす。
  考え方は上記同様で、最初に必要なリストを作成して、あとはその順に処理を行えばよいだけですね。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。

補足を入れました。
印刷したいのは、人間の目で見やすい個人毎の個人票です。
それを印刷する仕組みの部分です。

お礼日時:2022/06/27 12:14

直接の回答にはなりません。


これはAccessの案件でしょう。
Accessを研究してみて下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2022/06/27 12:13

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

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング