Step 21 葉書の作成

今回は、葉書を作成します。 この住所録には、現住所・会社住所・実家の3種類の住所が登録できるようになっております。 また、家族登録も出来るようになっていますので、連名で宛名を印字する必要もあります。 下の図は、同じ人を連名で出した場合と会社住所で出した場合のものです。 印字する内容によって表示する場所を変化させる必要があります。

図21−1

図21−2

<@郵便番号>
機能:郵便番号を一桁ずつ表示します。
コントロール プロパティ
テキストボックス コントロールソース =Left([郵便番号],1)
テキストボックス コントロールソース =Mid([郵便番号],2,1)
テキストボックス コントロールソース =Mid([郵便番号],3,1)
テキストボックス コントロールソース =Mid([郵便番号],4,1)
テキストボックス コントロールソース =Mid([郵便番号],5,1)
テキストボックス コントロールソース =Mid([郵便番号],6,1)
テキストボックス コントロールソース =Mid([郵便番号],7,1)

<A住所>
機能:住所を表示しますが、非可視にしておき、実際は、Cに表示します。
コントロール プロパティ
テキストボックス 名前 txtHide住所1
コントロールソース 住所1
テキストボックス 名前 txtHide住所2
コントロールソース 住所2
テキストボックス 名前 txtHide番地
コントロールソース 番地

例えば、非常に長い住所の場合、1行では、印字し切れなくて2行になってしまいます。 普通のやり方で表示すると上から番地の途中が表示されるようになってしまい、あまり見栄えが良くありません。 それでは、住所と番地を分けて表示すると今度は、短い住所のときの見栄えが良くありません。 短い住所のときは、住所と番地を1行で表示するようにして、長い住所のときは、2行に分けて表示するようにします。 また、アパートやマンションなども住所が1行のときは、2行目に表示し、住所が2行のときは、3行目に表示するようにします。

実は、住所だけでなく、後で出てくる会社名や部署も長さによって1行で終わらせたり2行にしたりします。そのとき住所が何行使っているかによって印字するテキストボックスを変えたりしています。

<B会社>
機能:会社名と部署を表示しますが、非可視にしておき、実際は、Cに表示します。
コントロール プロパティ
テキストボックス 名前 txtHide会社
コントロールソース 会社名
テキストボックス 名前 TxtHide部署
コントロールソース 部署

<C宛先>
機能:住所、会社名、部署名を表示します。
コントロール プロパティ
テキストボックス 名前 txt宛先1
テキストボックス 名前 txt宛先2
テキストボックス 名前 txt宛先3
テキストボックス 名前 txt宛先4
テキストボックス 名前 txt宛先5

<D役職>
機能:役職を表示します
コントロール プロパティ
テキストボックス 名前 txt役職
コントロールソース 役職

<E宛名>
機能:宛名を表示します。
コントロール プロパティ
テキストボックス 名前 txt氏名1
コントロールソース =[姓] & " " & [名1]
テキストボックス 名前 txt氏名2
コントロールソース 名2
テキストボックス 名前 txt氏名3
コントロールソース 名3
テキストボックス 名前 txt氏名4
コントロールソース 名4
テキストボックス 名前 txt氏名5
コントロールソース 名5

連名で表示するときの印字位置にも気を使う必要があります。 2名までならば特に問題は、無いと思いますが、3人以上となると、印字位置を右にずらしてあげないと、見栄えが良くありません。

<F改ページ>
宛名などが長くなってしまうと次のページの印字開始位置がずれてしまいます。 そうならないように改ページするようにしておきます。

<Gレポート>
コントロール プロパティ
レポート レコードソース Wkはがき

宛先、宛名は状況によって印字ボックスを変えたり印字位置を変えたりします。そのプログラムは、詳細セッションの[フォーマット時]プロパティのイベントプロシージャで行います。

プログラムは、次のようになります。

01:Private Sub 詳細1_Format(Cancel As Integer, FormatCount As Integer)
02:On Error GoTo Err_詳細1_Format
03:    If LenMbcs(Me.txtHide住所1 & Me.txtHide番地) > 36 Then
04:        Me.txt宛先1 = Me.txtHide住所1
05:        Me.txt宛先2 = Me.txtHide番地
06:        Me.txt宛先2.TextAlign = 3
07:        Me.txt宛先3 = Me.txtHide住所2
08:    Else
09:        Me.txt宛先1 = Me.txtHide住所1 & Me.txtHide番地
10:        Me.txt宛先2 = Me.txtHide住所2
11:        Me.txt宛先2.TextAlign = 0
12:        Me.txt宛先3 = Null
13:    End If
    
