- ベストアンサー
マクロを使った改ページについて
A列に店番(数値)、D列に伝票番号(数値)が入っていて、毎回行数は変わります。 D列の数値が3回変わったら改ページを入れたいのですが、A列の数値が変わったらD列の数値が1回しか変わってなくても改ページを入れたいです。 A列の数値が変わったら必ず改ページ、 D列の数値が3回変わったら改ページ、 これを同時に行えるマクロの書き方を教えてください。 わかりずらい文章で申し訳ないですが、 よろしくお願い致します。
- みんなの回答 (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
その他の回答 (4)
- masnoske
- ベストアンサー率35% (67/190)
大切な事を忘れていました。 改行を入れるのは、すでに出来上がった帳票ですか。 それとも、帳票に入力しながら条件に当てはまった時に改行を入れたいのですか。
補足
ありがとうございます。 A列、D列ともに空白はなしです。 出来上がった帳票で、あとは印刷範囲と改ページを入れるだけの状態です。 何度もすみませんが、 よろしくお願い致します。
- masnoske
- ベストアンサー率35% (67/190)
A列とD列のデータの途中に空白セルはありますか?
- masnoske
- ベストアンサー率35% (67/190)
「D列の数値が3回変わったら」という表現が分かり難いです。 例えば、D2のデータが3回変わるということなのか、D列のどこかが3回変わるということなのか、D列を上から順に見た時に異なる値が3回見つかったらか・・・など解釈がたくさんあります。
補足
回答ありがとうございます。 説明不足で申し訳ないです。 D列を上から順に見た時に、異なる値が3回見つかったら改ページを入れたい、ということです。 A列についても、上から順に見た時に異なる値が見つかったら改ページを入れたいです。 最優先がA列になるようにしたいです。 よろしくお願い致します。
- kon555
- ベストアンサー率51% (1845/3565)
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 これで多分組めると思いますので、頑張ってみて下さい。
お礼
回答ありがとうございます。 どのサイトも参考になりそうなので、しっかり読んでやってみたいと思います。 ありがとうございます。
お礼
すみません!! できました!!! ありがとうございますm(_ _)m とても助かりました。 マクロの勉強を始めたばかりで知らないコードばかりでしたが、勉強になりました。 ありがとうございます。
補足
上手く出来なかったです。。 改ページは挿入されたのですが、D列が3回変わったら、のところが1回で改ページが入っていたり、3回で入っていたり、まちまちでした… 教えて頂いたのに申し訳ないです。