[[20110203135344]] 『印刷について』(春風邪) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『印刷について』(春風邪)Excel2003 WindowsXP SP3
 こちらのサイトはいつも勉強させていただいており、大変助かります。
 今回始めて質問させていただきます。お尋ねの内容は、印刷についてです。

 Sheet1に伝票の雛形を作成しており、この中に106個の項目があります。
 Sheet2にはひとつのデータが横一列に帳票形式で800行程度あります。
 内容は、1のデータが横一列に106項目記載され、800番台まで記載されていると言う意味です。

 問題は、Sheet1に作成している伝票に、そのときに必要な項目をSheet2から抽出して
 印刷をしなければならないのです。全項目プリントアウトしてよいなら簡単なのですが、
 分類上表示してはいけない項目もあるのです。

 現在の利用方法としてSheet1の必要項目にSheet2の1行の必要箇所を値参照し表示させ
 1枚プリントアウトしては、Sheet2の2行目のデータを1行目にコピーして、
 またSheet1の伝票部分を印刷すると言ったとても手間のかかる作業をしています。
 もちろん印刷時にはわざわざコピーを作成してそのコピーで印刷しています。

 Excelの知識が希薄なものですからこれくらいしか思いつきません。

 どなた抽出したデータを簡単に印刷(プリントアウト)する方法を教えてください。
 宜しくお願いいたします。 


 >問題は、Sheet1に作成している伝票に、そのときに必要な項目をSheet2から抽出して
 >印刷をしなければならないのです。全項目プリントアウトしてよいなら簡単なのですが、
 >分類上表示してはいけない項目もあるのです。
 の部分はシート上はどのように処理しているのでしょうか。

 全部を印刷することができるのであれば、条件で絞り込めばよいと思うのですが、
 まずは現状を説明されてはと思います。

 >もちろん印刷時にはわざわざコピーを作成してそのコピーで印刷しています。
 の部分も、何をどのようにコピーしているかがいま一つ分かりませんので、
 説明があると良いかと思います。
 (Mook)


 質問内容が拙く申し訳御座いません。

 お尋ねは表示方法ではなく印刷方法についてだったのですが、・・・・
 コピーの件は記載するべきものではなかったようです。
 単純に印刷を行う場合、Sheet2のデータを1行ずつ印刷するため
 印刷の課程で行削除を行うためコピーで印刷しているだけの話です。

 Excelの知識がなくこのような高等な場に質問をして申し訳御座いませんでした。

 これ以上の内容をどのように説明すれば判って頂けるかが自分でも
 判らなくなりました。実物が表示できればわかり易いのでしょうが・・・

 「条件で絞り込む」について調べてみます。ありがとう御座いました。

 (春風邪)


 エクセルで差し込み印刷をやりたい、ということでは?
エクセルで作りこむ方法もあるけれど、
ワードと連携して差込印刷
http://www.miyazaki-cci.or.jp/nichinan/pc/case9.html
 
(みやほりん)(-_∂)b

 まだ Sheet1 を使って印刷できているという状態ではないのでしょうか。

 マクロでの実装例です。
 Sheet2 の1行目と1列目に空白列と行を挿入しデータを
 B2:DC801(あってるかな?) に並ぶようにします。

 1行目に、各列のデータを Sheet1 のどのセルに入れるか記載します。
 1列目に、印刷する行に○を記入します。

     A      B          C         D
