[[20210902215941]] 『VBAを使用した差込文書について』(あ) ページの最後に飛ぶ

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

 

『VBAを使用した差込文書について』(あ)

エクセルのVBAでの差込印刷について、どのようにコードを入力したら良いか教えていただけないでしょうか。

 「印刷」シートと「データ」シートがあります。 「データ」シートに差し込みたい一覧のデータが入力されています。

 「データ」シートの一覧表は下記の通りです。

    A 列         B列        C列        D列
1    No.        氏名        会社名   枚数
2    1            あ    A会社          1
3    2            い    B会社             
4    3            う    C会社          5          
5    4            え    D会社          3
6    5            お    E会社          2

 「印刷」シートには予め決められているレイアウトがあります。
 「データ」シートの一覧を「印刷」シートの下記のセルに差し込みたいです。

 「データ」シート→「印刷」シート
 B列の氏名→C3
 C列の会社名→C5

 「データ」シートのD列に入力してある枚数が、必要部数です。
 空欄になっている行は、出力されないようにしたいです。

検索して色々探したのですが、枚数指定までできるものが見つからず、こちらに投稿させていただきました。
よろしくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


PrintOutメソッドのCopies引数が印刷部数です。これを使えばよいのではないですか?
それ以外は調べられたでしょうから、そこだけ修正すればよいと思います。

また、IF文で分岐して、D列がブランクでない時だけ、
PrintOutメソッドを使用して印刷します。
回答になっていますか?

(γ) 2021/09/02(木) 22:21


ご回答いただき、ありがとうございます。
調べたものが下記のものになるのですが、あまり詳しくないもので、どの部分にコードを入れたら良いか、自分が使用したいようにするにはどのように修正すべきかも分からない状態です。

以前、調べたもの同士を組み合わせて作ったところ、作動しなかったことがありました。


'メイン処理
Public Sub MainProc()

    Dim strNo As String

    With ThisWorkbook.Sheets("差込データ一覧")
        Do While True

            '従業員番号を保存
            strNo = .Range("A5")

            '従業員番号が空なら、ループを抜ける
            If strNo = "" Then Exit Do

            'A5:C5をコピーし、A2:C2に貼り付け
            .Range("A5:C5").Copy .Range("A2:C2")

            '5行目を削除する(上にセルを上げる)
            .Range("A5:C5").Delete xlShiftUp

            'ひな形シートを印刷する
            ThisWorkbook.Sheets("ひな形").PrintOut

        Loop

        'A2:C2セルを空にする
        .Range("A2:C2") = ""
    End With

    MsgBox "完了"
End Sub
(あ) 2021/09/02(木) 23:09

5行目を削除していく方式が私にはなじみにくいです。
それはさておき、
2行目がひな形シートに使われているなら、
 
IF .Range("D2") > 0 Then ThisWorkbook.Sheets("ひな形").PrintOut(Copies:=.Range("D2"))
とでもするんでしょうか。
こちらでは未確認なので、そちらでステップ実行してテストしてください。

(γ) 2021/09/02(木) 23:28


説明とレイアウトが一致してませんが、提示されたコードの方が正しいならこうじゃないですか?

【差込データ一覧】のレイアウト

  ____A_____   ____B_____   ____C_____   ____D_____
 1   No.          氏名        会社名     枚数
 2                                                    ←この行を【ひな形】シートが数式で参照している
 3
 4   No.          氏名        会社名     枚数
 5    1            あ     A会社          1
 6    2            い     B会社             
 7    3            う     C会社          5         
 8    4            え     D会社          3
 9    5            お     E会社          2

そして、既にγさんからコメントがあるように、差し込み印刷でデータを削除するようなコードはあまり見かけません。
単純に5行目〜(A列の)最終行までを順番に見ていきD列に値があれば2行目にコピペすることを考えればよいでしょう。

    Sub さんぷる()
        Dim 行 As Long

        Stop 'ブレークポイントの代わり

        With ThisWorkbook.Sheets("差込データ一覧")
            For 行 = 5 To .Cells(.Rows.Count, "A").End(xlUp).Row
                If .Cells(行, "D").Value <> "" Then
                    .Cells(行, "A").Resize(, 3).Copy .Range("A2")