14:    Select Case Form_印刷.grp住所
15:        Case 1
16:            subSetPresent '現住所
17:        Case 2
18:            subSetCompany '会社住所
19:    End Select
20:Err_詳細1_Format:
21:End Sub
3行目から13行目で宛先を設定しています。3行目で“住所1”と“番地”を合わせた文字の長さが36文字以上の場合は、“txt宛先1”、“txt宛先2”、“txt宛先3”にそれぞれ“住所1”、“番地”、“住所2”を表示します。短い場合は、“txt宛先1”に“住所1”、“番地”を合わせて表示します。

番地は、先頭から表示すると見栄えが悪いので“住所1”より低くしたいと思います。6行目で“.TextAlign = 3”として“中央揃え”に設定します。11行目は、逆に規定値に戻しています。

3行目の“LenMbcs()”は半角文字で何文字になるかを調べるプログラムで、14行目以降が住所の宛先、宛名をどの位置に印字するかを設定するプログラムです。

それでは、一つ一つ見てみます。

'概要:半角文字での文字数を求める
Public Function LenMbcs(ByVal str As String)
    LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

このプログラムは、Accessのヘルプで紹介されているものをそのまま持ってきています。例えば“ABc”という文字列で“A”と“B”は全角文字で“c”は半角文字の時、“Len("ABc")”は文字数として 3 が返され、“LenB("ABc")”は、6が返されます。これでは、全角と半角が混ざった時、全角と半角の文字数によって返される文字数が変わってしまいます。そこで半角文字に換算した時の長さを求める必要があります。“StrConv(str, vbFromUnicode)”でユニコードに変換しその長さを求めています。

次が現住所の宛先を印字するときの宛名の位置を設定するプログラムです。

01:'概要:現住所を印字するときの宛名の位置を設定する。
02:Private Sub subSetPresent()
03:    Dim bCnt As Byte
04:    Dim i  As Byte
    
05:    bCnt = 0
06:    For i = 1 To 5
07:        If Not IsNull(Me("txt氏名" & i)) Then
08:            bCnt = bCnt + 1
09:        End If
10:    Next
11:    Select Case bCnt
12:        Case 3
13:            Me.txt氏名1.Left = 2566
14:            Me.txt氏名2.Left = 1981
15:            Me.txt氏名3.Left = 1396
16:        Case 4
17:            Me.txt氏名1.Left = 2736
18:            Me.txt氏名2.Left = 2151
19:            Me.txt氏名3.Left = 1566
20:            Me.txt氏名4.Left = 981
21:        Case 5
22:            Me.txt氏名1.Left = 2906
23:            Me.txt氏名2.Left = 2321
24:            Me.txt氏名3.Left = 1736
25:            Me.txt氏名4.Left = 1151
26:            Me.txt氏名5.Left = 566
27:        Case Else
28:            Me.txt氏名1.Left = 2340
29:            Me.txt氏名2.Left = 1755
30:    End Select
31:End Sub

6行目から10行目で宛名がいくつ表示されているかを調べています。この個数によって11行目以降でそれぞれの宛名の印字位置を決めます。単位は、twipです。Accessで使われている画面上の長さの基本単位で1理論cmが567twipです。つまり、左から1cmのところに表示したいときは、”.Left=567”となります。

次が会社住所を印字するときの会社名、部署を印字する宛先のテキストボックスと役職、氏名の印字位置を設定するプログラムです。

'概要:会社住所を印字するときの会社名、部署、役職の印字位置の設定
Private Sub subSetCompany()
    If LenMbcs(Me.txtHide会社 & Me.TxtHide部署) > 36 Then
        If IsNull(Me.txt宛先3) Then
            Me.txt宛先3 = Me.txtHide会社
            Me.txt宛先4 = Me.TxtHide部署
            Me.txt宛先5 = Null
        Else
            Me.txt宛先4 = Me.txtHide会社
            Me.txt宛先5 = Me.TxtHide部署
            Me.txt宛先5.Left = 2948
        End If
    Else
        Me.txt宛先4 = Me.txtHide会社 & " " & Me.TxtHide部署
        Me.txt宛先5 = Null
    End If
    
    If Not IsNull(Me.txt宛先5) And Not IsNull(Me.txt役職) Then
        Me.txt役職.Left = 2518
        Me.txt氏名1.Left = 1927
    Else
        Me.txt役職.Left = 2948
        Me.txt氏名1.Left = 2340
    End If

End Sub

これで、印刷フォームから印字するためのレポートが完成しました。次回は、印刷フォームのプログラムを考えます。

<Topへ >   <前へ >   <次へ >


このサイトに関するご感想などについては、(佐藤)まで電子メールでお送りください。 ただし、添付ファイルがある場合は、内容を確認せずに削除させて頂いておりますのでご了承ください。
Copyright (C) 株式会社アニシス