[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『入力した枚数を印刷したい』(aki)
こんばんわ
宜しくお願いします。
以下のような表があります。
【A】 【B】 【C】 【D】 1 通番 配送先 品目A 品目B 2 1 北海道 1 2 3 2 青森県 1 4 3 岩手県 2 5 4 秋田県 4 3 6 5 山形県 7 6 宮城県 1
A列は通番、B列には配送先、C列には品目A、D列に品目Bを入力し、 配送したい数だけ、品目Aと品目Bに入力をしていきます。 ここでやりたいことは、品目Aと品目Bとそれぞれ印刷シートというものを作り C列・D列に入力してあるところだけ、宛名に配送先を印刷し、 数字の分だけ印刷したいのです。 例えば、 1番は、品目Aと言うシートのA1に北海道と入力され1枚印刷、 つづいて、品目Bと言うシートのA1に北海道と入力され2枚印刷 されるようなイメージです。2番は品目Bのシートが1枚のみ印刷されるイメージです。
+-------+ +-------+ +-------+ +-------+ +品目A + +品目B + +品目B + +品目B + +北海道 + +北海道 + +北海道 + +青森県 + ・・・ + + + + + + + + +-------+ +-------+ +-------+ +-------+
分かりづらいところが多々あると思いますが、何卒お願い申し上げます。 環境は、XP 2003です。 2013/08/09 22:42 aki
具体的に印刷シートはどのようなレイアウトなのでしょうか。 宛名シールに印刷できるようなシートになっているのでしょうか。
であるとしたら、そのセル情報は提示された方が良いと思います。 あるいは、1シート1葉なのですか? にしても、配送先と品目をどのセルに表示したらよいかの情報は欲しいです。 (Mook)
また、分かりにくく申しわけありません。
>具体的に印刷シートはどのようなレイアウトなのでしょうか。 A10からI50までは、文字や図が入力してあります。 印刷された印刷シートをダンボールに貼るイメージです。 A1に品目Aをあらかじめ入力しておくことも可能ですので、 B列の、配送先がA1やB1に入力されるのが理想です。
>1シート1葉なのですか? シートは、2枚です。品目A用と品目B用です。
有難う御座います。宜しくお願いします。 2013/08/10 00:16 aki
1シート1葉 というのは、1枚に一つの宛先があるかという意味なのですが、 2種類シートがあって、それぞれに差し込み印刷というイメージでしょうか。 マクロの例です。 ★ のところは実際のシート名に合わせてください。 (Mook)
Sub 送り先印刷() Dim ListWs As Worksheet Set ListWs = Worksheets("リストシート") '// ★
Dim r As Long Dim lastRow As Long lastRow = ListWs.Cells(Rows.Count, "A").End(xlUp).Row For r = 2 To lastRow If ListWs.Cells(r, "C").Value > 0 Then With Worksheets("印刷品目A") '// ★ .Range("B2").Value = ListWs.Cells(r, "B").Value '// ☆ 配送先記載位置 .PrintOut copies:=ListWs.Cells(r, "C").Value End With End If
If ListWs.Cells(r, "D").Value > 0 Then With Worksheets("印刷品目B") '// ★ .Range("B2").Value = ListWs.Cells(r, "B").Value '// ☆ 配送先記載位置 .PrintOut copies:=ListWs.Cells(r, "D").Value End With End If Next End Sub
検証させていただきます 御礼が遅くなり申し訳ありません 2013/08/10 23:50 aki
シート名を、リストシート、印刷品目A、印刷品目Bとしてみました C10とC20に1という数字を入れたところ → .PrintOut copies:=ListWs.Cells(r, "C").Value が黄色くなりました。 もう少し検証してみます。 2013/08/11 00:40 aki
ウーン、エラーのときのrは何でしょうか? 一枚も印刷が出ない状態ですか?
水曜までEXCELのマクロは試せないので、それまで他の方のフォローに期待です> <。 (Mook)
有難う御座います 1枚も出ない状態です 印刷品目AのB2に、文字は入りました 自分もこれから模索します。 お忙しいなか、本当に有難うございます! 2013/08/11 13:57 aki
結果からお話をさせていただけると出来ました。 自分の情報公開不足でした。誠に申し訳ありません。 C・D列は、直接入力するわけではなく数式を入れておりました。 結果として、 If ListWs.Cells(r, "C").Value > 0 Then ↓ If ListWs.Cells(r, "C").Value <> "" Then としたら出来ました。 有難う御座いました。 2013/08/12 14:07 aki
申し訳ありません。 もう少しご教示いただけないでしょうか? 例えば 1枚印刷のときには、 1/1 5枚印刷のときには、1/5 2/5 3/5 4/5 5/5 というように印刷することって可能ですか? 宜しくお願いします。 イメージとしては、こんな感じでセルに入れる? Sub カウントアップ_シンプル() For i = 1 To 5 Range("a1") = i 'ActiveWindow.SelectedSheets.PrintOut Copies:=1 Next i End Sub 自分の限界はこのあたりまでです。すいません。 2013/08/12 20:07 aki
今手元にEXCELがないのでブラインドコーディングですが、こういうことでしょうか。 Sub 送り先印刷() Dim ListWs As Worksheet Set ListWs = Worksheets("リストシート") '// ★ Dim r As Long, i as Long Dim lastRow As Long lastRow = ListWs.Cells(Rows.Count, "A").End(xlUp).Row For r = 2 To lastRow If isNumeric(ListWs.Cells(r, "C").Value) = True And ListWs.Cells(r, "C").Value > 0 Then With Worksheets("印刷品目A") '// ★ For i=1 to ListWs.Cells(r, "C").Value .Range("A1").Value = i & "/" & ListWs.Cells(r, "C").Value .Range("B2").Value = ListWs.Cells(r, "B").Value '// ☆ 配送先記載位置 .PrintOut Next End With End If If isNumeric(ListWs.Cells(r, "D").Value) = True And ListWs.Cells(r, "D").Value > 0 Then With Worksheets("印刷品目B") '// ★ For i=1 to ListWs.Cells(r, "D").Value .Range("A1").Value = i & "/" & ListWs.Cells(r, "D").Value .Range("B2").Value = ListWs.Cells(r, "B").Value '// ☆ 配送先記載位置 .PrintOut Next End With End If Next End Sub (Mook)
EXCEL で試してみました。 同じ処理を繰り返しているのでプロシージャをまとめてみました。 処理は上のと同じだと思いますが、とりあえず改訂版です。 (Mook)
Sub 送り先印刷() Dim ListWs As Worksheet Set ListWs = Worksheets("リストシート") '// ★
Dim r As Long For r = 2 To ListWs.Cells(Rows.Count, "A").End(xlUp).Row 宛名印刷 Worksheets("印刷品目A"), ListWs.Cells(r, "B").Value, ListWs.Cells(r, "C").Value 宛名印刷 Worksheets("印刷品目B"), ListWs.Cells(r, "B").Value, ListWs.Cells(r, "D").Value Next End Sub
Sub 宛名印刷(印刷シート As Worksheet, 宛先 As String, 印刷枚数 As Long) Dim i As Long If IsNumeric(印刷枚数) = True And 印刷枚数 > 0 Then With 印刷シート .Range("B2").Value = 宛先 For i = 1 To 印刷枚数 .Range("A1").Value = "'" & i & "/" & 印刷枚数 .PrintOut Next End With End If End Sub
新しい記述有難う御座いました。 本当に感謝いたします。 この記述も施工させていただきます。 Mookさまには簡単なことなんですね。
.Range("A1").Value = i & "/" & ListWs.Cells(r, "C").Value が、1月0日に表記がなってしまったため .Range("A1").NumberFormatLocal = "@" .Range("A1").Value = i & "/" & ListWs.Cells(r, "C").Value としたら思い通りの表記になりました。
本当にお付き合いして頂き有難う御座います。 少しずつ出来るように精進したいと思います。 それでは失礼します。 2013/08/15 01:50 aki
日付になってしまうのを文字列対応で回避されたのは良かったと思います。 後半のコードは ' をつけて日付になるのを避けましたが、文字列設定したほうが スマートな気がします。
毎回設定する必要も無いので、処理の最初で行うか、マクロでなくとも一度文字列に 書式設定しておけばそれでも良いかもしれません。
毎回設定しても、結果は変わりませんが。 (Mook)
ありがとうございました
もうひとつ教えて下さい 数字が全く入っていない場合には、マクロを実施しても無反応ですが 何も入力してない状態で、マクロを実施したら ”数字が入力されてません”のようなメッセージで出すことは可能ですか? 2013/08/17 12:35 aki
For の前に確認処理を入れたらどうでしょうか。
Dim lastRow As Long lastRow = ListWs.Cells(Rows.Count, "A").End(xlUp).Row
If Application.Sum(ListWs.Range(ListWs.Cells(2, "C"), ListWs.Cells(lastRow, "D"))) = 0 Then MsgBox "数字が入力されてません" Exit Sub End If Dim r As Long For r = 2 To lastRow : : (Mook)
本当にありがとうございます 足した数字が0になるという概念はあったのですが このようなことは理解できませんでした。
>For の前に確認処理を入れたらどうでしょうか。 これが全く分かりませんでした。 自分は、後者の構文が理解しきれず、前者の構文をしようさせていただき
Dim lastRow As Long lastRow = ListWs.Cells(Rows.Count, "A").End(xlUp).Row
If Sheets("印刷品目A").Range("J53") = 0 Then ・・・J53が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("K53") = 0 Then ・・・K53が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("o63") = 0 Then ・・・O63が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("P63") = 0 Then ・・・P63が合計の為 MsgBox "数字が入力されてません" End If
For r = 2 To lastRow
としたところ、98×4回OKを押さないとポップアップが消えませんでした。 もっとスマートな書き方が沢山あると思うのですが・・・ ただこの書き方ですと、全てに入ってないと、0があるとポップアップが 出てしまいました。構文を理解していない証拠です。お恥ずかしい限りです。 本当に有難う御座いました。 2013/08/17 23:15 aki
ん、最終的にはうまくいったということでしょうか?
上記のように For の前で判定していれば最大4回のメッセージだけですよね? If ・・・ Then MsgBox "xxxxxx" Exit Sub ' <==== ここで Sub 処理を中断 End If のようにしておけば、If の条件に当てはまった場合、MsgBox を表示後に処理が終了 します。
> If Application.Sum(ListWs.Range(ListWs.Cells(2, "C"), ListWs.Cells(lastRow, "D"))) = 0 Then は C2:Dxxx (xxx は最終行) の合計が 0 だったら、という処理です。 > If Application.Sum(ListWs.Range("C2:D" & lastRow)) = 0 Then の方が少しはわかりやすいかな? (Mook)
本当にありがとうございます。
>ん、最終的にはうまくいったということでしょうか? ↑ 分かり辛くて申し訳ありません。最終的には上手くいきました。
>上記のように For の前で判定していれば最大4回のメッセージだけですよね? ↑ はい仰るとおり、4回で済みました。最初は永遠に終わらないと思い、強制的にエクセルを閉じてました。
>Exit Sub ' <==== ここで Sub 処理を中断 のようにしておけば、If の条件に当てはまった場合、MsgBox を表示後に処理が終了します。 ↑ 有難う御座います。そうなんですね。勉強になります。
>If Application.Sum(ListWs.Range(ListWs.Cells(2, "C"), ListWs.Cells(lastRow, "D"))) = 0 Then は C2:Dxxx (xxx は最終行) の合計が 0 だったら、という処理です。 ↑ 正直分からないです。 Sum以降の違いが・・・ ListWs.Range(ListWs.Cells(2, "C") ListWs.Cells(lastRow, "D")
> If Application.Sum(ListWs.Range("C2:D" & lastRow)) = 0 Then の方が少しはわかりやすいかな? ↑ 学の無い自分は、こちらのほうが理解できました。
お詫びが御座います。 If Sheets("印刷品目A").Range("J53") = 0 Then ・・・J53が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("K53") = 0 Then ・・・K53が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("o63") = 0 Then ・・・O63が合計の為 MsgBox "数字が入力されてません" End If If Sheets("印刷品目A").Range("P63") = 0 Then ・・・P63が合計の為 MsgBox "数字が入力されてません" End If このように書きましたのは、もちろんmookさまに説明する必要があるわけ無いと思いますが お詫びなので書かせて下さい。 範囲が2列では、自分に対応能力が無いと判断し、C・D列の1列ずつに反映させていました。 結果として、教えて頂きましたコードを If Application.Sum(ListWs.Range("C2:D108")) = 0 Then とさせて頂きました。申し訳ありませんでした。 初めは、 If Sum(Range("C8:D108")) = 0 Then で始めたのですが、出来なかったので、Sum関数は使えないんだと勝手に解釈してました。 本当に細かくご親切に・ご丁寧に有難う御座います。 こんな自分にここまでのご尽力本当に恐縮で御座います。有難う御座います。 もちろんmookさまのように成れる訳がありませんが 今後も勉強させて頂ければ幸いです。 2013/08/18 0:33 aki
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.