1          B2          D2        C3
2    ○    山田産業    3月4日    50000
3          鈴木工業    4月1日    20000
4    ○    佐藤商事    3月4日    50000
のような感じです。

 Option Explicit
 Sub FormPrint()
    Dim prtWS As Worksheet
    Set prtWS = Worksheets("Sheet1")

    Dim srcWS As Worksheet
    Set srcWS = Worksheets("Sheet2")

    Dim lastRow As Long
    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    Dim r As Long
    Dim c As Long
    For r = 2 To lastRow
        If srcWS.Cells(r, "A").Value = "○" Then
            For c = 2 To 107
                prtWS.Range(srcWS.Cells(1, c).Value).Value = srcWS.Cells(r, c).Value
            Next
            prtWS.PrintPreview
            '  prtWS.PrintOut  印刷はこっち
        End If
    Next
 End Sub

 で、Sheet2の1行目に記載されたセル位置に各行のデータを入れて、1列目に○が付いた
 行のデータを順番に印刷すると思いますが、どうでしょうか。
 (Mook)

 (みやほりん)様
 大変勉強になりました。ありがとう御座いました。Wordと連携できることを
 初めて知りました。
 > エクセルで作りこむ方法もあるけれど、
 との事ですのでこちらも後々チャレンジしてみたいと思います。

 (Mook)様
 本当に説明が拙い内容を掬い取っていただきありがとう御座いました。
 私がやりたいことはまさにこのような感じのことです。
 Sheet1にはA4サイズに設定したプリントアウト用の書式になっています。
 今まではこのSheet1を1枚ずつ印刷していたわけです。

 Sheet2の必要な行データをSheet1の書式に合わせて一度に印刷できる、
 まさにこの通りの事がやりたいのです。

 Sheet2のデータは、行・列を挿入して必要なものに○をつける作業までは終わりました。

 ただ、この「マクロ」とやらをどのように何処に書けばよいのか、書き方すら
 判らないです。スミマセン。
 全て教えていただくのも勝手すぎますので、実は今朝より色々と
 「マクロ」について調べているのですが・・・ギブアップです。

 (春風邪)


 EXCEL で ALT+F11を押し、表示されたウィンドウで 挿入⇒標準モジュール
 で開いたウィンドウに上記コードをコピー。
 EXCEL にもどって ALT+F8 で FormPrint を選択してください。

 マクロに関しては、いろいろと説明のページがありますので、
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20040831.html
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html
 などをご参照下さい。
 (Mook)

  (Mook)様
 ご指南有難うございます。

 ご指示のとおりに実行してみましたが、何度行っても以下のエラーが出ます。

 「実行時エラー'1004'
 'Range'メソッドは失敗しました。'_Worksheet'オブジェクト

 「デバッグ」ボタンを押すと、
 prtWS.Range(srcWS.Cells(1, c).Value).Value = srcWS.Cells(r, c).Valueの部分が
 黄色になっています。
 そのままExcelに戻って印刷をしてみると、○印をつけた行のデータに関係なく
 データ2行目から7行目までが印刷されてしまいます。
 データはセル指定された部分が正常に印刷されていますので、素人ながらあと一息かと・・・・・
 ご指南いただければ幸いに存じます。
 (春風邪)

 シートの構成の再確認ですが、Sheet2 の1行のデータが Sheet1 の1シート分の
 データということでよいでしょうか。

 エラーが起きた場所、黄色くなったところの、r(行) と c(列)にマウスカーソル
 を持っていき、数値を確認してみてください。

 Sheet2のその列の1行目に記載されたセルのアドレスは、EXCEL 上にあるもの
 でしょうか。ご確認下さい。
 (Mook)

(Mook) 様
 ありがとうございます。
 > シートの構成の再確認ですが、Sheet2 の1行のデータが Sheet1 の1シート分の
 > データということでよいでしょうか。
 その通りです。

 r=6  c=2 と表示されています。

 > Sheet2のその列の1行目に記載されたセルのアドレスは、EXCEL 上にあるもの
 > でしょうか。

      A       B           C           D
