プロが教える店舗&オフィスのセキュリティ対策術

別シートに印刷用のレイアウトを作成し、更に別シートで印刷設定を行っています。

その印刷設定のページには、印刷開始顧客番号 印刷終了顧客番号とセルを作り、そこで顧客番号を指定して連続印刷したいのですが、今の状況だと、For MyCounter 1 to 5の5の部分を変え残りは手動で入力という方法で印刷しています。

顧客番号のみで連続印刷する為にはどうすれば宜しいのでしょうか?
宜しくお願いいたします。

----------------------------------------------------------------

Sub 連続印刷2()
Dim mycounter As Integer
Dim sita1 As Integer
Dim migi1 As Integer


mycounter = 1
sita1 = Sheets("設定2").Cells(4, 2)
migi1 = Sheets("設定2").Cells(5, 2)


For mycounter = 1 To 5
Sheets("レイアウト2").Select
Range("O2").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 2, 1)
Range("O6").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 3, 1)
Range("O10").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 4, 1)
Range("O14").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 5, 1)
Range("O18").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 6, 1)
Range("O22").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 7, 1)
Range("O26").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 8, 1)
Range("O30").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 9, 1)
Range("O34").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 10, 1)
Range("O38").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 11, 1)
Range("O42").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 12, 1)
Range("O46").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 13, 1)
Range("O50").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 14, 1)
Range(Cells(1, 1), Cells(sita1, migi1)).Select
Selection.PrintOut Copies:=Sheets("設定2").Cells(6, 2)

Next

End Sub

A 回答 (6件)

またまた登場、kobouzuです。



上手くいったようで何より。(^o^)/


で、エラーのとき空白にする式ですが、説明を分かりやすくするために、

VLOOKUP($O2,'住所録(会社)'!$A$2:$Q$65536,2,0) を ■ とすると

 =IF(ISERROR(■),"",■)  

という式になります
これは、■がエラーなら"空白"、エラーでなかったら ■ということです。

で実際には

=IF(ISERROR(VLOOKUP($O2,'住所録(会社)'!$A$2:$Q$65536,2,0)),"",VLOOKUP($O2,'住所録(会社)'!$A$2:$Q$65536,2,0))

このようになります。
見た目長い式ですが、VLOOKUP($O2,'住所録(会社)'!$A$2:$Q$65536,2,0)の部分をコピーして貼り付ければ簡単です。


-------------------------------------------------
●ここからは式をセットする方法。

(1)左端の行番号の 6~52 を選択して、右クリック、削除(行ごと削除します)
(2)残った、1件目の式を修正する
(3)左端の行番号の 2~5 を選択して、右クリック、コピー
(4)左端の行番号の 6~53 を選択して、右クリック、貼り付け

これで全てに正しい式がセットされます。
 

●注意事項

VLOOKUPはちょと変更しなければなりません。

>VLOOKUP( $O$2 ,'住所録(会社)'!$A$2:$Q$65536,2,0)

 $O$2 を $O2 と行番号2の前の$を省いて

 VLOOKUP( $O2 ,'住所録(会社)'!$A$2:$Q$65536,2,0)

としなければなりません。全てそう。
これは式をコピーできるようにするためです。


●●●●●
項目が多くて面倒なようでしたら、
シート「住所録」とシート「レイアウト」のセルの対比をアップしてもらえればコードで処理できますが。

例えば、(必要なのは、1件分です)

「住所録」   「レイアウト」
  B2 ー>  C2
  D2 ー>  E3
   以下同様
等々
 
以上です。
    • good
    • 0
この回答へのお礼

本当にご親切に有難うございました^^

もう、理想どおりの事が出来て凄く満足しています。

最後のセルの対比ですが、勉強しながら挑戦していきたいと思っております^^

お礼日時:2007/05/12 18:00

kobouzuです。



下記コードをコピペしてテストしてみてください。
テストするときは、オリジナルブックのコピーをとってからテスト。

'----------------------------------------------
Sub 連続印刷2()

