みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルから帳票形式に差込印刷したいのですが

皆さん初めまして!

エクセルで1万件に近いデータがあります。

これらを帳票形式に差込印刷したいと思えば、ワードの「差込印刷」機能以外に、エクセル自体で行なうことは不可能でしょうか?

(例:請求データを請求書フォームに印刷)

ワードの差込印刷は便利ですが、エクセルデータ形式(特に金額のカンマ区切り表示が必要なため)を参照する際は、フィールド設定の数の制限が22列まで?で・・・行き詰っています(私は約40列あります)。

エクセル・ワードの操作は上級手前の操作まではいけますが、
エクセルでVBA、差込印刷マクロを作るとまではいけないもので・・・何か妙案がありましたらご教示願います・・・

投稿日時 - 2007-06-07 15:21:50

QNo.3064424

困ってます

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

#01です。出血大サービスです(^^;
ただし不具合以外の修正はご自身でお願いします。
2行目~4行目と項目の定義の箇所は再度設定し直してください。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub InsPrint()
Const org As String = "Sheet1" '元データのシート名
Const prs As String = "Sheet2" '印刷するシート名
Const strt As Integer = 2 '元データの実データ開始行
Dim idx, fromL, toL As Long
Dim oSht, pSht As Worksheet
Dim res, res2
 Set oSht = Worksheets(org)
 Set pSht = Worksheets(prs)
 res = MsgBox("印刷行範囲を指定しますか?" & Chr(13) & _
  "はい:指定する、いいえ:指定しないで全件印刷、CANCEL:印刷しない", vbYesNoCancel)
 Select Case res
  Case Is = vbCancel
   Exit Sub
  Case Is = vbYes
   res2 = Application.InputBox("印刷開始行を半角数字で入力して下さい", Type:=1)
   If TypeName(res2) = "Boolean" Then
    MsgBox "印刷を中止しました", vbOKOnly
    Exit Sub
   Else
    If res2 >= strt And res2 <= oSht.Range("A65536").End(xlUp).Row Then
     fromL = res2
    Else
     MsgBox "開始行が不適切です。印刷を中止しました", vbOKOnly
     Exit Sub
    End If
   End If
   res2 = Application.InputBox("印刷する最終行を入力して下さい" & Chr(13) & _
     "99999を入力すると最終行まで印刷します", Type:=1)
   If TypeName(res2) = "Boolean" Then
    MsgBox "印刷を中止しました", vbOKOnly
    Exit Sub
   Else
    If res2 = 99999 Then
     toL = oSht.Range("A65536").End(xlUp).Row
    Else
     If res2 >= fromL And res2 <= oSht.Range("A65536").End(xlUp).Row Then
      toL = res2
     Else
      MsgBox "最終行が不適切です。印刷を中止しました", vbOKOnly
      Exit Sub
     End If
    End If
   End If
  Case Else
   fromL = strt
   toL = oSht.Range("A65536").End(xlUp).Row
 End Select

 For idx = fromL To toL
'以下の行を項目数だけコピーして定義する
  pSht.Range("A1").Value = oSht.Cells(idx, "A").Value
'
  pSht.PrintOut '印刷
'5頁につき8秒休止する
  If (idx Mod 5) = 0 Then
   DoEvents
   Sleep 8000
  End If
 Next idx
End Sub

投稿日時 - 2007-06-07 19:03:17

お礼

質問者です。
うーん・・・!!!本当に「出血サービス」を頂きました・・・!
感謝・・・感謝です!!!
不具合もなく、理想通りの差込印刷ができました。本当にありがとうございます。

自分自身、もっとマクロVB応用ができるよう勉強します@_@;

ちょいと・・・質問ですが、

最初の行 Declare Sub  の
Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
は、どういう行為(意味)をさすのでしょうか?

索引とか引いても見つからないもので・・・^^;

投稿日時 - 2007-06-12 17:05:53

ANo.4

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

エクセルで差し込み印刷のようなことをするにはマクロが必要です。
以下のマクロはそのひな形です。

 pSht.Range("A1").Value = oSht.Cells(idx, "A").Value
の行を差し込みする項目の数だけコピーして定義して下さい。この例は
 pSht.Range("A1").Value → 印刷シートのA1セルに
 oSht.Cells(idx, "A").Value → 元データのA列のデータを
差し込むという意味になります。修正を加えるのは左辺"A1"と右辺"A"の2カ所のみで、他は変えてはいけません。
また2行目~4行目も実際のシートに合わせて修正が必要です

マクロはALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。実行はシート画面に戻って、ALT+F8を押してマクロ一覧からマクロ名を選択して実行します。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub InsPrint()
Const org As String = "Sheet1" '元データのシート名に修正
Const prs As String = "Sheet2" '印刷するシート名に修正
Const strt As Integer = 2 '元データの実データ開始行に修正
Dim idx As Long
Dim oSht, pSht As Worksheet
 Set oSht = Worksheets(org)
 Set pSht = Worksheets(prs)
 For idx = strt To oSht.Range("A65536").End(xlUp).Row

' 以下の行を項目数だけコピーして定義する
  pSht.Range("A1").Value = oSht.Cells(idx, "A").Value
'
  pSht.PrintOut '印刷
' プリンタの印刷が追いつかないので5頁につき8秒休止する
  If (idx Mod 5) = 0 Then
   DoEvents
   Sleep 8000 'ミリ秒単位で指定
  End If
 Next idx
End Sub

マクロを実行中途中で印刷を止めたい場合は、ESCキーを押してください。

投稿日時 - 2007-06-07 16:09:56

補足

すみません、質問者です。

「お礼」のところに「あ」と書いた後、誤って確認画面・・・へ進んでしまいました><

早速、回答をありがとうございました!
す、すばらしい、感動するくらいシンプルで要望どおりのマクロひな形です!
試してみたところ、うまくいきました。

そこで、さらに厚かましい質問ですが・・・

指定行から指定行まで、を印刷せよ、という指示BOXを組み込むマクロを挿入するにはどういった風にすればいいでしょうか・・・?

マクロVBAを勉強中のみであり、なかなか応用まで行きません・・・未熟モノですが、よろしくお願い致します。

投稿日時 - 2007-06-07 17:45:29

お礼

投稿日時 - 2007-06-07 17:44:45

ANo.2

すみません、解決策ではありません。先に考え方のお話です。
そういう込み入った処理をする場合、通常はアクセスでやると思いますよ。
アクセスの場合、データベースとフォームを作るのと両方しなくては
いけないと思いますので。

EXCELで、もしやるとするなら、マクロやVBAを組んでやらなくては
いけないと思います。関数や数式だけでやろうとすれば、かなりの
手間がかかると考えられますし、処理も煩雑になると予想されますので、
・お金を出して詳しい人に作ってもらうか
・かなりの手間を覚悟で関数や数式を組み合わせて作るか
のどちらかになると思います。

解決にならないレスで申し訳ありません。m(__)m

投稿日時 - 2007-06-07 15:52:20

お礼

回答ありがとうございます^^

そうですね、アクセスだと問題ないですが、
ここの職場では、アクセスがなく、またアクセスを使いこなせる人がいないので、今後の引継ぎを考えて・・・エクセル&ワードでいく方法がないかを模索中です。

参考意見をどうもありがとうございました。

投稿日時 - 2007-06-07 17:50:26

ANo.1

逃げの手段ですが、アクセスで処理したら制限ないですよね。

投稿日時 - 2007-06-07 15:49:29

お礼

そうなんですわ(笑

アクセスがない職場だからこそ・・・^^;

投稿日時 - 2007-06-07 17:51:05

あなたにオススメの質問