メールマガジン【アクセスで作るシリーズ】
バックナンバー 【住所録ソフト編】 Vol.38
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【住所録ソフト編】
発 行 : Yoshihisa Fukuda 2002.11.30 Vol.38
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回も、プログラム解説の続きです。
______________________________________
□ 宛名印刷レポート 連名表示(SubNameDisp)関数
Private Function SubNameDisp()
Dim T_Join As Recordset
Dim SqlStr As String
Dim FirstName As String
Dim Pos As Integer
Dim xySize As Size
Dim TopPos As Integer
Dim I As Integer
For I = 1 To 4
Me("SubName" & I) = Null
Next I
If Me.PrintJointly = 0 Or Me.PrintAddr <> 1 Then
Exit Function
End If
SqlStr = "select SubName, Honor from JointlyTable where OwnerID=" & Me.ID
If Me.PrintJointly = 2 Then
SqlStr = SqlStr & " AND PrintFlg = True"
End If
Set T_Join = CurrentDb.OpenRecordset(SqlStr)
If T_Join.RecordCount = 0 Then
GoTo Exit_SubNameDisp
End If
Pos = InStr(1, Me.FullName, " ", vbTextCompare)
If Pos = 0 Then
Pos = InStr(1, Me.FullName, " ", vbTextCompare)
End If
If Pos = 0 Then
TopPos = Me.tbound5.Top
Else
FirstName = Left(Me.FullName, Pos)
If GetTextExtent(FirstName, Me.SubName1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
TopPos = Me.tbound5.Top + xySize.cx
End If
T_Join.MoveFirst
For I = 1 To 4
Me("SubName" & I).Top = TopPos
Me("SubName" & I) = T_Join.Fields("SubName") & " " & _
T_Join.Fields("Honor")
T_Join.MoveNext
If T_Join.EOF Then
Exit For
End If
Next I
Exit_SubNameDisp:
T_Join.Close
Set T_Join = Nothing
End Function
【解説】
1~7行目は変数の宣言です。
T_Join と言う変数をレコードセット型で、SqlStr、FirstName と言う変数を文字列
型で、Pos、TopPos 、I と言う変数を整数型で、定義しています。
また、xySize と言う変数を Size型で定義していますが、この Size はユーザー定義
された型で、共通ライブラリで定義されています。
定義は
Public Type Size
cx As Long
cy As Long
End Type
とされていて、Size の中に cx と cy と言う変数が長整数(Long)型で定義されてい
ます。
ここでは Dim xySize As Size として xySize 変数を宣言しているので、それぞれの
cx、cy を参照する際は、Size.cx または Size.cy として参照します。
9~11行目の For文では連名表示用テキストボックス(SubName1~4)にNullを
代入しています。
13~15行目の If文では、連名表示するデータかどうかを判別しています。
If Me.PrintJointly = 0 Or Me.PrintAddr <> 1 Then の最初の条件は
Me.PrintJointly = 0 で、PrintJointly が0の時、即ち連名印刷しないの場合と
言う意味で、次の条件 Me.PrintAddr <> 1 は、PrintAddr が1でない、即ち宛名が
自宅で無い場合で、このいずれかの条件に当てはまる場合、14行目の
Exit Function で何もせずにこの関数を終了します。
この場合、自宅以外は連名印刷をしない訳ですが、会社宛でも連名を印刷したい場合
は、この条件式を If Me.PrintJointly = 0 Then とすれば、会社宛も連名が表示
される様になります。
17行目は、SqlStr と言う変数に連名を抽出するためのSQL文を代入しています。
SQL文は "select SubName, Honor from JointlyTable where OwnerID=" & Me.ID
となっていますが、これはまず、抽出するフィールドが連名(SubName)と敬称
(Honor)となり、抽出するテーブルが連名テーブル(JointlyTable)です。
そして、抽出条件が where文で書かれていますが、親ID(OwnerID)が現在の
レポートで表示しようとしているテーブルのID(Me.ID)と同一のデータとなります。
19~21行目では、上記抽出条件にさらに条件を付け足しています。
If Me.PrintJointly = 2 Then は[指定した連名を印刷]の場合で、その場合SQL文に
" AND PrintFlg = True" と言う抽出条件(宛名印刷フラグにチェックがあるもの)
を追加しています。
23行目で、SqlStr変数のSQL文でレコードセットをオープンしています。
これにより、T_Join と言うレコードセット変数でデータの参照が可能になります。
25~27行目は、抽出したデータの件数が0(連名のデータが無い)の場合、
GoTo Exit_SubNameDisp でラベル Exit_SubNameDisp: へ処理を移します。
29~32行目は、宛名の姓と名の間のスペースの位置を探しています。
(住所を登録する際、氏名欄で姓と名の間に1文字スペースを入力すると、連名印刷
する時に、名がきれいに揃います)
最初に29行目で半角のスペースを探して、無ければ(Posが0の場合)次に全角の
スペースを探しています。
33~42行目は、連名の表示位置(座標)の上位置を求めています。
まず、33行目で Pos が0の場合というのは、宛名の中にスペースが見つからない
即ち、姓と名が分割出来ない場合で、その場合は仕方が無いので、連名の表示位置の
上位置(TopPos)を宛名のテキストボックスの上位置(Me.tbound5.Top)に設定して
います。
宛名の中のスペースが見つかり、姓と名の分割が出来た場合は、36~41行目で
連名の上位置を設定します。
まず、FirstName = Left(Me.FullName, Pos) で、FirstName と言う変数に姓を代入
しています。(スペースも含む)
次に、GetTextExtent関数を使用して姓の高さ(名を表示する場所の上位置)を求め
ています。
そして、連名の表示位置の上位置(TopPos)に、宛名のテキストボックスの上位置
(Me.tbound5.Top)+ xySize.cx(宛名の名の始まる位置)として、名の上位置を
揃えています。
44行目の、T_Join.MoveFirst では、23行目でオープンしたレコードセットの
レコード位置を先頭にしています。
45~53行目で、連名の名と敬称を連名表示用テキストボックスに代入しています。
45行目の For文で連名表示用テキストボックスの数分(4)Next文までの処理を
繰り返します。
46行目の Me("SubName" & I).Top = TopPos は、先ほど求めた連名表示の上位置
を連名表示用テキストボックスの[上位置]プロパティに設定しています。
47・48行目で、連名表示用テキストボックスに連名(T_Join.Fields("SubName"))
と敬称(T_Join.Fields("Honor"))を文字列結合して代入しています。
49行目の T_Join.MoveNext で連名データのレコードを次に移動しています。
50行目の If文で連名データが全て読み終わった(T_Join.EOF が True)場合、
次の Exit For でこのFor文を終了します。
56・57行目では、オープンしたレコードセットをクローズして、変数を開放して
います。
______________________________________
□ お知らせ。
☆ 宛先切り替えの不具合について
宛先を会社に指定して宛名印刷を行った際、郵便番号が常に自宅になると言う
ご指摘を、読者の方より頂いております。
次回、共通ライブラリの関数の使い方を解説して、宛名印刷の解説を終了
しますので、その後、この郵便番号の会社宛の対応を行います。
それまで、少しお待ち下さい。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ 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.30 Vol.38
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回も、プログラム解説の続きです。
______________________________________
□ 宛名印刷レポート 連名表示(SubNameDisp)関数
Private Function SubNameDisp()
Dim T_Join As Recordset
Dim SqlStr As String
Dim FirstName As String
Dim Pos As Integer
Dim xySize As Size
Dim TopPos As Integer
Dim I As Integer
For I = 1 To 4
Me("SubName" & I) = Null
Next I
If Me.PrintJointly = 0 Or Me.PrintAddr <> 1 Then
Exit Function
End If
SqlStr = "select SubName, Honor from JointlyTable where OwnerID=" & Me.ID
If Me.PrintJointly = 2 Then
SqlStr = SqlStr & " AND PrintFlg = True"
End If
Set T_Join = CurrentDb.OpenRecordset(SqlStr)
If T_Join.RecordCount = 0 Then
GoTo Exit_SubNameDisp
End If
Pos = InStr(1, Me.FullName, " ", vbTextCompare)
If Pos = 0 Then
Pos = InStr(1, Me.FullName, " ", vbTextCompare)
End If
If Pos = 0 Then
TopPos = Me.tbound5.Top
Else
FirstName = Left(Me.FullName, Pos)
If GetTextExtent(FirstName, Me.SubName1, xySize) Then
MsgBox "システムエラー"
Exit Function
End If
TopPos = Me.tbound5.Top + xySize.cx
End If
T_Join.MoveFirst
For I = 1 To 4
Me("SubName" & I).Top = TopPos
Me("SubName" & I) = T_Join.Fields("SubName") & " " & _
T_Join.Fields("Honor")
T_Join.MoveNext
If T_Join.EOF Then
Exit For
End If
Next I
Exit_SubNameDisp:
T_Join.Close
Set T_Join = Nothing
End Function
【解説】
1~7行目は変数の宣言です。
T_Join と言う変数をレコードセット型で、SqlStr、FirstName と言う変数を文字列
型で、Pos、TopPos 、I と言う変数を整数型で、定義しています。
また、xySize と言う変数を Size型で定義していますが、この Size はユーザー定義
された型で、共通ライブラリで定義されています。
定義は
Public Type Size
cx As Long
cy As Long
End Type
とされていて、Size の中に cx と cy と言う変数が長整数(Long)型で定義されてい
ます。
ここでは Dim xySize As Size として xySize 変数を宣言しているので、それぞれの
cx、cy を参照する際は、Size.cx または Size.cy として参照します。
9~11行目の For文では連名表示用テキストボックス(SubName1~4)にNullを
代入しています。
13~15行目の If文では、連名表示するデータかどうかを判別しています。
If Me.PrintJointly = 0 Or Me.PrintAddr <> 1 Then の最初の条件は
Me.PrintJointly = 0 で、PrintJointly が0の時、即ち連名印刷しないの場合と
言う意味で、次の条件 Me.PrintAddr <> 1 は、PrintAddr が1でない、即ち宛名が
自宅で無い場合で、このいずれかの条件に当てはまる場合、14行目の
Exit Function で何もせずにこの関数を終了します。
この場合、自宅以外は連名印刷をしない訳ですが、会社宛でも連名を印刷したい場合
は、この条件式を If Me.PrintJointly = 0 Then とすれば、会社宛も連名が表示
される様になります。
17行目は、SqlStr と言う変数に連名を抽出するためのSQL文を代入しています。
SQL文は "select SubName, Honor from JointlyTable where OwnerID=" & Me.ID
となっていますが、これはまず、抽出するフィールドが連名(SubName)と敬称
(Honor)となり、抽出するテーブルが連名テーブル(JointlyTable)です。
そして、抽出条件が where文で書かれていますが、親ID(OwnerID)が現在の
レポートで表示しようとしているテーブルのID(Me.ID)と同一のデータとなります。
19~21行目では、上記抽出条件にさらに条件を付け足しています。
If Me.PrintJointly = 2 Then は[指定した連名を印刷]の場合で、その場合SQL文に
" AND PrintFlg = True" と言う抽出条件(宛名印刷フラグにチェックがあるもの)
を追加しています。
23行目で、SqlStr変数のSQL文でレコードセットをオープンしています。
これにより、T_Join と言うレコードセット変数でデータの参照が可能になります。
25~27行目は、抽出したデータの件数が0(連名のデータが無い)の場合、
GoTo Exit_SubNameDisp でラベル Exit_SubNameDisp: へ処理を移します。
29~32行目は、宛名の姓と名の間のスペースの位置を探しています。
(住所を登録する際、氏名欄で姓と名の間に1文字スペースを入力すると、連名印刷
する時に、名がきれいに揃います)
最初に29行目で半角のスペースを探して、無ければ(Posが0の場合)次に全角の
スペースを探しています。
33~42行目は、連名の表示位置(座標)の上位置を求めています。
まず、33行目で Pos が0の場合というのは、宛名の中にスペースが見つからない
即ち、姓と名が分割出来ない場合で、その場合は仕方が無いので、連名の表示位置の
上位置(TopPos)を宛名のテキストボックスの上位置(Me.tbound5.Top)に設定して
います。
宛名の中のスペースが見つかり、姓と名の分割が出来た場合は、36~41行目で
連名の上位置を設定します。
まず、FirstName = Left(Me.FullName, Pos) で、FirstName と言う変数に姓を代入
しています。(スペースも含む)
次に、GetTextExtent関数を使用して姓の高さ(名を表示する場所の上位置)を求め
ています。
そして、連名の表示位置の上位置(TopPos)に、宛名のテキストボックスの上位置
(Me.tbound5.Top)+ xySize.cx(宛名の名の始まる位置)として、名の上位置を
揃えています。
44行目の、T_Join.MoveFirst では、23行目でオープンしたレコードセットの
レコード位置を先頭にしています。
45~53行目で、連名の名と敬称を連名表示用テキストボックスに代入しています。
45行目の For文で連名表示用テキストボックスの数分(4)Next文までの処理を
繰り返します。
46行目の Me("SubName" & I).Top = TopPos は、先ほど求めた連名表示の上位置
を連名表示用テキストボックスの[上位置]プロパティに設定しています。
47・48行目で、連名表示用テキストボックスに連名(T_Join.Fields("SubName"))
と敬称(T_Join.Fields("Honor"))を文字列結合して代入しています。
49行目の T_Join.MoveNext で連名データのレコードを次に移動しています。
50行目の If文で連名データが全て読み終わった(T_Join.EOF が True)場合、
次の Exit For でこのFor文を終了します。
56・57行目では、オープンしたレコードセットをクローズして、変数を開放して
います。
______________________________________
□ お知らせ。
☆ 宛先切り替えの不具合について
宛先を会社に指定して宛名印刷を行った際、郵便番号が常に自宅になると言う
ご指摘を、読者の方より頂いております。
次回、共通ライブラリの関数の使い方を解説して、宛名印刷の解説を終了
しますので、その後、この郵便番号の会社宛の対応を行います。
それまで、少しお待ち下さい。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ 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.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□