Dim R As Long
Dim L As Long
Dim Cnt As Integer

Sheets("レイアウト").PageSetup.PrintArea = "$A$1:$N$52"
Sheets("レイアウト").Columns("O:O").ClearContents

With Sheets("住所録(会社)")
 For R = 2 To .Range("Q65536").End(xlUp).Row
  If .Cells(R, "Q").Value = Range("B2").Value Then
   Cnt = Cnt + 1
   L = (Cnt - 1) * 4 + 2
   Sheets("レイアウト").Cells(L, "O").Value = .Cells(R, "A").Value
   If Cnt = 13 Then
     Sheets("レイアウト").PrintPreview
     Sheets("レイアウト").Columns("O:O").ClearContents
     Cnt = 0
   End If
  End If
 Next R

 If Cnt > 0 Then
   Sheets("レイアウト").PrintPreview '余り印刷
 End If

End With

End Sub
'-----------------------------------------------------

●シート「設定2」の構成
  B2: 50音
  B3: 印刷枚数

●シート「住所録(会社)」の構成
  A列: 顧客番号
  Q列: 顧客読みの頭1文字
 
 
■■■
>VLOOKについてですが、空白になるように、エラー処理はしておりません

おや、まあ、(^^;;;
そのVLOOKUPの式をひとつ提示してください。
上記コードがそちらで上手くいくことを確認した後で修正しませう。
 
一応、テストして動作することは確認済みです。
くどいようですが、必ずコピーをとってテストですよ!!
以上です。
 

この回答への補足

おおw
有難うございます>w<
きちんと作動しました、とても感激しております。

VLOOKUPに関してですが
セルB2では =VLOOKUP($O$2,'住所録(会社)'!$A$2:$Q$65536,2,0)
セルD2では =VLOOKUP($O$2,'住所録(会社)'!$A$2:$Q$65536,3,0)
セルF2では =VLOOKUP($O$2,'住所録(会社)'!$A$2:$Q$65536,4,0)
というように記述してあります。

補足日時:2007/05/12 14:54
    • good
    • 0

こんにちは。

kobouzuです。

大体分かりましたが、あと2つ。

●シート「住所録」について

 1行目: 見出し
 データ: 2行目から始まっている
顧客番号: A列

これは提示のコード&補足で分かるのですが念のため


●シート「レイアウト」の構成について。

     【1行目は、大見出し】
1件目は、2行目~5行目(2行目:見出し 5行目:空白行)
2件目は、6行目~9行目(6行目:見出し 9行目:空白行)
3件目は、10行目~13行目(10行目:見出し 13行目:空白行)
以下同様

又は、
      【大見出しは、無し 】
1件目は、1行目~4行目(1行目:見出し)
2件目は、5行目~8行目(5行目:見出し)
3件目は、9行目~12行目(9行目:見出し)
以下同様

のどちらかになってるようですね?
そこら辺りの補足を願います。

それから、13件に満たないときは、
O列に残りのコードがないことになりますので
Vlookupで値を持ってくるとき、エラー処理をしてなければ、
#N/Aのエラーが表示されると思いますが、それは空白になるように
ちゃんとエラー処理されてますよね?


こういった場合、現物が目の前にあるとあっさり解決するんですが、
文章での遣り取りはなかなかですねぇ。(^^;;;

いちおういままでの補足と上記を勘案してコードを書いてみますが、
返答は早めにお願いします。

以上です。

 

この回答への補足

こんにちわ^^

1番目ですが
1行目:見出し と データ:2行目から始まっています。
顧客番号:A列の2行めからになります。

レイアウトの構成については
 【1行目は、大見出し】
1件目は、2行目~5行目(2行目:見出し 5行目:空白行)
2件目は、6行目~9行目(6行目:見出し 9行目:空白行)
3件目は、10行目~13行目(10行目:見出し 13行目:空白行)
となっております。

VLOOKについてですが
空白になるように、エラー処理はしておりません><。
どうやれば宜しいのでしょうか?;-;

補足日時:2007/05/12 12:58
    • good
    • 0

またまた登場、kobouzuです。



現在までの情報でサンプルコードをアップしてもいいのですが、
一発で完璧なコードにした方がベターなのでも少しお訊ねします。

●現在は、顧客番号指定ではなくて、行番号を指定しているようですが、
今回は、顧客番号指定でやりたいのですね????

これはとても重要なことです。
何故なら、開始終了顧客番号をセットする、ということは
先の投稿でお訊ねしましたが
  あ行の顧客番号:100~199
  い行の顧客番号:200~299
と決まってないと無理だからです。
なので、先の回答で質問しましたが、それに対する回答はありませんね。(^^;;;


●シート「レイアウト」について。

>い行(40~90迄とする)を印刷するときは
>全部で4ページになりますが、3ページ分をFor mycounter = 1 To 3とし

>13件分のみ顧客番号を入力し直し3ページのみ設定2のシートで連続印刷し
>残りの79~90までの11人分の顧客番号は、
>レイアウトシートのセルO2に直接手動入力し設定2シートを使わず
>その場合だけファイル→印刷→選択範囲のみ印刷というように印刷しています。

このように最後が13件に満たない場合は、残り11件分のみを範囲設定して印刷するということですね。
余り2件分は空白で印刷するのではなくて、11件分印刷でいいんですね。

このような場合も自動で印刷しないと意味がありませんので、
最後を判断させる為に、シート「レイアウト」のレイアウトが必要です。
使用している列はどの列からどの列までか、
また、印刷するのはどの列からどの列までかということと、
最後の行を自動で判断するために、最後の行に必ず値が入っている列があるか、
あればどの列か。

これが分かると、
sita1 = Sheets("設定2").Cells(4, 2)
migi1 = Sheets("設定2").Cells(5, 2)
これは自動で求めることができますので不要になります。


●それから、
「住所録」シートに1列増やして、そこに、顧客の読みの頭1桁(あ、とか、い)を入力しておくと、
「設定」シートに開始終了顧客番号(現在は、行番号)を設定しなくても
あ、とか、い、を設定すればより簡単になりますよね。

少しでも早く解決したいときは、頻繁にここを覗くようにしてください。
以上です。
 

この回答への補足

曖昧な答え方で申し訳ありません><。

まず1番目ですが
あ行の顧客番号:100~199
い行の顧客番号:200~299
という風に決まっております。

2番目ですが、
余りの2件は空白で、1ページ必ず13件分印刷という風に
印刷出切る様にしたいです。

3番目の使用している列ですが、
データ自体を引用しているのは、B2~N52までで
印刷するのは、A1~N52までです。
最後の行の値と言うのはVLOOK関数の事で宜しいのでしょうか?
それで宜しいのであればN列の52番目になります。

4番目ですが
最後尾のQ列に1列増やして、既に顧客の頭文字あ~わ迄を入力してあります。

顧客の読みの頭1桁でも出来るのですね^^;

初めは、顧客番号でやりたいと書きましたが
今回の住所録印刷では、あ とか いを設定した方が確かに楽になりますね^^;
今回は、読みの頭1桁の方でお願いしても宜しいでしょうか?


よろしくお願い致します。

補足日時:2007/05/12 01:13
    • good
    • 0

こんにちは。



質問の件は簡単にできますが、それにはも少し補足が必要です。


(あ行)をプリントするときは、

For mycounter = 1 To 5

では、(い行)をプリントするときはどうしているんでしょうか。

  For mycounter = ●● To ▲▲

また、開始終了顧客番号を入力して印刷ですから、
顧客番号は、例えば
   あ行: 100~199
   い行: 200~299
   以下同様
と決まっているんですね?    

また、当然、(住所録)シートと(レイアウト)シートは、異なったレイアウトになっており、
(レイアウト)シートは、1頁のみで、13顧客が入るようになっていて、1頁埋まる毎に印刷、してるんですよね。
 
少なくともこれらが分かると的確な回答が寄せられると思いますよ。
 
以上です。
 

この回答への補足

い行をプリントする時ですが、この場合も
For mycounter = 1 To 5の5の部分を変えてます。

レイアウトの名前のシートには、13件までデータが引用出切る様にしてあり、例えばあ行:1~39までとすると1ページに付き13件までデータ引用でき3ページ分となりますので、For mycounter = 1 To 3とし設定2の印刷設定用シートでボタンを押し連続印刷し

その後のい行(40~90迄とする)を印刷するときは
全部で4ページになりますが、3ページ分をFor mycounter = 1 To 3とし

Range("O2").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 2, 1)の13 + 2, 1の部分を下記の様に

Cells((mycounter - 1) * 13 + 40, 1)
Cells((mycounter - 1) * 13 + 41, 1)
Cells((mycounter - 1) * 13 + 42, 1)
Cells((mycounter - 1) * 13 + 43, 1)
Cells((mycounter - 1) * 13 + 44, 1)

というような感じで、13件分のみ顧客番号を入力し直し3ページのみ設定2のシートで連続印刷し、残りの79~90までの11人分の顧客番号は、
レイアウトシートのセルO2に直接手動入力し設定2シートを使わず
その場合だけファイル→印刷→選択範囲のみ印刷というように印刷しています。

kobouzu_suさんの仰る通り、住所録とレイアウトシートは異なったレイアウトになっており13顧客が入り、各1ページずつとなっております。

上手く説明できず申し訳ありません;-;
お分かり頂けますか?

補足日時:2007/05/11 18:51
    • good
    • 0

何をどこからどのように具体的なポイントがわかりません。



まず、コピー元のSheets("住所録(会社)"). はどんな形式のデータなのか顧客の住所録のリストですか?
でそれはどんなアクションをしたらどのように出力先に加工すればいいのか?
まったく不明です。

もし、ただ単にデータを抽出したいなら Findメソッドやオートフィルタ機能を使えば実現できますし、他の方法では 別なセルに入力式を
OR 演算式 =IIF( 顧客番号 > 1000 and 顧客番号 > 1020, True,false)
というようにして(実際には1000と 1020,は別なセルの値)
TRUEの行データをだけを処理するようにとか・・・

この回答への補足

説明が下手で申し訳ありません。

3枚のシートがあり、それぞれ 住所録(会社)、レイアウト、設定2というように分けております。

住所録(会社)というシートは、顧客の住所録になっておりAのセルに顧客番号が入っております。

その顧客番号をレイアウトのシートのセル番号O2,06・・・へ入力すると顧客データが来るようにしてあります。
データの移動には、VLOOK関数を使用しております。

設定2のページでは『セルB2に印刷開始顧客番号』、『B3に印刷終了顧客番号』、『セルB4に印刷範囲の最終の行番号』、『セルB5に印刷範囲の最終の行番号』、『B6セルに発行部数』これらを入力した後に印刷開始というフォームを作成し、そのフォームを押すと印刷という感じにしております。

質問の内容なのですが、
このまま印刷してしまうと連続印刷されていきますが、
今回の住所録作成では、あ行・い行と分けて印刷していかなければならない為、設定2のシートにある『セルB2の印刷開始顧客番号』、『B3の印刷終了顧客番号』に印刷したい顧客番号を印刷開始番号に顧客番号1を入力し終了顧客番号43なら43で止まるようにしたいのです。

設定2の『印刷開始顧客番号』と『印刷終了顧客番号』で指定し連続印刷をしたいと言う事なのですが、お分かり頂けますでしょうか?

現状では、あ行なら大体のページ数を
For mycounter = 1 To 5の5を変え入力し

更に
Range("O2").Value = Sheets("住所録(会社)").Cells((mycounter - 1) * 13 + 2, 1)の13+2,1の2の部分を印刷開始番号に変え印刷しているのですが・・・・

補足日時:2007/05/11 13:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!