お願いします。シートは2枚。Database とReportです。reportにvlookup関数を使って生徒一人一人の成績を出し、順番に356人分を印刷したいのですが、ループ関数を使っても同じ人間のデータが
ループ指定の枚数で出てきてしまします。以下、記述式を書きます。データはDatabaseシートに入っており、一列目出席番号、二列目氏名、3、4、5列目は英数国という科目の得点になっています。
それをReportシートでVLOOKUP関数で呼び出して印刷するには、どう書き換えたらよいのでしょうか?お忙しいとは思いますが、ご教示くださいませ。
以下記述
'---------- ここから ----------
'■■■個人票印刷マクロ■■■
Sub 個人票印刷()
'変数の宣言
Dim i As Integer
Dim MySheetName As String
'確認メッセージの表示 (キャンセルの場合マクロを抜ける)
If MsgBox("個人票の印刷をはじめます。" & Chr(13) & Chr(13) _
& "プリンタの準備はよろしいですか?", vbOKCancel) = vbCancel Then
Exit Sub
End If
'アクティブシートのシート名取得
MySheetName = ActiveSheet.Name
'画面表示更新の停止
Application.ScreenUpdating = False
'印刷用シートの選択
Sheets("Report").Select '【1】
'印刷ループ開始
For i = 1 To 40 '【2】
'出席番号の代入
Range("A1").Value = i '【3】
'印刷
ActiveSheet.PrintOut
Next i
'元のシートに戻る
Sheets(MySheetName).Select
'画面表示更新の許可
Application.ScreenUpdating = True
'確認メッセージの表示
MsgBox "個人票の印刷が終わりました。"
End Sub
'---------- ここまで ----------
初心者なので、ころがっているものをコピペしてみたのですが。
No.2ベストアンサー
- 回答日時:
VlookUp の場合ですが、私は、以下のように書き換えればよいかと思いますが……VlookUpは、古くからある関数ですが、オブジェクト範囲を引数にして抱え込んでいますので、その分、重く、エラーも排出します。
VlookUpそのものの範囲さえ分かりすさえすれば、そのまま、数式さえも、VBAで置き換えることは可能です。On Errror Resume Next 'エラーを無視する
For i = 1 To Lastrow 'ここは、1からという意味で、数が定数なら、Lastrow よりも、To 356 のほうがよいでしょう。
.Range("A1").Value = i '//**変更**
.PrintOut
'.PrintPreview True 'プレビューになります。
DoEvents 'Esc で離脱可能にする
'' Sleep 300 '余裕を300ミリ秒を取る //これは辞めたほうがよいかも
Next i
On Errror Goto 0
No.1
- 回答日時:
こんにちは。
私は素人なのですが、私なりにアレンジしてみました。
なるべく、標準モジュールでお使いください。
VLookUp関数は使いません。添付画像のようになることを確認してください。
このマクロは、印刷最中にトラブルがあった時に、ESCキーで止められるように工夫されています。
[ Sleep 300 '余裕を300ミリ秒を取る] と書かれていますが、100でも構わないと思いますし、なくても問題がありません。物理的な印刷のほうが先走ってしまわないようにするためです。
トラブルが解消されたら、
For i = 2 To Lastrow のi=2 の数字を書き換えてから続けてください。また、一度、試しをしてみてください。
For i = 2 To Lastrow のLastrow を、例えば 10とか数字にしてみるとかすれば、紙の消費も少なく試せます。
ただし、順不同で、あくまでも、VLookUp関数のようにされたい場合は、またご相談ください。VLookUp関数は、PC、メモリ、ワークシートの関数の数の関係で、反応が遅い時がありますので、なるべく、こうした関数(揮発性関数)を避けるのが一般的だと言われます。VBAでは、その代わりの方法があります。
.Range("A2").Resize(, 5).Value
また、印刷部分は、現在 A1~E2というような想定になっていますが、実際は、違うものだと思います。左端のセルを起点として、右方向5列を出力するようになっていますから、適当に変えてください。
なお、「ころがっているものをコピペしてみたのですが。」VBAコードは、Microsoft 社によると、その著作権を主張できないということを発表していますが、なるべく、そのコードを書いた人への敬意や心遣いを払ってくださるようにお願いいたします。
'//要調整//
'---------------------------
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub 個人票印刷Rev()
Dim i As Long
Dim Lastrow As Long
Dim DbSh As Worksheet
Dim RepoSh As Worksheet
Dim AcSh As Worksheet
'****************
'エラーが出たら、カッコ内のシート名を確認してください。
Set DbSh = Worksheets("Database")
Set RepoSh = Worksheets("Report")
'****************
If MsgBox("個人票の印刷をはじめます。" & vbNewLine _
& "プリンタの準備はよろしいですか", vbQuestion + vbOKCancel) = vbCancel Then
Exit Sub
End If
If RepoSh.PageSetup.PrintArea = "" Then
MsgBox "印刷範囲が設定されていません。", vbExclamation
Exit Sub
End If
'印刷用シートの選択
With RepoSh
.Select
Lastrow = DbSh.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
'データベースシート 2行目から
For i = 2 To Lastrow
'A1の一行目には、出席番号・氏名等が入っているとする
'印刷部分は、A1~E2になっています。
.Range("A2").Resize(, 5).Value = _
DbSh.Cells(i, 1).Resize(, 5).Value
'印刷
.PrintOut
'.PrintPreview True 'プレビューになります。
DoEvents 'Esc で離脱可能にする
Sleep 300 '余裕を300ミリ秒を取る
Next i
End With
'画面表示更新の許可
Application.ScreenUpdating = True
'確認メッセージの表示
MsgBox "個人票の印刷が終わりました。", vbInformation
End Sub
'---------------------------
ありがとうございます。早速やってみます。できましたら、正解なども一緒に印刷する為に、vlookupでの処理の仕方を教えて下さいませんでしょうか。それと、vba 作成者へのリスペクトは今後、気をつけていきます。ご指摘ありがとうございました。重ねて御礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Excel(エクセル) エクセルの印刷マクロについて質問があります。 現在、下記のマクロで印刷しています。Sheet1のD6 5 2023/06/12 10:59
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Excel(エクセル) エクセルのマクロで複数シートを両面印刷するには? 2 2022/12/08 23:23
- Visual Basic(VBA) エクセル365のVBAで困っています。どう修正したらよいか添削をお願いします 2 2023/05/03 17:35
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAで不特定枚数印刷をしたいです。 4 2022/08/02 07:30
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
印刷ダイアログを表示させない方法
-
VBAで不特定枚数印刷をしたいで...
-
Eclipseを使ってソースを印刷し...
-
PDFファイルを印刷し終了するには
-
VBAにて指定したセルをプルダウ...
-
VBからプリンタに出力する時に...
-
ActiveReportsを使って[印刷ダ...
-
VB.NET+ActiveReports で印刷...
-
C++/CLIで印刷する画像が表示さ...
-
VBでExcel印刷する時のプリンタ...
-
VBscriptでPDFファイルを直接印...
-
VC++の印刷について
-
プリンタの印刷ジョブを削除し...
-
ご存知の方がいましたら教えて...
-
イベントプロシージャ 印刷が...
-
印刷要求順番と印刷出力順番が...
-
VB2008で0ページの印刷ジョブを...
-
ACCESSで設定した帳票の用紙サ...
-
Excel VBA オブジェクトが必要...
-
印刷方向縦横変更の設定の仕方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
印刷ダイアログを表示させない方法
-
印刷要求順番と印刷出力順番が...
-
プリンターを指定して印刷するには
-
vbaでPDFファイルが印刷されない
-
VBAで不特定枚数印刷をしたいで...
-
VB.NET+ActiveReports で印刷...
-
ACCESSで設定した帳票の用紙サ...
-
PHPでPDFファイルの直接印刷
-
PDFファイルを印刷し終了するには
-
印刷ダイアログを表示させたくない
-
VBからプリンタに出力する時に...
-
EXCELファイルの複数ダウンロー...
-
webページの印刷制限について
-
VBscriptでPDFファイルを直接印...
-
A4の2枚をA3の1枚にする編集方法?
-
VBSでExcelファイル印刷時のプ...
-
リンク先のページを印刷したい
-
2回以上PDFをコピーや印刷がで...
-
VBAにて指定したセルをプルダウ...
-
ActiveReportsを使って[印刷ダ...
おすすめ情報