1           =Sheet1!Y6   =Sheet1!I16    =Sheet1!F14
2    ○     1258745     担当者A      山口県
3           2865975     担当者B      山梨県
4    ○     7320587     担当者C      新潟県

 実際にはこのようになっています。
 B列はシリアルナンバー、C列は担当者指名、D列は都道府県名です。
 1行目の私の指定の仕方が間違っているのでしょうか。
 Sheet1の文字を入力させたいセルは結合されています。
 Y6は、Y6からAD6まで結合されています。
 I16は、I16からV18までのセルが結合されています。
 F14は、F14からU15までのせるが結合されています。
 この結合が問題なのでしょうか?

 宜しくお願い申し上げます。
 (春風邪)


 1行目に記載するのは
 Y6 I6 F14 ・・・・
 だけです。
 シートの参照は、マクロ内でしているのでこれでは Sheet1 のY6の「内容」をセルアドレス
 としてしまいます。

 =Sheet1! を削除して試してみてください。
 1行目を選択して、置換で変更できると思います。
 (Mook)

 (Mook) 様 ご迷惑をおかけしています。

 1行目はY6 I6 F14 と変更して試みました、Sheet2のE列以降はすべて列削除し、
 行も300以降のデータは行削除しデータを少なくしたものを作成してテストしています。
 やはり何度行っても結果は同じでした。
 ○印を全部つけて試みましたが、r=2 c=5 となります。
 ○印は色々なところに付けてみてテストしましたが、○印を付けた
 先頭のデータのみプリントアウトされ、以降はプリントアウトされません。
 但し、2枚目が白紙で排出されます。印刷プレビューで確認するときちんと1ページ以内に
 Sheet1のデータは収まっております。
 あと一息と思ったのですが、なかなか難しいようです。
 マクロの記述の意味が理解できれば何とかなるのでしょうが、目標にはなかなか遠いようです。
 このようなど素人に懇切丁寧にご教授頂き感謝申し上げます。
 (春風邪)


 (Mook) 様追記です。

 「c=5」となっていますが、これは「列」との事ですが、この列は何を意味するのでしょうか?
 5列目と言う捕らえ方であれば、5列目には何もデータは入っていません。

 最初の○を3行目に付けた場合、「r」にカーソルを合わせると3と表示されます。
 最終行の○を7行目に付けた場合、lastRowにカーソルを持っていくと「7」と表示されますので
 間違ってはいないと思うのですが・・・・
 トンチンカンな質問をしているのかもしれません。申し訳御座いません。
 (春風邪) 


 マクロを作成してから動くようにするまでの工程はデバッグとよび、多かれ少なかれ
 必要な作業です。
 ここは、根気よく問題を解決していくしかありません。

 r が 2 ということはまだ先頭行の処理ということです。
 c が 5 ということは5列目のデータをシート2からシート1へ転記しようとしたところで
 エラーが出たということです。
 Sheet2 の E1 セルの中身がどうなっているか、コピーして掲示できますか。
 これが全角だったり、空白だったり、セルとして指定できない位置(ABC100など)に
 なっていると、今回のようなエラーになります。
 データ(2行目以降)は空白でも構いませんが、1行目はすべて正しい位置を記載する
 ようにしてください。

 この時点で、印刷をしてみるのは意味がありません。
 印刷処理自体マクロの中で行っていますので、正常に稼働する場合、連続で印刷がされます。

 2枚目が印刷されるのは、Sheet1の印刷範囲の設定だと思いますので、事前に調整が必要だ
 と思います。

 これでも問題が解決しないようでしたら、エラーチェックをコードに追加します。

 追記&誤記修正
 D2⇒E1
 (Mook)

 エラーチェックを追記したコードです。
 こちらでエラーメッセージは出ないでしょうか。
 Option Explicit
 Sub FormPrint()
    Dim prtWS As Worksheet
    Set prtWS = Worksheets("Sheet1")

    Dim srcWS As Worksheet
    Set srcWS = Worksheets("Sheet2")

    Dim lastRow As Long
    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    Dim r As Long
    Dim c As Long
    Dim sr As Range
    For r = 2 To lastRow
        If srcWS.Cells(r, "A").Value = "○" Then
            For c = 2 To 107
                On Error Resume Next
                Set sr = prtWS.Range(srcWS.Cells(1, c).Value)
                On Error GoTo 0
                If sr Is Nothing Then
                    MsgBox "Sheet2 の " & Cells(1, c).AddressLocal & "を確認してください。" _
                    & vbNewLine & "セルの位置指定ができませんでした。[" _
                    & srcWS.Cells(1, c).Value & "]" _
                    & vbNewLine & "処理を中断します。"
                    Exit Sub
                End If
                If sr.Count <> 1 Then
                    MsgBox "Sheet2 の " & Cells(1, c).AddressLocal & "を確認してください。" _
                    & vbNewLine & "で指定されたセル範囲は複数です。[" _
                    & srcWS.Cells(1, c).Value & "]" _
                    & vbNewLine & "処理を中断します。"
                    Exit Sub
                End If
                sr.Value = srcWS.Cells(r, c).Value
                Set sr = Nothing
            Next
            prtWS.PrintPreview
            '  prtWS.PrintOut  印刷はこっち
        End If
    Next
 End Sub

 (Mook)

 (Mook)様 お手数をおかけします。

 > Sheet2 の E1 セルの中身がどうなっているか、コピーして掲示できますか。

       A       B           C           D          E
 1            Y6       I16       F14         空白
 2      製造番号   担当者指名   納品先住所      空白
 3    ○     1258745     担当者A      山口県(以下住所)   空白
 4           2865975     担当者B      山梨県(以下住所)   空白
 5    ○     7320587     担当者C      新潟県(以下住所)   空白
 以下
 300まで

 現在使用しているデータはD列 300行までのデータです。
 E列以降には何も入力されていません。当然E1セルにも何も入力していません。
 2行目はタイトル行となっています。3行目からデータが入っています。

 Sheet2の伝票部分のセルの詳細
   ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAG   
 1 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 2 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 3 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 4 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 5 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 6 □□□□□□□□□□□□□□□□□□□□□□□□■■■■■■□□□
 7 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 8 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 9 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 10□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 11□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 12□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 13□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
 14□□□□□■■■■■■■■■■■■■■■■□□□□□□□□□□□□
 15□□□□□■■■■■■■■■■■■■■■■□□□□□□□□□□□□
 16□□□□□□□□■■■■■■■■■■■■■■□□□□□□□□□□□
 17□□□□□□□□■■■■■■■■■■■■■■□□□□□□□□□□□
 18□□□□□□□□■■■■■■■■■■■■■■□□□□□□□□□□□
 19□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

 上記のようにY6からAD6までが結合してあり、Sheet2のB列のデータが入ります。
 F14からU15までのセルが結合してあり、Sheet2のD列のデータが入ります。
 I16からV18までのセルが結合してあり、Sheet2のC列のデータが入ります。

 以上がSheet1とSheet2の詳細です。
 どうかよろしくお願いいたします。

 (春風邪)

 提示された条件でマクロは作成していますので、条件と違った状態だとエラーになります。
 今回の場合はデータ範囲が異なっているので、もし現在のシートがテスト用であるなら
 それに合わせてマクロは変更しなければなりません。
 下記の部分が範囲を指定していますので、
    For r = 2 To lastRow
        If srcWS.Cells(r, "A").Value = "○" Then
            For c = 2 To 107
 を
    For r = 3 To lastRow
        If srcWS.Cells(r, "A").Value = "○" Then
            For c = 2 To 4
 に変更してください。
 (Mook)

 (Mook)様

 107を4に変更することまでは昨夜徹夜で頑張って変更していました。

     For r = 3 To lastRow
        If srcWS.Cells(r, "A").Value = "○" Then の部分は今教えていただいたとおりに
 変更させていただきました。ありがとう御座いました。
 すると今度はエラーが出なくなり、印刷プレビューが出て来て、○を付けたものが
 表示されるようになりました。

 しかしながら○をつけたものが一度にプリントアウト出来ず、印刷プレビューからも
 Sheet1からも1枚ずつしか印刷が出来ません。
 どのような印刷手順を行えばよいのか教えていただけませんでしょうか。
 宜しくお願いいたします。
 (春風邪)

 徹夜ですか・・・。ご苦労様です。
 2行からと、3行からは 条件判定でどちらも一致しないので、r の変更は影響ない
 はずなのですが・・・。
 いずれにせよ、プレビューが出るところまで来たらあと一息です。

 テストのたびに印刷するのは、紙がもったいないので、提示したコードは
 印刷プレビューにしています。印刷したいときは、
            prtWS.PrintPreview
 を
            prtWS.PrintOut
 に変更してください。
 ちなみにマクロコードでは「'」以降はコメントですので、これがある行は実行されま
 せん。

 蛇足ですが、 4つ以上の連続した「----」を行頭から書くと特殊な意味になるので
 ---------------- ・・・
 は発言ないでは使用しない方がよいかと思います。
 (Mook)

(Mook)様この度は大変ご迷惑をおかけいたしました。
 「印刷はこっち」の意味も指摘されて理解できた次第です。
 何もわからないまま仕事をしていましたが、これをきっかけに
 少しとっつきにくかった「マクロ」なども勉強していこうと言う気持ちになれた
 大変良い機会だったと思います。
 右も左もわからないド素人相手に懇切丁寧な対応ありがとう御座いました。
 深謝いたします。
 (春風邪)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.