貼付画像のようなリストがあります。
リストはあらかじめ新しいものが上にくるようにしてあり、並べ替えの必要はありません。
このリストを元に、出席番号や名前の一部(山田、佐藤等)で特定し、過去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を探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つのマクロでチェックボックス...
-
Excel・Word リサーチ機能を無...
-
Excel マクロ VBA プロシー...
-
一つのTeratermのマクロで複数...
-
特定文字のある行の前に空白行...
-
特定のPCだけ動作しないVBAマク...
-
メッセージボックスのOKボタ...
-
VBAでカタカナ→ローマ字の変換...
-
エクセルで別のセルにあるふり...
-
エクセルに張り付けた写真のフ...
-
Excelでボタン(フォームコント...
-
TERA TERMを隠す方法
-
エクセルで特定の列が0表示の場...
-
マクロ実行時、ユーザーフォー...
-
VC++ 2008 EXPRESS "_T"識別子...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ExcelVBA 図形をクリックした...
-
EXCELのVBAでRange("A1:C4")を...
-
Excelのマクロについて教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
他人が作ったマクロの理解
-
ExcelVBAでPDFを閉じるソース
-
TERA TERMを隠す方法
-
エクセルで別のセルにあるふり...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
EXCELのVBAでRange("A1:C4")を...
-
TeraTermマクロの文字列結合
-
PDF出力マクロについて。マクロ...
-
#defineの定数を文字列として読...
-
エクセルのマクロをセルの値に...
-
wordを起動した際に特定のペー...
おすすめ情報
分かりにくくて申し訳ありません。
>
「新しいもの」というのが日付が最近のものという意味なら、ご提示のデータは逆順になっているとしか思えませんけれど・・・?
これは、サンプルデータの間違いです。
実際には、最新のデータを上に追加していきます。
>
他にも、はっきりしない点がいくつかあるので、以下は考え方のみですが、
>あくまで一人一人の出席番号や名前を指定して
>データを取り出して単にまとめたものになりそうです。
それができるのなら、関数のみでも実現は可能でしょう。
これは、
シート①のデータを
シート②で仮に出席番号をキーにして、個人データを抽出します。
シート③で個人票(人の目で見やすい表)を作ります。
ここまでは、自分でもできるのですが、それは一人一人についでのことです。
難しい、出来そうにないのは、一人一人ではなく、例えば指定した10人とか全員分の印刷ルーチンです。
回答のサンプルから考えてみます。