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

解決済みの質問

Excel VBAを利用して宛名シール作成について

VBA初心者です。
仕事で、宛名シールを使って、商品が入っている箱に貼り付けるシールを作ることになり、
勉強を兼ねてVBAで試作中です。

【1枚目シート 明細】
メーカー 商品名 数量
トヨタ カローラ 1
ホンダ シビック 2

【2枚目シート 書式】
既製品の宛名シールに合うように、Excelでセルを調整済み
(縦3・横3で1件分のシール。これを縦7件・横2件、合計14件分を作成)

<やろうと思っていること>
(1)明細シート1行毎、書式シートの1件分のセルに転記(これはマクロの記録で出来ました)
(2)書式シート、14件分埋まったら、印刷をする。
(3)書式シートに転記済みのデータを全て消去(これは自力で出来そうです)
(4)15件目から同じことを繰り返す。
(5)明細シートのデータ最終行までいったら、転記終了。
※明細データ数は、毎回変わる。

(2)~(5)の流れを、どのようにコードにしたら良いか、見当がつきません。
Doで繰り返すのかなとも思ったのですが、途中で印刷とデータ消去を挟むとなると、
どうなるんだろう???と、止まってしまいました。

フリーソフトやラベル印刷ウィザードで対応することも考えましたが、
使う人のことを考えたら、VBAでボタン一つで終わるようにしたいと思っています。

文章での表現で、理解しずらいかもしれませんが、取っ掛かりとなるヒントでも
教えて頂きたいです。

よろしくお願いします。

投稿日時 - 2013-01-16 11:14:15

QNo.7894466

困ってます

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

考え方はいくつかあると思いますが、
ご自身の考え方を整理する、と言うのも含めて2通りの提案を。
ザックリで申し訳ないですが、ひとまずヒントにはなるかと。

一つ目は「カウンタ風のモノ」を入れる考え方。
DoでもForでも良いのですが、繰り返し処理開始前に初期化、
繰り返す度にカウンタに1を加算し、14まで行ったらリセット・・と言う考え方ですね。
具体的に例を挙げると、

Dim i As Integer, r As Integer
Dim RCount As Integer    '変数の名前は適宜
    RCount = 0    'まず初期化
    '以下、1行目からA列の最終行まで繰り返し
    For r = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        ~~処理~~
        RCount = RCount + 1    'カウンタに1加算 = 処理した件数
        IF RCount = 14 Then    'カウンタが14に達したら = 14件処理したら
            ~~印刷の処理~~
            ~~消去の処理~~
            RCount = 0    'カウンタをリセット
        End IF
    Next r
    ~~端数を印刷~~

・・・と言った感じでしょうか。
これで、14件終わったら印刷して消去、次の14件を目指す・・
と言う感じに処理が進みます。


もう一つは、もう気にせずに全件を処理してしまい、まとめて印刷する考え方です。
実際に手動でこのシートを作ろうとしたらどうしますでしょう?
14件打って印刷、消去して、また14件打って印刷・・とはしないと思います。
一気に打って、一気に印刷する方が理にかなっているような気がします。
マクロでも、この考えでいってみてはいかがでしょう?
つまり・・「横に2件分、縦は気にせずに羅列」と言う考え方です。
これであれば、余計なことを考えずに印刷も一回、消去も最初の一回だけでOKですから。

    ~~消去の処理~~
    For r = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        ~~処理~~
    Next r
    ~~印刷の処理~~  

これでスッキリ書けますね。

ただし、縦7件が終わったら改ページを挿入、と言うのは必要かもしれません。
その場合も、For ~ Nextの間に「何行目だったら改ページ」でも良いですし、
繰り返し処理を抜けた後に適宜改ページを入れる処理を書いても良いかもしれません。



ちょっぴり難しく考えるなら前者、簡単に考えるなら後者・・と言うところでしょうか。
少しでもヒントになれば。

投稿日時 - 2013-01-16 12:01:10

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

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

回答(4)

ANo.4

再度間違い発見。。。

N02を見ればわかりますが、印刷した分のデータ削除処理はif thenの中にいれてくださいね。

投稿日時 - 2013-01-16 12:19:49

ANo.3

ごめんなさい間違え発見しました。

if i = 14 then
ではなく、
if j = 14 then
です。

それと再度補足。

最終行を取得する時にA1を基準としていますが、ヘッダー(メーカー 商品名 数量)が入っているなら、
A2を基準とするか、A1を基準としたものから-1してください。

つまり、A1にヘッダーが含まれている場合、最終行がずれるということ。
A1からいきなり『トヨタ カローラ 1』と始まっているならそのままで問題ありません。

投稿日時 - 2013-01-16 12:02:52

ANo.1

dim loopCnt as long  ' 明細シートのデータ最終行
dim i as long   ' ループカウンタ
dim j as long    ' 14件判定用

j = 0
loopCnt = Worksheets("明細シート").Range("A1").End(xlDown).Row ' 明細シートのA1を基準に最終行を取得(データが入力されている分まで)

for i = 1 to loopCnt ' (5)に該当
    (1)
    j = j + 1
    if i = 14 then       ' (2)に該当
     '印刷する確認ダイアログを出すならここに。
     Worksheets("書式シート").PrintOut
     j = 0 '(4)に該当
    end if

    (3)出来そうというので省略

next i

こんな感じでしょうか?

補足
思いついたのをそのままコード化にしたので、効率とかはいいとは言えないかも。。。
ただ、印刷したり、最終行取得だったりは正しいはず。

半角スペースやtabが全角スペースに置換されているので、そのままじゃエラーでます。
変数の型、定義、文法等小文字じゃだめなのがあるかもしれません。(書き方はあってるはず)

印刷に関するもっと詳しい記述が参照URLにかかれています。(確認ダイアログの出し方もかいてます。)

参考URL:http://officetanaka.net/excel/vba/sheet/sheet08.htm

投稿日時 - 2013-01-16 11:58:59

あなたにオススメの質問