メールマガジン【アクセスで作るシリーズ】
バックナンバー 【住所録ソフト編】 Vol.37
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【住所録ソフト編】
発 行 : Yoshihisa Fukuda 2002.11.23 Vol.37
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は、プログラム解説の続きです。
______________________________________
□ 宛名印刷レポート 宛名住所漢数字変換(AddrConv)関数
Private Function AddrConv(Addr As String) As String
Dim EditAddr As String
Dim Char As String
Dim I As Integer
Dim Cnt As Integer
EditAddr = ""
For I = 1 To Len(Addr)
Char = Mid$(Addr, I, 1)
Cnt = InStr(1, ConvStr_A, Char, vbBinaryCompare)
If Cnt > 0 Then
EditAddr = EditAddr & Mid$(ConvStr_B, Cnt, 1)
Else
EditAddr = EditAddr & Char
End If
Next I
AddrConv = EditAddr
End Function
【解説】
1~3行目は変数の宣言です。
EditAddr 、Char と言う変数を文字列型で、I 、Cnt と言う変数を整数型で定義
しています。
6行目は EditAddr 変数に長0の文字列("")を代入しています。
8行目の For 文により、18行目の Next I までの処理を、宛名住所の文字数文
繰り返し行います。
9行目の Char = Mid$(Addr, I, 1) では、宛名住所(Addr変数)のI 番目の値を
1文字取り出し、Char 変数に代入します。
I は、宛名住所の1文字目から宛名住所の文字数分、順次+1されていきますので
取り出される文字(Char)は、宛名住所の先頭から1文字ずつとなります。
10行目の Cnt = InStr(1, ConvStr_A, Char, vbBinaryCompare) は、Instr関数を
用いて、文字列の検索を行います。
ConvStr_A と言う変数の文字列の中から、Char変数の値(宛名住所の1文字)を
検索し、あればCnt 変数に、その文字位置が代入されます。
検索した結果、該当する文字が無かった場合、Cntには0が代入されます。
12行目のIf 文では、Cnt変数の値が0より大きい(10行目の文字列検索で該当
文字があった)場合、13行目の処理を、Cnt変数が0以下の(10行目の文字列
検索で該当文字が無かった)場合、15行目の処理を行います。
13行目の EditAddr = EditAddr & Mid$(ConvStr_B, Cnt, 1) は、ConvStr_B変数
のCnt番目の値を1文字取り出して、EditAddr変数と文字列結合した結果をEditAddr
変数へ代入しています。
ConvStr_B変数のCnt番目の値とは、10行目で検索した文字に該当する漢数字に
なります。
モジュールウィンドウの先頭で
Const ConvStr_A As String = "1234567890-"
Const ConvStr_B As String = "一二三四五六七八九〇ー"
の ConvStr_A 、ConvStr_B の2つの変数を宣言していますが、宛名住所の1文字を
取り出して、ConvStr_A の文字列を検索し該当文字の位置を求めます。
その文字位置と同一の ConvStr_B の文字が漢数字に変換する文字になります。
例えば、数字が5の場合、ConvStr_A 変数の5を検索すると文字位置は5となり
ConvStr_B 変数の5番目の文字、漢数字の五が求まります。
15行目の EditAddr = EditAddr & Char は、EditAddr 変数の文字列と Char 変数
の文字を結合して EditAddr 変数に代入しています。
20行目の AddrConv = EditAddr は、EditAddr 変数の文字列を AddrConv 関数の
戻り値として設定しています。
______________________________________
□ 宛名印刷レポート 宛名住所分割設定(SetAddress)関数
Private Function SetAddress(StrAddr As String)
Dim xySize As Size
Dim Addr1 As String
Dim Addr2 As String
Dim Addr3 As String
Dim Addr4 As String
Dim FSize As Integer
Me.Address_sub1 = Null
Me.Address_sub2 = Null
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Me.Address_sub1 = StrAddr
Exit Function
End If
If AddrDivi(Me.ZipCode, StrAddr, Addr1, Addr2, Addr3, Addr4, "ZipCodeTable") Then
Me.Address_sub1 = Addr1
For FSize = Me.Address_sub1.FontSize To 8 Step -1
Me.Address_sub1.FontSize = FSize
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Exit For
End If
Next FSize
Else
StrAddr = Addr1 & Addr2 & Addr3
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Me.Address_sub1 = Addr1 & Addr2 & Addr3
Me.Address_sub2 = Addr4
Else
Me.Address_sub1 = Addr1 & Addr2
Me.Address_sub2 = Addr3 & Addr4
End If
End If
End Function
1~6行目は変数の宣言です。
xySize と言う変数をSize型(Size型は、共通ライブラリで定義されている変数の型
です)で、Addr1 、Addr2 、Addr3、Addr4 と言う変数を文字列型で、FSize と言う
変数を整数型で定義しています。
8、9行目で、宛名住所の1行目表示用テキストボックス(Me.Address_sub1)と
2行目表示用テキストボックス(Me.Address_sub2)に Null を代入しています。
11~14行目では、GetTextExtent関数を用いて、宛名住所が1行目表示用テキス
トボックスで表示されたときのサイズを求めています。
StrAddr は、SetAddress 関数の引数で、宛名住所の文字列が設定されています。
その文字列が、1行目表示用テキストボックスで表示された場合のサイズがxySize
変数に代入されます。
GetTextExtent関数でエラーが発生した場合、 "システムエラー"と表示して終了
します。
GetTextExtent関数は共通ライブラリにありますが、アクセス2000をご使用の方
は、ウィザードにより、同様の関数が自動生成されます。
アクセス2000をご使用の方で、共通ライブラリをご使用の方は、自動生成された
GetTextExtent関数を削除して下さい。
共通ライブラリ内の関数の詳細は、後にまとめて行います。
15行目~18行目は、11行目で求めた宛名住所のサイズと1行目表示用テキスト
ボックスのサイズを比較し、宛名住所の文字列が1行目表示用テキストボックスに
全て入る場合、1行目表示用テキストボックスに宛名住所を代入して終了します。
19行目では AddrDivi 関数を用いて、宛名住所を都道府県、市区町村、町域名、
その他の4つに分割しています。
AddrDivi 関数では、郵便番号テーブル(第7引数)のデータを元に分割を行います。
郵便番号テーブルに該当住所が無い場合等、分割が出来なかった場合、この関数は
Trueを返し、正常に分割できた場合、Falseを返します。
この AddrDivi 関数 も共通ライブラリにあり、詳細はまとめて解説します。
20行目~30行目は、分割が出来なかった場合の処理です。
まず、20行目で、1行目表示用テキストボックスに宛名住所を代入します。
21行目~30行目はフォントサイズを-1づつしながら、GetTextExtent関数を
用いて宛名住所が1行目表示用テキストボックスに収まるかチェックします。
宛名住所が1行目表示用テキストボックスに全て収まるフォントサイズになると、
28行目の Exit For で終了します。
32行目~43行目は、宛名住所が分割できた場合の処理です。
まず、32行目で StrAddr 変数に 宛名住所の都道府県(Addr1)、市区町村(Addr2)、
町域名(Addr3)を文字列結合して代入します。
33行目で GetTextExtent関数を用いて、1行目表示用テキストボックスに先ほどの
都道府県+市区町村+町域名を代入した場合のサイズを求めます。
37行目で都道府県+市区町村+町域名が1行目表示用テキストボックスに収まるか
チェックし、収まる場合、1行目表示用テキストボックスに宛名住所の都道府県
(Addr1)、市区町村(Addr2)、町域名(Addr3)を文字列結合して代入し、
2行目表示用テキストボックスに町域名以下のその他(Addr4)を代入します。
都道府県+市区町村+町域名が1行目表示用テキストボックスに収まらない場合
1行目表示用テキストボックスに宛名住所の都道府県(Addr1)、市区町村(Addr2)
を代入し、2行目表示用テキストボックスに町域名(Addr3)、町域名以下のその他
(Addr4)を代入します。
______________________________________
□ お知らせ。
☆ ご質問、お問い合わせに対する、返信の遅延に関して。
最近、ご質問、お問い合わせを多数頂いております。
しかし、現在、仕事が忙しい事もあり、返事が遅れております。
頂いた順番で、順次返信しておりますので、少しの間お待ち下さい。
質問の際、アクセスのバージョン(97、2000等)を必ず明記下さい。
また、内容をできるだけ詳細にお願いします。
あまり、抽象的なご質問ですと、返事に時間がかかる場合がありますので
ご了承下さい。
ご迷惑をお掛けしますが、よろしくお願いいたします。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ ACCESSで作るシリーズ 【住所録ソフト編】
◇ 発 行 元 :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
ご質問等 :fukud@nifty.com
◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
しています。(まぐまぐID:0000077071)
◇ バックナンバー:http://www.fsc-net.com
◇ 登録・解除 :http://www.fsc-net.com
Copyright(C) 2001-2002 Yoshihisa Fukuda All rights reserved.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【住所録ソフト編】
発 行 : Yoshihisa Fukuda 2002.11.23 Vol.37
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は、プログラム解説の続きです。
______________________________________
□ 宛名印刷レポート 宛名住所漢数字変換(AddrConv)関数
Private Function AddrConv(Addr As String) As String
Dim EditAddr As String
Dim Char As String
Dim I As Integer
Dim Cnt As Integer
EditAddr = ""
For I = 1 To Len(Addr)
Char = Mid$(Addr, I, 1)
Cnt = InStr(1, ConvStr_A, Char, vbBinaryCompare)
If Cnt > 0 Then
EditAddr = EditAddr & Mid$(ConvStr_B, Cnt, 1)
Else
EditAddr = EditAddr & Char
End If
Next I
AddrConv = EditAddr
End Function
【解説】
1~3行目は変数の宣言です。
EditAddr 、Char と言う変数を文字列型で、I 、Cnt と言う変数を整数型で定義
しています。
6行目は EditAddr 変数に長0の文字列("")を代入しています。
8行目の For 文により、18行目の Next I までの処理を、宛名住所の文字数文
繰り返し行います。
9行目の Char = Mid$(Addr, I, 1) では、宛名住所(Addr変数)のI 番目の値を
1文字取り出し、Char 変数に代入します。
I は、宛名住所の1文字目から宛名住所の文字数分、順次+1されていきますので
取り出される文字(Char)は、宛名住所の先頭から1文字ずつとなります。
10行目の Cnt = InStr(1, ConvStr_A, Char, vbBinaryCompare) は、Instr関数を
用いて、文字列の検索を行います。
ConvStr_A と言う変数の文字列の中から、Char変数の値(宛名住所の1文字)を
検索し、あればCnt 変数に、その文字位置が代入されます。
検索した結果、該当する文字が無かった場合、Cntには0が代入されます。
12行目のIf 文では、Cnt変数の値が0より大きい(10行目の文字列検索で該当
文字があった)場合、13行目の処理を、Cnt変数が0以下の(10行目の文字列
検索で該当文字が無かった)場合、15行目の処理を行います。
13行目の EditAddr = EditAddr & Mid$(ConvStr_B, Cnt, 1) は、ConvStr_B変数
のCnt番目の値を1文字取り出して、EditAddr変数と文字列結合した結果をEditAddr
変数へ代入しています。
ConvStr_B変数のCnt番目の値とは、10行目で検索した文字に該当する漢数字に
なります。
モジュールウィンドウの先頭で
Const ConvStr_A As String = "1234567890-"
Const ConvStr_B As String = "一二三四五六七八九〇ー"
の ConvStr_A 、ConvStr_B の2つの変数を宣言していますが、宛名住所の1文字を
取り出して、ConvStr_A の文字列を検索し該当文字の位置を求めます。
その文字位置と同一の ConvStr_B の文字が漢数字に変換する文字になります。
例えば、数字が5の場合、ConvStr_A 変数の5を検索すると文字位置は5となり
ConvStr_B 変数の5番目の文字、漢数字の五が求まります。
15行目の EditAddr = EditAddr & Char は、EditAddr 変数の文字列と Char 変数
の文字を結合して EditAddr 変数に代入しています。
20行目の AddrConv = EditAddr は、EditAddr 変数の文字列を AddrConv 関数の
戻り値として設定しています。
______________________________________
□ 宛名印刷レポート 宛名住所分割設定(SetAddress)関数
Private Function SetAddress(StrAddr As String)
Dim xySize As Size
Dim Addr1 As String
Dim Addr2 As String
Dim Addr3 As String
Dim Addr4 As String
Dim FSize As Integer
Me.Address_sub1 = Null
Me.Address_sub2 = Null
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Me.Address_sub1 = StrAddr
Exit Function
End If
If AddrDivi(Me.ZipCode, StrAddr, Addr1, Addr2, Addr3, Addr4, "ZipCodeTable") Then
Me.Address_sub1 = Addr1
For FSize = Me.Address_sub1.FontSize To 8 Step -1
Me.Address_sub1.FontSize = FSize
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Exit For
End If
Next FSize
Else
StrAddr = Addr1 & Addr2 & Addr3
If GetTextExtent(StrAddr, Me.Address_sub1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
If xySize.cx < Me.Address_sub1.Height Then
Me.Address_sub1 = Addr1 & Addr2 & Addr3
Me.Address_sub2 = Addr4
Else
Me.Address_sub1 = Addr1 & Addr2
Me.Address_sub2 = Addr3 & Addr4
End If
End If
End Function
1~6行目は変数の宣言です。
xySize と言う変数をSize型(Size型は、共通ライブラリで定義されている変数の型
です)で、Addr1 、Addr2 、Addr3、Addr4 と言う変数を文字列型で、FSize と言う
変数を整数型で定義しています。
8、9行目で、宛名住所の1行目表示用テキストボックス(Me.Address_sub1)と
2行目表示用テキストボックス(Me.Address_sub2)に Null を代入しています。
11~14行目では、GetTextExtent関数を用いて、宛名住所が1行目表示用テキス
トボックスで表示されたときのサイズを求めています。
StrAddr は、SetAddress 関数の引数で、宛名住所の文字列が設定されています。
その文字列が、1行目表示用テキストボックスで表示された場合のサイズがxySize
変数に代入されます。
GetTextExtent関数でエラーが発生した場合、 "システムエラー"と表示して終了
します。
GetTextExtent関数は共通ライブラリにありますが、アクセス2000をご使用の方
は、ウィザードにより、同様の関数が自動生成されます。
アクセス2000をご使用の方で、共通ライブラリをご使用の方は、自動生成された
GetTextExtent関数を削除して下さい。
共通ライブラリ内の関数の詳細は、後にまとめて行います。
15行目~18行目は、11行目で求めた宛名住所のサイズと1行目表示用テキスト
ボックスのサイズを比較し、宛名住所の文字列が1行目表示用テキストボックスに
全て入る場合、1行目表示用テキストボックスに宛名住所を代入して終了します。
19行目では AddrDivi 関数を用いて、宛名住所を都道府県、市区町村、町域名、
その他の4つに分割しています。
AddrDivi 関数では、郵便番号テーブル(第7引数)のデータを元に分割を行います。
郵便番号テーブルに該当住所が無い場合等、分割が出来なかった場合、この関数は
Trueを返し、正常に分割できた場合、Falseを返します。
この AddrDivi 関数 も共通ライブラリにあり、詳細はまとめて解説します。
20行目~30行目は、分割が出来なかった場合の処理です。
まず、20行目で、1行目表示用テキストボックスに宛名住所を代入します。
21行目~30行目はフォントサイズを-1づつしながら、GetTextExtent関数を
用いて宛名住所が1行目表示用テキストボックスに収まるかチェックします。
宛名住所が1行目表示用テキストボックスに全て収まるフォントサイズになると、
28行目の Exit For で終了します。
32行目~43行目は、宛名住所が分割できた場合の処理です。
まず、32行目で StrAddr 変数に 宛名住所の都道府県(Addr1)、市区町村(Addr2)、
町域名(Addr3)を文字列結合して代入します。
33行目で GetTextExtent関数を用いて、1行目表示用テキストボックスに先ほどの
都道府県+市区町村+町域名を代入した場合のサイズを求めます。
37行目で都道府県+市区町村+町域名が1行目表示用テキストボックスに収まるか
チェックし、収まる場合、1行目表示用テキストボックスに宛名住所の都道府県
(Addr1)、市区町村(Addr2)、町域名(Addr3)を文字列結合して代入し、
2行目表示用テキストボックスに町域名以下のその他(Addr4)を代入します。
都道府県+市区町村+町域名が1行目表示用テキストボックスに収まらない場合
1行目表示用テキストボックスに宛名住所の都道府県(Addr1)、市区町村(Addr2)
を代入し、2行目表示用テキストボックスに町域名(Addr3)、町域名以下のその他
(Addr4)を代入します。
______________________________________
□ お知らせ。
☆ ご質問、お問い合わせに対する、返信の遅延に関して。
最近、ご質問、お問い合わせを多数頂いております。
しかし、現在、仕事が忙しい事もあり、返事が遅れております。
頂いた順番で、順次返信しておりますので、少しの間お待ち下さい。
質問の際、アクセスのバージョン(97、2000等)を必ず明記下さい。
また、内容をできるだけ詳細にお願いします。
あまり、抽象的なご質問ですと、返事に時間がかかる場合がありますので
ご了承下さい。
ご迷惑をお掛けしますが、よろしくお願いいたします。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ ACCESSで作るシリーズ 【住所録ソフト編】
◇ 発 行 元 :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
ご質問等 :fukud@nifty.com
◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
しています。(まぐまぐID:0000077071)
◇ バックナンバー:http://www.fsc-net.com
◇ 登録・解除 :http://www.fsc-net.com
Copyright(C) 2001-2002 Yoshihisa Fukuda All rights reserved.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□