質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

2478閲覧

レポートで一番右端から始まる時だけ、空白を挿入したい。

kanda_ryuichi

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/10/14 15:14

編集2020/10/15 02:58

前提・実現したいこと

ACCESS 2016です。VBAはあまり詳しくありませんが多少は理解しています。
客先に納品する箱に客先指定バーコードシール(以下シールと書きます)を貼るために、シールのpdfをACCESSで発行しています。
シールの大きさが指定されている関係で、A4サイズ1枚に9枚のシールを3列x3段で出力したいので、レポートのページ設定で列数=3を設定し、印刷方向は上から下への設定です。
現在、シールpdfは問題なく発行出来ていて、pdfを全面シールに印刷しハサミでカットし箱に貼付けしています。
1箱に貼るシールは、1枚または2枚で、3枚以上はありません。1枚と2枚はランダムに出現します。レコードソースの[印刷データ]クエリの[箱のシール枚数]フィールドに、1または2が入力済みです。
イメージ説明
現在のシールは、図の1,2,3,4,5,の順に印刷されますが、1箱に2枚貼る場合のシールが、例えば3(左列)から始まる場合に3と4に分かれてしまいます。
1箱に2枚貼る場合は、3を空白にして4-5に印刷したいです。
レポートのページフォーマット時にvbaを書いて、
[箱のシール枚数]=2 and 印刷位置が3,6,9の時に、空白を挿入することで、4,7,1から印字するようにするには、どうすればよろしいですか?
先ず、印刷位置が何番なのか取得する方法がわかりません。
教えて下さい。
宜しくお願いします。

10/15 09:58追記
改段プロパティがあることを教えていただき始めて知りました。
[箱のシール枚数]=2 の時に改段するvbaを書いてみましたが、使い方が正しくないようです。

発生している問題・エラーメッセージ

実行時エラー2136
このプロパティを設定するには、フォームまたはレポートをデザインビューで開きます。
エラー画面です。

該当のソースコード

Private Sub Report_Page()
If [箱のシール枚数] = 2 Then
Me.Section(acDetail).NewRowOrCol = 0
End If
End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自力解決ではありません。
お助けいただいた情報により解決出来ました。
コードを共有します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If Me.Left > 7000 And [箱のシール枚数] = 2 And [箱のシール枚数分子] = 1 Then
Me.NextRecord = False
Me.PrintSection = False
End If
End Sub

投稿2020/10/15 09:33

kanda_ryuichi

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この質問内容ではコードの製作依頼になってますので、まずは自分でできるところまでコードを書いてみましょう。
といっても難しいと思いますので、ヒントだけ出しておきます。

1.[箱のシール枚数] が2の時、2枚出力する方法

1.a. VBAを使う方法
セクションのフォーマット時に Me.NextRecord=False とすることで次レコードへ移動しないので、同じレコードを続けて印刷できます。FormatCount引数で同じレコードを何回印刷したかを取得できますので、FormatCount < [箱のシール枚数]のとき Me.NextRecord=False とすれば、シール枚数まで繰り返し出力されます。

NextRecord プロパティ (Access) | Microsoft Docs

1.b. クエリを使う方法

数値型フィールドに 1 と 2 の2レコードを持つテーブルを作成する。

テーブル名 T_Num
フィールド名 Num 数値型

これをレポートのrecordソースクエリに追加する(結合はさせない)。
Numフィールドの抽出条件に
<=[箱のシール枚数]
と設定する。
これで指定したシール枚数分繰り返し出力されます。

2.いま何列目を出力するのかを取得する方法
モジュールレベル変数を宣言する。
フォマット時イベントでその変数に1加算する。
改段したら 1 に戻す。

3.シール枚数2の場合に2枚のシール間が改段されないようにする方法

3.a. 枚数2のレコードが3列目にくるときは、空白を挿入する

空白の出力は、フォーマットイベントで
Me.NextRecord = False
Me.PrintSection = False
とすることで空白を出力することが可能です。

3.b. 枚数2のレコードが3列目にくるときは、強制改段させる
NewRowOrColプロパティで改段を制御できます。

NewRowOrCol プロパティ (Access) | Microsoft Docs

以上を組み合わせてコードを書いてみてください。それでうまくいかないなら、できたところまでのコードを提示してうまくいかない部分を質問してください。

おまけ

もしデータの出力順を変更してもいいのなら、
枚数2のデータが連続すると、3列目の空白も連続することになり、用紙が無駄になる。
枚数1のレコード内で連番を取得(入力)
枚数2のレコード内で連番を取得(入力)
としておいて、この連番で並び替えを設定しておけば、