'                    ThisWorkbook.Sheets("ひな形").PrintOut Copies:=.Cells(行, "D").Value
                    .Cells(行, "E").Value = "印刷済"
                End If
            Next
            .Range("A2:C2").ClearContents
        End With

        MsgBox "完了"
    End Sub

(もこな2) 2021/09/03(金) 11:34


γ様、もこな2様

回答ありがとうございます。
載せさせていただいたコードは、参考にしたコードをそのままコピーしただけなので、このコードを参考に自分の設定したいものに修正したいと考えておりました。

もこな2様が記載してくださったレイアウトの1〜3行目までは、私の作成した一覧にはない状態です。

説明不足で申し訳ありません。
(あ) 2021/09/03(金) 12:43


>もこな2様が記載してくださったレイアウトの1〜3行目までは、私の作成した一覧にはない状態です。
>あまり詳しくないもので、どの部分にコードを入れたら良いか、自分が使用したいようにするにはどのように修正すべきかも分からない状態です。

ならば、まずレイアウトを合わせるか、コードを合わせるかしないとダメなのは流石にわかりますよね?
そのうえで、ネット検索したり質問掲示板で提示のあったコードについて何をやっているか研究してみてはどうですか?

研究には【ステップ実行】という方法を使うと便利ですよ。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

また、以下も知っておいて損は無いと思います。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

(もこな2) 2021/09/03(金) 13:07


 # 既にご指摘いただいたとおりですが、せっかく書いておいたので、投稿しておきます。
 前の投稿の訂正です。
 IF .Range("D2") > 0 Then ThisWorkbook.Sheets("ひな形").PrintOut(Copies:=.Range("D2"))
 と書いたが、
 IF .Range("D2") > 0 Then ThisWorkbook.Sheets("ひな形").PrintOut Copies:=.Range("D2")
 としてください。(カッコは不要。あるとエラーです)

 さて、質問はどこかネット上の記事をそのままコピーしただけですかね。
 シート名の修正もしていないし、
 そもそもあなたの提示した「データ」形式と、コードは、全く対応していませんよ。
 随分な"省エネ質問"ですね。

 そのコードでは、印刷指令を出す都度、一覧のデータを削除していく方式を取っていますが、
 何を印刷したかあとに残りませんよね。
 対象一覧はそのまま残し、逆に、印刷日時を残すくらいがいいんじゃないですか?

 以下に参考コードを示します。
 (5行目から2行目に移すなどということをせず、
   2行目以降を順次、印刷シートに直接書き込む方式にしています。)

 Sub 差込印刷()
     Dim ws As Worksheet
     Dim sName As String, sCompany As String, nCopies As Long
     Dim k As Long

     Set ws = ThisWorkbook.Sheets("印刷")
     With ThisWorkbook.Sheets("データ")
         .Columns("E:F").ClearContents       '印刷履歴をいったん消去
         For k = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
             sName = .Cells(k, "B").Value
             sCompany = .Cells(k, "C").Value
             nCopies = .Cells(k, "D").Value
             If nCopies > 0 Then
                 ws.Range("C3") = sName      '印刷シートに直接書き込む
                 ws.Range("C5") = sCompany
                 'ws.PrintOut copies:=nCopies
                 ws.PrintPreview
                 .Cells(k, "E") = "印刷済"
                 .Cells(k, "F") = Now()      '印刷日時
             End If
         Next
     End With
 End Sub
 (注)
 ・なお、一覧と印刷シートの対応関係をコードに持ち込んでいますが、
  項目数が多い場合、メンテナンスしにくいという見方があるかもしれない。
  その点では、質問にあるような方式でもよいですが、"削除"は絶対にやめたほうがいい。
   削除はコストがかかる動作ですし、少なくともコピー方式にすべき。
 ・また、印刷シートの項目は、=Index(一覧の対象範囲、行番号指定のセル、列番号)と
   言った式を埋め込み、マクロで行番号指定のセルを更新していく方式も考えられます。
 (余談)
 >以前、調べたもの同士を組み合わせて作ったところ、作動しなかったことがありました。
 だから何ですか?
 直球を返すなら、今回のように、今のデータのレイアウトと違う前提のコードであれば、正常動作しないのはあたり前です。
 まったく同じ前提のものをネットで探す努力よりも、コードを読む力をつけることのほうが大事でしょう。  
(γ) 2021/09/03(金) 14:50

コメント返信:

[ 一覧(最新更新順) ]


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