次の方法で共有

ACCESS2010 複数のレポートを共通の連番で順番に印刷する方法

Anonymous
2017-02-16T05:33:27+00:00

お世話になります。

アクセス2010を使っているのですが

2種類のレポート(それぞれ全く違うレイアウトです)があって共通の連番が振られているとします。

例えばレポートAは1,2,4,6,7,9、Bは3,5,8の番号が振られているとします。

*元は一つのテーブルですが、データの内容で選択クエリによってA,Bに分けています。

現在はAのレポートを印刷して、次にBのレポートを印刷して手作業でA1、A2、B3、A4、B5、A6、A7、B8、A9と並び替えています。

印刷の設定でこの2種類のレポートをA1、A2、B3、A4、B5、A6、A7、B8、A9という順番に印刷することは可能でしょうか?

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

7 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2017-02-21T07:43:51+00:00

    解決済みですが、

    こんな方法もあるということで、

    回答致します。

    > *元は一つのテーブルですが、データの内容で選択クエリによってA,Bに分けています。

    ということなので、元のテーブルから、レポートウィザードでレポートを作成します。

    表示するフィールドは連番のみ、並べ替えも連番を指定します。

    このレポートの詳細セクションに、レポートAとレポートBをサブレポートとして配置します。

    サブレポートコントロールのリンク親フィールド、リンク子フィールドは「連番」にします。

    「印刷時拡張」、「印刷時縮小」プロパティも「はい」にします。

    メインレポートの詳細セクションの「改ページ」を「カレントセクションの後」にします。

    また、「連番」テキストボックスの「可視」は「いいえ」にします。

    これで、このメインポートを印刷すれば希望の順でレポートA,レポートBが印刷されます。

    リンク親フィールド、リンク子フィールドを「連番」にしているので、

    連番が合致しないサブレポートはレコード件数が0になり、「印刷時縮小」で高さが0になり表示されません。

    よって連番が存在する方のサブレポートのみの印刷されます。

    この方法のメリットは印刷するレポートが一つで済むということです。

    1000の連番があった場合、1000のプリントタスクを一気にプリンターに送るのはちょっと不安があります。

    この回答は役に立ちましたか?

    3 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Makapu 92,110 評価のポイント ボランティア モデレーター
    2017-02-20T14:50:47+00:00

    もりしんさん、こんにちは。

    以下は[クエリA]と[クエリB]のそれぞれのレコードを昇順に読み、[連番]の若い方から順番にそれぞれのレポートを印刷します。

    [クエリA][クエリB]それぞれに数値型の[連番]フィールドを持ち、[連番]で昇順に並んでいるとします。

    また、[クエリA][クエリB]の[連番]は重複しないとします。

    [レポートA]は[クエリA]をレコードソースとし、[レポートB]は[クエリB]をレコードソースにしており、それぞれのレポートに[連番]テキストボックスを設置し、レポートの[連番]はそれぞれのクエリの[連番]と連結しているとします。

    ※テストする時は10レコード以内の少ないレコードでお試しください。

    ツール > 参照設定 で「Microsoft AciveX Data Objects 6.1 Library」にチェックを入れて下さい。

    <追記>

    Access2016で作ったのでAccess2010だと「Microsoft AciveX Data Objects 2.X Library」かも。

    また、Access2010の環境は無いのでテスト出来ないです。

    上手く動かなかったらごめんなさい。

    Private Sub 印刷_Click()

    On Error GoTo MSG1

    Dim cn As ADODB.Connection

    Dim rs As ADODB.Recordset

    Dim ds As ADODB.Recordset

    Dim WkRepName As String

    Dim WkNo As Long

    Dim FlgA As Integer

    Dim FlgB As Integer

    Dim ans As Integer

    ans = MsgBox("印刷を開始します。よろしいですか?", vbYesNo + vbQuestion, "印刷")

    If ans = vbNo Then

        Exit Sub

    End If

    FlgA = False

    FlgB = False

    Set cn = CurrentProject.Connection

    Set rs = New ADODB.Recordset

    rs.Open "クエリA", cn, adOpenForwardOnly, adLockReadOnly

    If rs.EOF Then

        FlgA = True

    End If

    Set ds = New ADODB.Recordset

    ds.Open "クエリB", cn, adOpenForwardOnly, adLockReadOnly

    If ds.EOF Then

        FlgB = True

    End If

    Do While FlgA = False And FlgB = False

        If rs![連番] < ds![連番] Then

            WkRepName = "レポートA"

            WkNo = rs![連番]

            DoCmd.OpenReport WkRepName, acViewNormal, , "[連番]=" & WkNo

            'Debug.Print "WkRepName:" & WkRepName & " WkNo:" & WkNo

            rs.MoveNext

            If rs.EOF Then

                FlgA = True

            End If

        Else

            WkRepName = "レポートB"

            WkNo = ds![連番]

            DoCmd.OpenReport WkRepName, acViewNormal, , "[連番]=" & WkNo

            'Debug.Print "WkRepName:" & WkRepName & " WkNo:" & WkNo

            ds.MoveNext

            If ds.EOF Then

                FlgB = True

            End If

        End If

    Loop

    If FlgA = False Then

        Do While rs.EOF = False

            WkRepName = "レポートA"

            WkNo = rs![連番]

            DoCmd.OpenReport WkRepName, acViewNormal, , "[連番]=" & WkNo

            'Debug.Print "WkRepName:" & WkRepName & " WkNo:" & WkNo

            rs.MoveNext

            If rs.EOF Then

                GoTo End_Rtn

            End If

        Loop

    End If

    If FlgB = False Then

        Do While ds.EOF = False

            WkRepName = "レポートB"

            WkNo = ds![連番]

            DoCmd.OpenReport WkRepName, acViewNormal, , "[連番]=" & WkNo

            'Debug.Print "WkRepName:" & WkRepName & " WkNo:" & WkNo

            ds.MoveNext

            If ds.EOF Then

                GoTo End_Rtn

            End If

        Loop

    End If

    End_Rtn:

        ds.Close: Set ds = Nothing

        rs.Close: Set rs = Nothing

        cn.Close: Set cn = Nothing

        Exit Sub

    MSG1:

        Call MsgBox(Err.Number & ":" & vbCr & Err.Description & vbCr & vbCr & "エラーが発生しました。", vbCritical, "エラー")

        GoTo End_Rtn

    End Sub

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. Anonymous
    2017-02-21T02:29:14+00:00

    Makapuさん

    ありがとうございます!!!!

    できました。ホントにすごいです。心の底から尊敬します!!!

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2017-02-20T05:45:09+00:00

    回答ありがとうございます!

    ただ、このやり方だとA.Bには毎回決まった連番しかダメな気がします。A.Bは毎回データによって決まるので、連番とA.Bの関係は固定ではありません。

    また、連番は1000以上になるため、1行づつコマンドを書くのはちょっとキビシイです。

    なにかいい方法はありませんでしょうか?

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  5. Makapu 92,110 評価のポイント ボランティア モデレーター
    2017-02-19T11:16:12+00:00

    こんにちは。

    例)レポートの名前 [レポートA] [レポートB] それぞれに[連番]という名前のテキストボックスに数値で番号が表示されているとします。([連番]の数値はそれぞれのクエリの[連番]フィールドと連結されている)

    フォームにボタンを設置します。(ここでは例としてボタンの名前を[印刷]とします。)

    [印刷]ボタンのプロパティシートを開き、「イベント」タブ > 「クリック時」から「イベントプロシージャ」を選択し、VBAの画面を出して以下のコードを貼り付けます。

    Private Sub 印刷_Click()

    'A1、A2、B3、A4、B5、A6、A7、B8、A9

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 1"

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 2"

        DoCmd.OpenReport "レポートB", acViewNormal, , "[連番]= 3"

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 4"

        DoCmd.OpenReport "レポートB", acViewNormal, , "[連番]= 5"

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 6"

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 7"

        DoCmd.OpenReport "レポートB", acViewNormal, , "[連番]= 8"

        DoCmd.OpenReport "レポートA", acViewNormal, , "[連番]= 9"

    End Sub

    フォームで[印刷]ボタンをクリックすると、一連のレポートが順番に印刷されます。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません