メールマガジン【アクセスで作るシリーズ】


バックナンバー 【住所録ソフト編】 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.

◇転載について
 このメールマガジンの無断転載などは、一切禁止です。
 転載をご希望の方は、事前にメールで連絡をください。
◇免責
 このメールマガジン及びホームページの内容による、いかなる損害、障害などに
 関して発行者は一切の責任を負いません。
 掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□