Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

Access タックシールの有効利用

タックシールを使って宛名の印刷をすると、シート1枚すべてのシールを丁度使い切ることはなく、ほとんどの場合余りがでます。
余ったシールを印刷しようとすると使用した分の空白レコードが必要になります。この空白レコードをACCESSのSQLで実現してみました。

SQLは UNION 句を使います。空レコードのレコード数だけ UNION 句で追加します。
また、別な方法も後日試したいと思います。

Access テーブル「名簿」の作成

フィールド「ID」「住所」「氏名」の極簡易なテーブルです。

Access フォーム「名簿」の作成

フォームのフォーマット

テキストボックスを3個配置します。テキストボックスの名前とデータは「ID」「住所」「氏名」としています。

イベントの作成

イベントの作成は、名簿アイコン(下画像の左上)の下黒の■を右クリックして表示されたメニューの下「フォームのプロパティ」を左クリックすると、プロパティシートが右に開きます。
タブ「イベント」を左クリックして、表示されたメニューの「読み込み時」の右にある「…ボタン」の左隣のボタンをクリックして「イベントプロシージャ」を選択後「…ボタン」をクリックするとコード入力フォームが開きます。

コード入力

copy

Private Sub Form_Load()
    Dim mysql               As String
    Dim Res                 As Variant
    Dim I                   As Long

    Res = InputBox("使用済みの枚数", "入力")

    For I = 1 To Res
    mysql = mysql & "(SELECT "
    mysql = mysql & -I & " AS NUM"
    mysql = mysql & ", '' AS ID"
    mysql = mysql & ", '' AS 住所"
    mysql = mysql & ", '' AS 氏名"
    mysql = mysql & " FROM 名簿)"
    mysql = mysql & " UNION "
    Next I
    mysql = mysql & "(SELECT "
    mysql = mysql & "ID AS NUM"
    mysql = mysql & ", ID "
    mysql = mysql & ", 住所"
    mysql = mysql & ", 氏名"
    mysql = mysql & " FROM 名簿);"
    
    Me.RecordSource = mysql

End Sub

空レコードの SQL は元のテーブル「名簿」にないフィールド NUM を値 -I (レコードで値が異なる)で追加しています。値が異ならないとグループ化されて1レコードしか追加できません。
結果はソートされますので、空レコードを先頭部分にするため空レコードのSQLの NUM は – の値にし、本データの NUM の値は ID にしています。

フォームのオープン

入力フォームの表示

コード入力後、フォーム「名簿」をオープンしてみます。入力フォームが開くので枚数を入力します。

例では5を入力しています。OKボタンをクリックして進みます。

SQLをレコードソースにセット

5行空白レコードができました。

プロシージャのコードを修正

インプットボックスに入力される値は、期待されるものと違うものが入力されることがあるので、チェックを設けます。

copy

Option Compare Database
Option Explicit

Private Sub Form_Load()
    Dim mysql               As String
    Dim Res                 As String
    Dim I                   As Long

    Res = InputBox("使用済みの枚数", "入力")

    mysql = ""
    If StrPtr(Res) = 0 Or Res = "" Then
        '何もしません
    ElseIf Not IsNumeric(Res) Then
        '何もしません
    ElseIf Int(Res) = 0 Then
        '何もしません
    Else
        For I = 1 To Res
            mysql = mysql & "(SELECT "
            mysql = mysql & -I & " AS NUM"
            mysql = mysql & ", '' AS ID"
            mysql = mysql & ", '' AS 住所"
            mysql = mysql & ", '' AS 氏名"
            mysql = mysql & " FROM 名簿)"
            mysql = mysql & " UNION "
        Next I
        mysql = mysql & "(SELECT "
        mysql = mysql & "ID AS NUM"
        mysql = mysql & ", ID "
        mysql = mysql & ", 住所"
        mysql = mysql & ", 氏名"
        mysql = mysql & " FROM 名簿);"
    End If

    If mysql = "" Then
        mysql = mysql & "SELECT "
        mysql = mysql & "ID AS NUM"
        mysql = mysql & ", ID "
        mysql = mysql & ", 住所"
        mysql = mysql & ", 氏名"
        mysql = mysql & " FROM 名簿;"
    End If

    Me.RecordSource = mysql

End Sub