Excel VBAで指定した印刷範囲をすべて印刷する方法

このQ&Aのポイント
  • Excelデータをフォーマットに差し込んで印刷するVBAがあります。しかし、番号が連番でない場合や重複する番号の行がある場合、正しく印刷できません。
  • 問題なく全員を印刷する方法として、欠番も含めて連番で印刷するように修正し、重複する番号の行は印刷されないようにします。
  • ただし、人数より多い番号は無視されます。また、一件のみ印刷する場合は、番号を指定して印刷することも可能です。
回答を見る
  • ベストアンサー

Excel VBA 指定した印刷範囲をすべて印刷

いつもお世話になっています。 Excelデータをフォーマットに差し込んで印刷するVBAがあります。 当初はこれで問題なかったのですが、番号が連番でなかったりすると正しく印刷できません。 ※厳密なデータベースではないので、場合により番号は重複します。 番号 氏名 性別 1   田中  男 2   山田  男 6   鈴木  男 1   田中  女 Sub 申し込みフォーマット印刷() Dim section ・・・セクション Dim num num = Range("d3") ・・・ここにセクション全員の人数をカウントした数値が入ります。 If vbNo = MsgBox("全員を印刷しますか?", vbYesNo) Then Exit Sub For section= 1 To num ・・・sectionは1からカウントした数値までの間 Sheets("申込用紙_印刷").Range("d4").Value = section ・・・Range("d4")は番号を入力 Sheets("申込用紙_印刷").PrintOut Copies:=1, Collate:=True Next section MsgBox "印刷が終了しました" End Sub とにかく全員を印刷したいというのが希望なのですが、 1 To num を欠番も含めて連番で印刷してしまう、重複する番号の行は印刷されない、 人数より多い番号は無視される という状態です。 一件のみ印刷する場合は、Range("d4")に番号を入力して「選択した番号のみ印刷」を 実行しています。これは問題ないのですが、今回は番号は関係ないのですが、なぜか 1番から人数分を一人ずつ連番でカウントして印刷してしまいます。 すっきりとして結構気に入っているだけに、何かもう少しのことで使えるようにならないでしょうか。 お力添えをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

マクロではなく,「申込用紙_印刷」シートの具体的な数式を直す必要があります。 >Sheets("申込用紙_印刷").Range("d4").Value = section ・・・Range("d4")は番号を入力 「申込用紙_印刷」シートのD4セルに1から順に数字が入ると,シートの数式が =VLOOKUP(D4,データシート,列番号,FALSE) などといった数式になっていて,「番号の行のデータを参照してくる」ようにしていると推測されます。 これを =INDEX(データシート!B:B,D4+1) などのような数式に改めて,データシートの「番号」(A列)はあっさり無視して,単純に「所定の列の何行目(上から順に何番目)のデータ」を参照してくる式にやり直して下さい。

suzupen
質問者

お礼

いつも早々に回答をいただきありがとうございます。 シートの数式は、以下のようになっていて他のシートから参照しています。 =VLOOKUP(d4,INDIRECT(d2),2,) ただこれをどう =INDEX(データシート!B:B,D4+1) などのような数式に改めて参照先を変えるのか、 実はINDEX関数を使ったことがないので先ほどから四苦八苦しているところです。 また進展がありましたらご報告いたします。 お気づきの点がありましたらご指南ください。 よろしくお願いいたします。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

【基礎編 関数のお勉強から必要ですか】 ○INDEX関数の使い方その1 =INDEX(Sheet1!B:B,3) のように数式を書くと,シート1のB列の上から3行目のセルを参照します ○INDEX関数の使い方その2 =INDEX(Sheet1!B2:F20,3,4) のように数式を書くと,シート1のB2:F20のセル範囲の,上から3行目,左から4列目のセルを参照します 間違えないように: 「B2:F20のセル範囲の,上から3行目,左から4列目」とは,B2セルが「1行目の1列目」です。D3セルは「2行目の3列目」になります。 >シートの数式は、以下のようになっていて他のシートから参照しています。 >=VLOOKUP(d4,INDIRECT(d2),2,) 使い方その2を利用すると =INDEX(INDIRECT(D2),D4,2) のようにして,D4に1,2,3…が入れば「INDIRECT(D2)」の上から順に1,2,3行目(の2列目)を採ってこれることがわかります。 D2セルにたとえば具体的に「Sheet1!B2:C10」と書いてあったとすると,いま実際に欲しい「その2列目」はSheet1!C2:C10ですから E2セルに「Sheet1!C2:C10」と書いておいて 使い方その1: =INDEX(INDIRECT(E2),D4) とすれば良いことが判ります。 (判りやすくE2を使って説明しましたが,実際にはD2の「Sheet1!B2:C10」を「Sheet1!C2:C10」に書き換えて使えばよいという事です)

suzupen
質問者

お礼

早々に丁寧な回答をいただきありがとうございます。 答えそのものをいただきながら、スキル不足で作業に手間取ってしまいました。 おかげで希望どおりに動くようになり感動です。 また機会がありましたらよろしくお願いいたします。

関連するQ&A

  • Excel VBA 指定した印刷範囲を印刷

    いつもお世話になっています。 Excelで次のようなデータを作成しました。 sheet本社名簿、sheet支社名簿1、sheet支社名簿2、sheet社員情報 の4枚のシート それぞれの印刷対象になる範囲には、「_本社」といったように名前をつけています。 範囲は先頭に1.2.3・・・のインデックスがついています。 これをリストで「_本社」を選ぶと、sheet社員情報のフォーマットに 一行づつ差し込んで印刷したいのです。 以下の構文を作成したのですが、うまくいきません。 また名簿には50行用意していますが、数人の支社もあります。 その場合、人数を指定しなくても空白行は無視することはできますでしょうか。 どうぞお力を貸してください。 Sub 社員情報_社別印刷() Select Case Worksheets("社員情報").Range("C2").Value 'C2でリストから範囲選択します。 Case Is = "_本社" Sheets("本社名簿").Select Application.Goto Reference:="Print_Area" 'Print_Areaはフォーマット範囲です。 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Range("A1").Select 'A1セルを選択する Case Is = "_支社1" Sheets("支社名簿1").Select ・・・以下繰り返し End Select End Sub

  • (できる方)エクセルVBA印刷済を印刷しない

    リストに追加された内容をチェックシートに差し込み印刷する運用を考えています。 リストは定期的に追加され、前回リストに追加した内容は今回の印刷は印刷しないように したいです。 例)10:00 1~3を入力/1~3を印刷済    11:00 4~6を入力/4~6を印刷する ※10:00の1~3hは再度印刷しないようにする ■したいこと 一度印刷した内容もリスト上にあれば、再度印刷されるので、印刷済フラグをたてて、 次回印刷は印刷済フラグをチェックし、再度印刷されないようにしたい ※現マクロは下記にしるしています。(モジュール1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 流し込み印刷() Sheets("データ入力").Select Dim mylastRow As Long '最終行を格納する変数 Dim myLastCol As Integer '最終列を格納する変数 Dim myLastCell As String '最終セルを設定する変数 With ActiveSheet.UsedRange '対象はアクティブシートの使用中のセル '最終行の行番号 mylastRow = .Rows(.Rows.Count).Row '最終列の列番号 myLastCol = .Columns(.Columns.Count).Column End With Dim i As Integer For i = 7 To mylastRow '1 Sheets("問合せ回答一覧").Range("F3:J3") = Sheets("データ入力").Cells(i, 1).Value '2 Sheets("問合せ回答一覧").Range("F4:J4") = Sheets("データ入力").Cells(i, 2).Value '3 Sheets("問合せ回答一覧").Range("F5:J5") = Sheets("データ入力").Cells(i, 3).Value '4 Sheets("問合せ回答一覧").Range("H8:V8") = Sheets("データ入力").Cells(i, 4).Value '5 Sheets("問合せ回答一覧").Range("H9:V9") = Sheets("データ入力").Cells(i, 5).Value '6 Sheets("問合せ回答一覧").Range("H10:V10") = Sheets("データ入力").Cells(i, 6).Value '7 Sheets("問合せ回答一覧").Range("H11:V11") = Sheets("データ入力").Cells(i, 7).Value '8 Sheets("問合せ回答一覧").Range("H12:V12") = Sheets("データ入力").Cells(i, 8).Value '9 Sheets("問合せ回答一覧").Range("H13:V13") = Sheets("データ入力").Cells(i, 9).Value '10 Sheets("問合せ回答一覧").Range("H14:V14") = Sheets("データ入力").Cells(i, 10).Value '11 Sheets("問合せ回答一覧").Range("H15:V15") = Sheets("データ入力").Cells(i, 11).Value '12 Sheets("問合せ回答一覧").Range("H16:V16") = Sheets("データ入力").Cells(i, 12).Value '13 Sheets("問合せ回答一覧").Range("H17:V17") = Sheets("データ入力").Cells(i, 13).Value Sheets("問合せ回答一覧").PrintOut Next i = i + 1 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 再:(できる方)エクセルVBA印刷済を印刷しない

    リストに追加された内容をチェックシートに差し込み印刷する運用を考えています。 リストは定期的に追加され、前回リストに追加した内容は今回の印刷は印刷しないように したいです。 例)10:00 1~3を入力/1~3を印刷済    11:00 4~6を入力/4~6を印刷する ※10:00の1~3hは再度印刷しないようにする ■したいこと 一度印刷した内容もリスト上にあれば、再度印刷されるので、印刷済フラグをたてて、 次回印刷は印刷済フラグをチェックし、再度印刷されないようにしたい ※現マクロは下記にしるしています。(モジュール1) ※画像に関連する2つのシートを添付しています 上部:データ入力 下部:問合せ回答一覧 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 流し込み印刷() Sheets("データ入力").Select Dim mylastRow As Long '最終行を格納する変数 Dim myLastCol As Integer '最終列を格納する変数 Dim myLastCell As String '最終セルを設定する変数 With ActiveSheet.UsedRange '対象はアクティブシートの使用中のセル '最終行の行番号 mylastRow = .Rows(.Rows.Count).Row '最終列の列番号 myLastCol = .Columns(.Columns.Count).Column End With Dim i As Integer For i = 7 To mylastRow '1 Sheets("問合せ回答一覧").Range("F3:J3") = Sheets("データ入力").Cells(i, 1).Value '2 Sheets("問合せ回答一覧").Range("F4:J4") = Sheets("データ入力").Cells(i, 2).Value '3 Sheets("問合せ回答一覧").Range("F5:J5") = Sheets("データ入力").Cells(i, 3).Value '4 Sheets("問合せ回答一覧").Range("H8:V8") = Sheets("データ入力").Cells(i, 4).Value '5 Sheets("問合せ回答一覧").Range("H9:V9") = Sheets("データ入力").Cells(i, 5).Value '6 Sheets("問合せ回答一覧").Range("H10:V10") = Sheets("データ入力").Cells(i, 6).Value '7 Sheets("問合せ回答一覧").Range("H11:V11") = Sheets("データ入力").Cells(i, 7).Value '8 Sheets("問合せ回答一覧").Range("H12:V12") = Sheets("データ入力").Cells(i, 8).Value '9 Sheets("問合せ回答一覧").Range("H13:V13") = Sheets("データ入力").Cells(i, 9).Value '10 Sheets("問合せ回答一覧").Range("H14:V14") = Sheets("データ入力").Cells(i, 10).Value '11 Sheets("問合せ回答一覧").Range("H15:V15") = Sheets("データ入力").Cells(i, 11).Value '12 Sheets("問合せ回答一覧").Range("H16:V16") = Sheets("データ入力").Cells(i, 12).Value '13 Sheets("問合せ回答一覧").Range("H17:V17") = Sheets("データ入力").Cells(i, 13).Value Sheets("問合せ回答一覧").PrintOut Next i = i + 1 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • エクセル マクロ 印刷指定

    マクロが解りません。色々調べてマクロの記録を使って、下記のマクロを作りました。 1枚目の印刷を2枚目、3枚目印刷として書き足してみました。 しかしエラーが出て2番目のシートからの印刷ができません。 Sub 連絡票印刷() ' ' Macro1 Macro ' ' Keyboard Shortcut: Ctrl+p ' Sheets("連絡票").Select ActiveWindow.SelectedSheets.PrintOut From:=Sheets("連絡票").Range("p1").Value, To:=Sheets("連絡票").Range("q1").Value, Collate:=True, IgnorePrintAreas:=False Sheets("予定表").Select ActiveWindow.SelectedSheets.PrintOut From:=Sheets("予定表").Range("y1").Value, To:=Sheets("予定表").Range("z2").Value, Collate:=True, IgnorePrintAreas:=False Sheets("配車表").Select ActiveWindow.SelectedSheets.PrintOut From:=Sheets("配車表").Range("s1").Value, To:=Sheets("配車表").Range("t2").Value, Collate:=True, IgnorePrintAreas:=False Dim str As String str = Worksheets("連絡票").Range("r1") Worksheets(str).Select End Sub いろいろ解らないなりに書き換えをしてみましたが、やっぱり2番目のシートから印刷ができません。 教えていただけませんでしょうか。

  • 顧客番号を指定して印刷するには?

    別シートに印刷用のレイアウトを作成し、更に別シートで印刷設定を行っています。 その印刷設定のページには、印刷開始顧客番号 印刷終了顧客番号とセルを作り、そこで顧客番号を指定して連続印刷したいのですが、今の状況だと、For MyCounter 1 to 5の5の部分を変え残りは手動で入力という方法で印刷しています。 顧客番号のみで連続印刷する為にはどうすれば宜しいのでしょうか? 宜しくお願いいたします。 ---------------------------------------------------------------- Sub 連続印刷2() Dim mycounter As Integer Dim sita1 As Integer Dim migi1 As Integer mycounter = 1 sita1 = Sheets("設定2").Cells(4, 2) migi1 = Sheets("設定2").Cells(5, 2) For mycounter = 1 To 5 Sheets("レイアウト2").Select Range("O2").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 2, 1) Range("O6").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 3, 1) Range("O10").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 4, 1) Range("O14").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 5, 1) Range("O18").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 6, 1) Range("O22").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 7, 1) Range("O26").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 8, 1) Range("O30").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 9, 1) Range("O34").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 10, 1) Range("O38").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 11, 1) Range("O42").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 12, 1) Range("O46").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 13, 1) Range("O50").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 14, 1) Range(Cells(1, 1), Cells(sita1, migi1)).Select Selection.PrintOut Copies:=Sheets("設定2").Cells(6, 2) Next End Sub

  • エクセル 表引きで特定番号を除外するマクロ

    エクセルの表引きで二つのシートを両面印刷するのに以下のマクロを使用しています。 Rangeの個人番号で複数の特定の番号だけを印刷しないようにするにはどんなアレンジをすればいいのでしょうか。 "自""至"に連番を指定するのですが特定の番号だけを指定から外すようなコマンドを入れたいのです。 Sub 票印刷() Sheets("個人票").Range("個人番号") = Sheets("個人票").Range("自") Sheets("個人票裏").Range("個人番号イ") = Sheets("個人票裏").Range("自イ") Do While Sheets("個人票").Range("個人番号") <= Sheets("個人票").Range("至") Sheets(Array("個人票", "個人票裏")).PrintOut Sheets("個人票").Range("個人番号") = Sheets("個人票").Range("個人番号") + 1 Sheets("個人票裏").Range("個人番号イ") = Sheets("個人票裏").Range("個人番号イ") + 1 Loop End Sub よろしくお願いします。

  • エクセルの同一シートをPDFで保存するVBA

    下記のページでサンプルをダウンロードしました。 http://pc.nikkeibp.co.jp/article/NPC/20070301/263710/ 1つのシートを連続印刷するものです。 しかしながら、これをPDFに出力する場合、1データ毎に 保存場所を確認してきます。しかも、保存ファイル名も同一です。 (通常使うプリンタをPDF Printerに指定) これを自動で、1つのPDFファイルに全データを保存、 もしくは、1つのpdfに1つのデータが保存されたものを人数分、 保存することは可能でしょうか? Sub 個人票印刷() Range("個人番号") = Range("自") Do While Range("個人番号") <= Range("至") Sheets("個人票").PrintOut Range("個人番号") = Range("個人番号") + 1 Loop End Sub

  • エクセル VBA 表示範囲の簡素化

    よろしくお願いします。 下記構文の簡素化ができないでしょうか。 CommandButtonが30個ほどあります。 ーーーーーーーーーー Private Sub CommandButton1_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton2_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A8:B21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton3_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("C8:D21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

  • エクセルマクロ 2部づつ印刷する

    現在、下記のようなマクロを組んでいました。 2部づつ印刷するには、何がいけないのでしょうか? (変数まではうまくいき、1部印刷するだけなら、できました) Sub 一括印刷() Dim a, b As Integer Sheets("○○").Select a = Range(d4) b = Range(d5) For n = a To b Range("d10") = n AcriveSheet.PrintOut Copies:=2 End Sub

  • A4用紙に2枚印刷する方法

    現在、下記のマクロでエクセルでシート2で印刷フォーマットにシート1データを落とし込み、指定した開始番号(自)から終了番号(至)で差し込み印刷を行っています。 しかし、このフォーマとはA5の大きさなんですが、印刷するのはA4にしています。これだと用紙の半分が余白になり、もったてないので半分印刷しては、また用紙を入れて印刷していますが、なんとかA4の左右に印刷できないものかと思い、ご教示お願いしたいと思います。 Sub 商品票印刷() Range("商品番号") = Range("自") Do While Range("商品番号") <= Range("至") Sheets("商品票").PrintOut Range("商品番号") = Range("使用品番号") + 1 Loop MsgBox "商品表印刷が終わりました。" End Sub

専門家に質問してみよう