• ベストアンサー

マクロを使った改ページについて

A列に店番(数値)、D列に伝票番号(数値)が入っていて、毎回行数は変わります。 D列の数値が3回変わったら改ページを入れたいのですが、A列の数値が変わったらD列の数値が1回しか変わってなくても改ページを入れたいです。 A列の数値が変わったら必ず改ページ、 D列の数値が3回変わったら改ページ、 これを同時に行えるマクロの書き方を教えてください。 わかりずらい文章で申し訳ないですが、 よろしくお願い致します。

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

  • ベストアンサー
  • masnoske
  • ベストアンサー率35% (67/190)
回答No.5

A列,D列ともに空白セルがないので,A列を空白セルになるまでループする.  A列の値が変わったら改ページする.  A列の値が同じでもD列の値が 3回変わったら改ページする.  A列,D列ともに以前の値を記録用変数にしておいて比較する.  条件を満たせば改ページし,記録用変数をリセットする. このような場合,D列の記録用変数には配列を使うのが一般的と思いますが,配列だと値が使用されているかどうか,3回変わったかどうかの判定で For Nextループを回す必要があります. そこで,今回は判定ループを回さずに済むコレクションを記録用変数に使用してみました. コレクションでは同じキーを指定できない性質があるので,これをループの代わりに利用しています. 以下のように配列よりもスッキリしたコードになりました. Sub test() Dim rng As Range Dim objA As New Collection Dim objD As New Collection Dim strA As String Dim strD As String Dim blnBreak As Boolean ' 改ページを全て解除 ResetAllPageBreaks For Each rng In Range("A:A") strA = CStr(rng.Value) strD = CStr(rng.Offset(0, 3).Value) ' コレクションに追加(同じデータはスキップする) On Error Resume Next objA.Add strA, strA objD.Add strD, strD On Error GoTo 0 If objA.Count = 2 Then ' A列の 2つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else If objD.Count = 4 Then ' D列の 4つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else blnBreak = False End If End If ' 改ページ挿入 If blnBreak Then HPageBreaks.Add rng End If Next End Sub

s1194
質問者

お礼

すみません!! できました!!! ありがとうございますm(_ _)m とても助かりました。 マクロの勉強を始めたばかりで知らないコードばかりでしたが、勉強になりました。 ありがとうございます。

s1194
質問者

補足

上手く出来なかったです。。 改ページは挿入されたのですが、D列が3回変わったら、のところが1回で改ページが入っていたり、3回で入っていたり、まちまちでした… 教えて頂いたのに申し訳ないです。

その他の回答 (4)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.4

大切な事を忘れていました。 改行を入れるのは、すでに出来上がった帳票ですか。 それとも、帳票に入力しながら条件に当てはまった時に改行を入れたいのですか。

s1194
質問者

補足

ありがとうございます。 A列、D列ともに空白はなしです。 出来上がった帳票で、あとは印刷範囲と改ページを入れるだけの状態です。 何度もすみませんが、 よろしくお願い致します。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.3

A列とD列のデータの途中に空白セルはありますか?

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.2

「D列の数値が3回変わったら」という表現が分かり難いです。 例えば、D2のデータが3回変わるということなのか、D列のどこかが3回変わるということなのか、D列を上から順に見た時に異なる値が3回見つかったらか・・・など解釈がたくさんあります。

s1194
質問者

補足

回答ありがとうございます。 説明不足で申し訳ないです。 D列を上から順に見た時に、異なる値が3回見つかったら改ページを入れたい、ということです。 A列についても、上から順に見た時に異なる値が見つかったら改ページを入れたいです。 最優先がA列になるようにしたいです。 よろしくお願い致します。

  • kon555
  • ベストアンサー率51% (1845/3565)
回答No.1

 vbaで改ページする方法 https://www.sejuku.net/blog/88251  表の先頭行から最終行まで処理を繰り返す処理 https://excel-ubara.com/excelvba1r/EXCELVBA506.html 『D列の数値が3回変わったら改ページを入れたいのですが、A列の数値が変わったらD列の数値が1回しか変わってなくても改ページを入れたいです。』  というのはif文の条件分岐で実現できます。方法は色々あるでしょうが、私なら判定用の変数2つたてて、OR条件で判定すると思います。 https://www.forguncy.com/blog/20180925_vbaandornot  あとは参考になりそうなマクロなどを https://oshiete.goo.ne.jp/qa/6920277.html  これで多分組めると思いますので、頑張ってみて下さい。

s1194
質問者

お礼

回答ありがとうございます。 どのサイトも参考になりそうなので、しっかり読んでやってみたいと思います。 ありがとうございます。

関連するQ&A

専門家に質問してみよう