今回は、葉書を作成します。 この住所録には、現住所・会社住所・実家の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
これで、印刷フォームから印字するためのレポートが完成しました。次回は、印刷フォームのプログラムを考えます。