1列目 2列目 3列目
枚数1 枚数2 枚数2
枚数1 枚数2 枚数2
・・・

というように出力されて空白シールが最小限にできます。

グループ毎の連番は下記を参考に。

グループ毎連番を自動入力する関数 - hatena chips

サンプルコード追記

簡単なサンプルを作成してみました。

複数シールの出力は下記の方法にしました。
1.b. クエリを使う方法

レポートのレコードソースのクエリは下記になります。
テーブル1は実際のテーブル名にしてください。

sql

1SELECT テーブル1.*, T_Num.Num FROM テーブル1, T_Num 2WHERE T_Num.Num<=[箱のシール枚数];

また、現在何列目かは、Me.Left で取得する方法にしました。
Me.Left で用紙の左からの距離を取得できます。

詳細セクションのフォーマット時に下記のように記述すると、イミディエイトウィンドウに結果が出力されます。

vba

1Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) 2 Debug.Print Me.Left 3End Sub

イミディエイトの結果(印刷設定で変わります。)

360 3951 7542 360 3951 7542

3列目は左から7542(TWIPS)の位置ということになります。(567TWIPS≒1cm)

レポートの「グループ化と並び替え」で下記の順で並び替えを昇順に設定します

  • 顧客コード(テーブルの主キーフィールド名)
  • Num

あとは詳細セクションのフォーマット時のイベントプロシージャを下記のように記述します。

vba

1Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) 2 If Me.Left > 7000 And Me.Num = 1 And Me.箱のシール枚数 = 2 Then 3 Me.NextRecord = False 4 Me.PrintSection = False 5 End If 6End Sub

3列目判定は余裕をもって Me.Left > 7000 としましたが、Debug.Print Me.Left の結果を元に調整してください。

投稿2020/10/14 21:35

編集2020/10/15 07:01
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanda_ryuichi

2020/10/15 01:35

色々とありがとうございます。 一度にすべては無理なので、先ずはNewRowOrColプロパティのVBAを書いてみましたが、動きません。 Private Sub Report_Page()に書いても動かず。 Private Sub 詳細_Format()に書いても動かず。 構文が間違っているように思いますがわかりません。 ForceNewPageなら動くのですが、同じ構文でNewRowOrCol に変えるとエラーになります。 VBA構文とエラーメッセージは、質問に追記しました。 宜しくお願いします。
hatena19

2020/10/15 01:46

実装する順番としては、まず 1.[箱のシール枚数] が2の時、2枚出力する方法 の方からでしょう。 それができて、3列目に[箱のシール枚数] が2のレコードのとき、 詳細セクションのフォーマット時で NewRowOrCol = 1 としてください。 回答のリンク先にもありますが、NewRowOrCol = 0 は改段なしです。 1 は「カレントセクションの前」で改段です。
kanda_ryuichi

2020/10/15 02:57

ありがとうございます。 1.[箱のシール枚数] が2の時、2枚出力する方法 これは既に実装済みです。 3.b. NewRowOrColプロパティ NewRowOrCol = 0でも、1でも、2でも、3でもエラーで動きません。 構文が間違っていると思います。 エラー写真を質問に貼りました。
kitasue

2020/10/15 03:13

横から失礼いたします。 現在、[箱のシール枚数] が2の時、2枚出力するのは出来ているのですよね。 あとは、[箱のシール枚数] が2の時、これから印刷しようとしているのが、 そのうちの1枚目なのか、2枚目なのかを知らないといけないと思うのですが、 それを知ることのできる項目はありますか?
hatena19

2020/10/15 04:06

エラーメッセージを見ると NewRowOrCol はデザインビューでしか変更できないようですね。 ならば、 3.a. 枚数2のレコードが3列目にくるときは、空白を挿入する の方法を使ってください。
kanda_ryuichi

2020/10/15 09:30

hatena19様 詳しくご説明いただき、ありがとうございます。 イミディエイトウィンドウが理解出来ていないので、 MsgBox (Me.Left) にて取得したら、338, 4053, 7768、でした。 お陰様で出来ました。 完成したコードをアップします。 ありがとうございました。 kiasue様 ありがとうございます。 はい。2枚出力出来ています。 クエリの[箱のシール枚数]で2枚あることがわかります。 [箱のシール枚数分子]で1枚目か2枚目かわかります。 ありがとうございました。
kanda_ryuichi

2020/10/15 09:36

hatena19様 ごめんなさい。 ベストアンサーをつけたいと考えておりましたが、自己解決のところにコードを投稿したら、ベストアンサーが付けられなくなってしまいました。 本当にごめんなさい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問