アプリ版:「スタンプのみでお礼する」機能のリリースについて

お願いします。シートは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

'---------- ここまで ----------


初心者なので、ころがっているものをコピペしてみたのですが。

A 回答 (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
    • good
    • 0
この回答へのお礼

早速のお返事、ありがとうございます。今晩やってみて、結果をご報告いたします。

お礼日時:2016/05/09 16:51

こんにちは。



私は素人なのですが、私なりにアレンジしてみました。
なるべく、標準モジュールでお使いください。

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
'---------------------------
「エクセル VBA 印刷モジュール」の回答画像1
    • good
    • 0
この回答へのお礼

ありがとうございます。早速やってみます。できましたら、正解なども一緒に印刷する為に、vlookupでの処理の仕方を教えて下さいませんでしょうか。それと、vba 作成者へのリスペクトは今後、気をつけていきます。ご指摘ありがとうございました。重ねて御礼申し上げます。

お礼日時:2016/05/09 15:43

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