Sub MyCsvLbox()
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 選択文字列挿入処理(リストボックス三重連)
  Rem (コンマ区切り形式ファイル SQL文指定 データ参照処理)
  Rem 作譜:Hitrock Camellia Shinopy
  Rem 言語:Word VBA
  Rem 機能...
  Rem   1. リストボックス1から挿入したい文字列の分類を選択する。
  Rem   2. リストボックス2から文字列を選択して文書上に挿入する。
  Rem 注記...
  Rem   1. 「MyCsvLboxSchemaIni」を初回実行前に先行して一度だけ実行し、
  Rem      コンマ区切り形式ファイルの保存先フォルダ・「schema.ini」ファイル・CSVファイルを作成しておくこと。
  Rem      MyCsvLboxConst(既定値設定処理)で、保存先フォルダ名・CSVファイル名を指定する。(既定値は2・3の通り)
  Rem   2. 「DBPath」にコンマ区切り形式ファイルの保存先フォルダを指定すること。
  Rem      関連フォルダ名の既定値は、マイドキュメントの\MyCsvLboxフォルダ。
  Rem   3. 「CsvDB」にファイル名を指定すること。
  Rem      関連CSVファイル名の既定値は、MyCsvLbox.csv。
  Rem   4.「MyCsvLbox」を起動して、ツールバーを追加・表示しておき、使用する。
  Rem   5. マクロ実行時に画面表示が最大化の状態の場合、通常表示に変更する。(MyCsvLboxFullScreen)
  Rem   6. コンマ区切り形式ファイルを参照する部分を、下記の書籍から引用して、Word VBA用に改変した。
  Rem      小島政行『VisualBasic,VBA,VBScriptのための実践&リファレンスADO』アプライドナレッジの
  Rem        「第3部 ADOの活用  第2章 VBA」
  Rem     佐藤信正『VBScript実用プログラミング・テクニック』メディア・テック出版の
  Rem        「Part5 [16]12万件の郵便番号を検索する」
  Rem 履歴...
  Rem   第01版:2008/08/30:作成。
  Rem   第02版:2009/10/10:[次へ]ボタンを追加。
  Rem   第03版:2011/03/14:リストボックスを三重連に変更。
  Rem   第04版:2012/01/14:DimステートメントのVariantをObjectに変更。
  Rem   第05版:2013/08/30:[挿入][次へ]ボタンのポップヒント表示を追加。
  Rem   第06版:2013/09/22:Controls(1)をControls("Type")、Controls(4)をControls("Next")に変更。
  Rem   第07版:2014/02/02:半角括弧・全角括弧・引用符の場合、文書上の文字列を選択して文字を挿入した時に、
  Rem                       選択した文字列を括弧・引用符で挟んで挿入するように変更。
  Rem   第08版:2014/03/29:[次へ]ボタンのポップヒント表示を確実に表示するため、画面表示最大化時の対策。
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  Dim i As Long
  Dim j As Long
  Dim myValuePrev As String
  '
  Dim myConn As Object ' ADODB.Connection
  Dim myRecSet As Object ' ADODB.Recordset
  Dim DBPath As String
  Dim CsvDB As String
  Dim mySQL As String
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myTitle = "MyCsvLbox"
  Call MyCsvLboxConst("myTitleNew", myTitle)
  Call MyCsvLboxConst("DBPath", DBPath)
  Call MyCsvLboxConst("CsvDB", CsvDB)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Call MyCsvLboxFullScreen ' [次へ]押下時にポップヒントを無理やり表示させるため。(苦肉の策!)
  Call MyCsvLboxCmmdBar(myTitle)
  '
  Rem 新規オブジェクトをセット
  Set myConn = CreateObject("ADODB.Connection")
  Set myRecSet = CreateObject("ADODB.Recordset")
  '
  Rem 「Extended Properties=TEXT;」を指定してCSVファイルに接続
  myConn.Open _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & DBPath & ";" & _
    "Extended Properties=TEXT;"
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
MyCsvLboxSubEntry:
  Rem [分類]のデータを整列せず、リストボックス1に表示する場合
  mySQL = "SELECT  分類  FROM  " & CsvDB & ";"
  '
  Rem テーブルへの参照を取得
  With myRecSet
    .ActiveConnection = myConn
    .Source = mySQL
    .Open
  End With
  '
  i = 0
  myValuePrev = ""
  '
  If myRecSet.EOF Then
    MsgBox "[ " & CsvDB & " ]にデータがありません。 ", vbCritical
    GoTo MyCsvLboxSubExit
  End If
  '
  Rem レコードを転記
  Do While Not myRecSet.EOF
    If myRecSet.Fields(0).Value <> myValuePrev Then
      i = i + 1
      '
      For j = 1 To 3
        With CommandBars(myTitle & CStr(j)).Controls(2)
          .AddItem myRecSet.Fields(0).Value, i
          .DropDownLines = i
          .ListIndex = 0
          .Parameter = ""
        End With
      Next ' j
      '
      myValuePrev = myRecSet.Fields(0).Value
    End If
    myRecSet.MoveNext
  Loop
  '
  GoTo MyCsvLboxSubExit
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Rem [分類]のデータを整列して、リストボックス1に表示する場合
  mySQL = "SELECT  DISTINCT 分類  FROM  " & CsvDB & ";"
  ' mySQL = "SELECT  分類  FROM  " & CsvDB & "  GROUP  BY 分類;"
  '
  With myRecSet
    .ActiveConnection = myConn
    .Source = mySQL
    .Open
  End With
  '
  i = 0
  Do While Not myRecSet.EOF
    i = i + 1
    '
    For j = 1 To 3
      With CommandBars(myTitle & CStr(j)).Controls(2)
        .AddItem myRecSet.Fields(0).Value, i
        .DropDownLines = i
        .ListIndex = 0
        .Parameter = ""
      End With
    Next ' j
    '
    myRecSet.MoveNext
  Loop
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
MyCsvLboxSubExit:
  Rem 接続を閉じる
  On Error Resume Next
  myRecSet.Close
  myConn.Close
  On Error GoTo 0
  '
  Set myConn = Nothing
  Set myRecSet = Nothing
End Sub ' MyCsvLbox *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxCmmdBar(myTitle As String)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem コマンドバー設定処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim i As Long
  '
  Dim myCmmdBar1 As CommandBar
  Dim myCtrl1BttnType As CommandBarControl
  Dim myCtrl1DdwnOne As CommandBarControl
  Dim myCtrl1DdwnTwo As CommandBarControl
  Dim myCtrl1BttnNext As CommandBarControl
  '
  Dim myCmmdBar2 As CommandBar
  Dim myCtrl2BttnType As CommandBarControl
  Dim myCtrl2DdwnOne As CommandBarControl
  Dim myCtrl2DdwnTwo As CommandBarControl
  Dim myCtrl2BttnNext As CommandBarControl
  '
  Dim myCmmdBar3 As CommandBar
  Dim myCtrl3BttnType As CommandBarControl
  Dim myCtrl3DdwnOne As CommandBarControl
  Dim myCtrl3DdwnTwo As CommandBarControl
  Dim myCtrl3BttnNext As CommandBarControl
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  On Error Resume Next
  CommandBars(myTitle).Delete
  For i = 1 To 3
    CommandBars(myTitle & CStr(i)).Delete
  Next ' i
  On Error GoTo 0
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Set myCmmdBar1 = CommandBars.Add(Name:=myTitle & "1", Position:=msoBarTop, Temporary:=True)
  Set myCtrl1BttnType = myCmmdBar1.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
  Set myCtrl1DdwnOne = myCmmdBar1.Controls.Add(Type:=msoControlDropdown, Before:=2, Temporary:=True)
  Set myCtrl1DdwnTwo = myCmmdBar1.Controls.Add(Type:=msoControlDropdown, Before:=3, Temporary:=True)
  Set myCtrl1BttnNext = myCmmdBar1.Controls.Add(Type:=msoControlButton, Before:=4, Temporary:=True)
  '
  Set myCmmdBar2 = CommandBars.Add(Name:=myTitle & "2", Position:=msoBarTop, Temporary:=True)
  Set myCtrl2BttnType = myCmmdBar2.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
  Set myCtrl2DdwnOne = myCmmdBar2.Controls.Add(Type:=msoControlDropdown, Before:=2, Temporary:=True)
  Set myCtrl2DdwnTwo = myCmmdBar2.Controls.Add(Type:=msoControlDropdown, Before:=3, Temporary:=True)
  Set myCtrl2BttnNext = myCmmdBar2.Controls.Add(Type:=msoControlButton, Before:=4, Temporary:=True)
  '
  Set myCmmdBar3 = CommandBars.Add(Name:=myTitle & "3", Position:=msoBarTop, Temporary:=True)
  Set myCtrl3BttnType = myCmmdBar3.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
  Set myCtrl3DdwnOne = myCmmdBar3.Controls.Add(Type:=msoControlDropdown, Before:=2, Temporary:=True)
  Set myCtrl3DdwnTwo = myCmmdBar3.Controls.Add(Type:=msoControlDropdown, Before:=3, Temporary:=True)
  Set myCtrl3BttnNext = myCmmdBar3.Controls.Add(Type:=msoControlButton, Before:=4, Temporary:=True)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With myCtrl1BttnType
    .DescriptionText = "挿入ボタン"
    .Style = msoButtonIcon
    .Caption = "Type"
    .TooltipText = "文字列を挿入します。"
    .FaceId = 31
    .Parameter = ""
    .OnAction = myTitle & "1BttnType"
  End With
  '
  With myCtrl1DdwnOne
    .DescriptionText = "リストボックス1"
    .Style = msoComboNormal ' ラベルテキストを表示しない。
    .Caption = ""
    .TooltipText = "挿入したい文字列の分類を選択して下さい。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "1DdwnOne"
  End With
  '
  With myCtrl1DdwnTwo
    .DescriptionText = "リストボックス2"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "選択した文字列を挿入します。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "1DdwnTwo"
  End With
  '
  With myCtrl1BttnNext
    .DescriptionText = "次へボタン"
    .Style = msoButtonIcon
    .Caption = "Next"
    .TooltipText = "次の文字列を挿入します。"
    .FaceId = 157
    .Parameter = ""
    .OnAction = myTitle & "1BttnNext"
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With myCtrl2BttnType
    .DescriptionText = "挿入ボタン"
    .Style = msoButtonIcon
    .Caption = "Type"
    .TooltipText = "文字列を挿入します。"
    .FaceId = 31
    .Parameter = ""
    .OnAction = myTitle & "2BttnType"
  End With
  '
  With myCtrl2DdwnOne
    .DescriptionText = "リストボックス1"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "挿入したい文字列の分類を選択して下さい。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "2DdwnOne"
  End With
  '
  With myCtrl2DdwnTwo
    .DescriptionText = "リストボックス2"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "選択した文字列を挿入します。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "2DdwnTwo"
  End With
  '
  With myCtrl2BttnNext
    .DescriptionText = "次へボタン"
    .Style = msoButtonIcon
    .Caption = "Next"
    .TooltipText = "次の文字列を挿入します。"
    .FaceId = 157
    .Parameter = ""
    .OnAction = myTitle & "2BttnNext"
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With myCtrl3BttnType
    .DescriptionText = "挿入ボタン"
    .Style = msoButtonIcon
    .Caption = "Type"
    .TooltipText = "文字列を挿入します。"
    .FaceId = 31
    .Parameter = ""
    .OnAction = myTitle & "3BttnType"
  End With
  '
  With myCtrl3DdwnOne
    .DescriptionText = "リストボックス1"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "挿入したい文字列の分類を選択して下さい。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "3DdwnOne"
  End With
  '
  With myCtrl3DdwnTwo
    .DescriptionText = "リストボックス2"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "選択した文字列を挿入します。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "3DdwnTwo"
  End With
  '
  With myCtrl3BttnNext
    .DescriptionText = "次へボタン"
    .Style = msoButtonIcon
    .Caption = "Next"
    .TooltipText = "次の文字列を挿入します。"
    .FaceId = 157
    .Parameter = ""
    .OnAction = myTitle & "3BttnNext"
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  For i = 1 To 3
    CommandBars(myTitle & CStr(i)).Controls("Type").Enabled = False
    CommandBars(myTitle & CStr(i)).Controls("Next").Enabled = False
    CommandBars(myTitle & CStr(i)).Visible = True
  Next ' i
End Sub ' MyCsvLboxCmmdBar *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox1BttnType(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "1")
  Call MyCsvLboxBttnType
End Sub ' MyCsvLbox1BttnType *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox1DdwnOne(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "1")
  Call MyCsvLboxDdwnOne
End Sub ' MyCsvLbox1DdwnOne *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox1DdwnTwo(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "1")
  Call MyCsvLboxDdwnTwo
End Sub ' MyCsvLbox1DdwnTwo *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox1BttnNext(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "1")
  Call MyCsvLboxBttnNext
End Sub ' MyCsvLbox1BttnNext *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox2BttnType(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "2")
  Call MyCsvLboxBttnType
End Sub ' MyCsvLbox2BttnType *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox2DdwnOne(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "2")
  Call MyCsvLboxDdwnOne
End Sub ' MyCsvLbox2DdwnOne *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox2DdwnTwo(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "2")
  Call MyCsvLboxDdwnTwo
End Sub ' MyCsvLbox2DdwnTwo *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox2BttnNext(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "2")
  Call MyCsvLboxBttnNext
End Sub ' MyCsvLbox2BttnNext *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox3BttnType(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "3")
  Call MyCsvLboxBttnType
End Sub ' MyCsvLbox3BttnType *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox3DdwnOne(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "3")
  Call MyCsvLboxDdwnOne
End Sub ' MyCsvLbox3DdwnOne *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox3DdwnTwo(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "3")
  Call MyCsvLboxDdwnTwo
End Sub ' MyCsvLbox3DdwnTwo *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLbox3BttnNext(Optional myDummy As Boolean)
  Dim myTitle As String
  Call MyCsvLboxConst("myTitle", myTitle)
  Call MyCsvLboxConst("myCmmdBarNumber", myTitle & "3")
  Call MyCsvLboxBttnNext
End Sub ' MyCsvLbox3BttnNext *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxBttnType(Optional myDummy As Boolean)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 挿入ボタン処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  '
  Call MyCsvLboxConst("myCmmdBar", myTitle)
  '
  If Len(CommandBars(myTitle).Controls(2).Text) = 0 Then
    Rem [分類]を選択していない状態(通常ではあり得ない)
    Exit Sub
  End If
  '
  CommandBars(myTitle).Controls("Type").FaceId = 964
  '
  If Len(CommandBars(myTitle).Controls(3).Text) <> 0 Then
    Call MyCsvLboxText(CommandBars(myTitle).Controls(3).Text)
  Else
    Rem [本文]の項目を選択していない状態
    Call MyCsvLboxText(CommandBars(myTitle).Controls(2).Text)
  End If
  '
  CommandBars(myTitle).Controls("Type").FaceId = 31
End Sub ' MyCsvLboxBttnType *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxDdwnOne(Optional myDummy As Boolean)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem リストボックス1処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  Dim i As Long
  '
  Dim myConn As Object ' ADODB.Connection
  Dim myRecSet As Object ' ADODB.Recordset
  Dim DBPath As String
  Dim CsvDB As String
  Dim mySQL As String
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Call MyCsvLboxConst("myCmmdBar", myTitle)
  Call MyCsvLboxConst("DBPath", DBPath)
  Call MyCsvLboxConst("CsvDB", CsvDB)
  '
  Rem リストボックス2を設定し直す。
  With CommandBars(myTitle)
    .Controls("Type").FaceId = 964
    .Controls(3).Delete
    .Controls.Add Type:=msoControlDropdown, Before:=3, Temporary:=True
  End With
  '
  With CommandBars(myTitle).Controls(3)
    .DescriptionText = "リストボックス2"
    .Style = msoComboNormal
    .Caption = ""
    .TooltipText = "選択した文字列を挿入します。"
    .BeginGroup = True
    .DropDownWidth = 400
    .OnAction = myTitle & "DdwnTwo"
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Rem [本文]の項目をリストボックス2に設定する。
  Rem 新規オブジェクトをセット
  Set myConn = CreateObject("ADODB.Connection")
  Set myRecSet = CreateObject("ADODB.Recordset")
  '
  Rem 「Extended Properties=TEXT;」を指定してCSVファイルに接続
  myConn.Open _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & DBPath & ";" & _
    "Extended Properties=TEXT;"
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  mySQL = "SELECT  本文 FROM  " & CsvDB & "  "
  mySQL = mySQL & "WHERE  分類='" & CommandBars(myTitle).Controls(2).Text & "';"
  '
  Rem テーブルへの参照を取得
  With myRecSet
    .ActiveConnection = myConn
    .Source = mySQL
    .Open
  End With
  '
  i = 0
  Rem レコードを転記
  Do While Not myRecSet.EOF
    i = i + 1
    '
    With CommandBars(myTitle).Controls(3)
      .AddItem myRecSet.Fields(0).Value, i
      .DropDownLines = i
      .ListIndex = 0
      .Parameter = ""
    End With
    myRecSet.MoveNext
  Loop
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Rem 接続を閉じる
  On Error Resume Next
  myRecSet.Close
  myConn.Close
  On Error GoTo 0
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With CommandBars(myTitle)
    .Controls("Type").Enabled = True
    .Controls("Type").TooltipText = .Controls(2).Text
    If .Controls(3).ListCount > 0 Then
      .Controls("Next").Enabled = True
      .Controls("Next").TooltipText = .Controls(3).List(1)
    Else
      Rem [分類]に該当する[本文]の項目がなかった場合(通常ではあり得ない)
      .Controls("Type").TooltipText = .Controls(2).Text
      .Controls("Next").Enabled = False
      .Controls("Next").TooltipText = ""
    End If
    .Controls("Type").FaceId = 31
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Set myConn = Nothing
  Set myRecSet = Nothing
End Sub ' MyCsvLboxDdwnOne *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxDdwnTwo(Optional myDummy As Boolean)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem リストボックス2処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  '
  Call MyCsvLboxConst("myCmmdBar", myTitle)
  '
  If CommandBars(myTitle).Controls(3).Index = 0 Then
    Rem [本文]の項目を選択していない状態
    Exit Sub
  End If
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  CommandBars(myTitle).Controls("Type").FaceId = 964
  '
  Call MyCsvLboxText(CommandBars(myTitle).Controls(3).Text)
  '
  With CommandBars(myTitle)
    .Controls("Type").TooltipText = .Controls(3).Text
    If .Controls(3).ListIndex < .Controls(3).ListCount Then
      .Controls("Next").TooltipText = .Controls(3).List(.Controls(3).ListIndex + 1)
    Else
      Rem [本文]の最後の項目を選択した場合
      .Controls("Next").TooltipText = "[先頭に戻る]"
    End If
  End With
  '
  CommandBars(myTitle).Controls("Type").FaceId = 31
End Sub ' MyCsvLboxDdwnTwo *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxBttnNext(Optional myDummy As Boolean)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 次へボタン処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  '
  Call MyCsvLboxConst("myCmmdBar", myTitle)
  '
  With CommandBars(myTitle)
    Select Case True
      Case Len(.Controls(2).Text) = 0
        Rem [分類]を選択していない状態(通常ではあり得ない)
        Exit Sub
      Case .Controls(3).ListIndex >= .Controls(3).ListCount
        Rem 既に[本文]の最後の項目を選択している状態
        .Controls(3).ListIndex = 0
        .Controls("Type").TooltipText = .Controls(2).Text
        .Controls("Next").TooltipText = .Controls(3).List(1)
        Rem ポップヒントを無理やり表示させる。(苦肉の策!)
        Call MyCsvLboxFullScreen
        Beep
        Exit Sub
    End Select
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With CommandBars(myTitle)
    .Controls("Next").FaceId = 964
    .Controls(3).ListIndex = .Controls(3).ListIndex + 1
    .Controls("Type").TooltipText = .Controls(3).Text
  End With
  '
  Call MyCsvLboxText(CommandBars(myTitle).Controls(3).Text)
  '
  With CommandBars(myTitle)
    If .Controls(3).ListIndex >= .Controls(3).ListCount Then
      Rem [本文]の最後の項目を選択した状態
      .Controls("Next").TooltipText = "[先頭に戻る]"
    Else
      Rem 次の[本文]項目のポップヒント表示を設定する。
      .Controls("Next").TooltipText = .Controls(3).List(.Controls(3).ListIndex + 1)
    End If
    .Controls("Next").FaceId = 157
  End With
  '
  Rem ポップヒントを無理やり表示させる。(苦肉の策!)
  Call MyCsvLboxFullScreen
End Sub ' MyCsvLboxBttnNext *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxText(mytext As String)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 文字列挿入処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myTitle As String
  '
  Call MyCsvLboxConst("myCmmdBar", myTitle)
  '
  Rem 括弧・引用符の中にカーソルを移す。
  If mytext <> CommandBars(myTitle).Controls(2).Text Then
    Select Case CommandBars(myTitle).Controls(2).Text
      Case "半角括弧", "全角括弧", "引用符"
        Call MyCsvLboxTextBracket(myTitle, mytext)
        Exit Sub
    End Select
  End If
  '
  Selection.TypeText mytext
End Sub ' MyCsvLboxText *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxTextBracket(myTitle As String, mytext As String)
  If Len(Selection.Range.Text) > 0 Then
    Select Case True
      Case mytext = "〔←〕"
        mytext = Left(mytext, 2) & Selection.Range.Text & Right(mytext, 1)
      Case CommandBars(myTitle).Controls(2).Text = "全角括弧"
        mytext = Left(mytext, 1) & Selection.Range.Text & Right(mytext, 1)
      Case CommandBars(myTitle).Controls(2).Text = "引用符"
        mytext = Left(mytext, 1) & Selection.Range.Text & Right(mytext, 1)
      Case CommandBars(myTitle).Controls(2).Text = "半角括弧"
        mytext = Left(mytext, 2) & Selection.Range.Text & Right(mytext, 2)
    End Select
    Selection.TypeText mytext
    Exit Sub
  End If
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Selection.TypeText mytext
  '
  Rem 括弧・引用符の中にカーソルを移す。
  If mytext <> CommandBars(myTitle).Controls(2).Text Then
    Select Case CommandBars(myTitle).Controls(2).Text
      Case "全角括弧", "引用符"
        Selection.MoveLeft Unit:=wdCharacter, Count:=1
      Case "半角括弧"
        Selection.MoveLeft Unit:=wdCharacter, Count:=2
    End Select
  End If
End Sub ' MyCsvLboxTextBracket *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxFullScreen(Optional myDummy As Boolean)
  Dim myHeight As Long
  Dim myWidth As Long
  Dim myTop As Long
  Dim myLeft As Long
  '
  Application.ScreenUpdating = False
  '
  If ActiveWindow.WindowState = wdWindowStateMaximize Then
    myTop = Application.Top
    myLeft = Application.Left
    myWidth = Application.Width
    myHeight = Application.Height
    '
    ActiveWindow.WindowState = wdWindowStateNormal
    '
    Application.Top = myTop
    Application.Left = myLeft
    Application.Width = myWidth - 1
    Application.Height = myHeight - 1
  Else
    Rem wdWindowStateNormalの場合
    ActiveWindow.View.FullScreen = Not ActiveWindow.View.FullScreen ' フルスクリーン表示。
    ActiveWindow.View.FullScreen = Not ActiveWindow.View.FullScreen ' フルスクリーン表示を解除。
  End If
  '
  Application.ScreenUpdating = True
End Sub ' MyCsvLboxFullScreen *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxConst(myFlag As String, myString As String)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 既定値設定処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Static myTitleStatic As String
  Static myCmmdBarStatic As String
  Dim myShell As Object
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Select Case myFlag
    Case "myTitleNew"
      myTitleStatic = myString
    Case "myTitle"
      myString = myTitleStatic
    Case "myCmmdBarNumber"
      myCmmdBarStatic = myString
    Case "myCmmdBar"
      myString = myCmmdBarStatic
    Case "DBPath"
      Set myShell = CreateObject("WScript.Shell")
      myString = myShell.SpecialFolders("MyDocuments")
      myString = myString & "\" & myTitleStatic
    Case "CsvDB"
      myString = "MyCsvLbox.csv"
  End Select
  '
  Set myShell = Nothing
End Sub ' MyCsvLboxConst *----*----*    *----*----*    *----*----*    *----*----*

Sub MyCsvLboxSchemaIni() ' (Optional myDummy As Boolean)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem MyCsvLbox初期設定処理
  Rem (「MyCsvLbox」初回実行前に一度だけ実行)
  Rem 機能...
  Rem   1. MyCsvLboxの初期設定をする。
  Rem      見出し情報や内部構造をODBCに伝えるために、
  Rem      CSVファイルの保存先フォルダに「schema.ini」ファイルを作成する。
  Rem   2.「DBPath」にCSVファイルの保存先フォルダを指定すること。(MyCsvLboxConstで指定。)
  Rem      関連フォルダ名の既定値は、マイドキュメントの\MyCsvLboxフォルダ。
  Rem   3. この処理で、関連フォルダと「schema.ini」ファイルを作成する。
  Rem   4. この処理で、関連CSVファイルを作成する。
  Rem      (関連CSVファイル名の既定値は、MyCsvLbox.csv。MyCsvLboxConstで指定。)
  Rem      作成するCSVファイルの1行目は見出し行とする。
  Rem      この処理で作成する2行目以降のデータは一例。
  Rem 注記...
  Rem   1. 佐藤信正『VBScript実用プログラミング・テクニック』メディア・テック出版の
  Rem      「Part5 [16]12万件の郵便番号を検索する」から引用した。
  Rem   2.「MyCsvLbox」初回実行前に先行して一度だけ実行すること。
  Rem   3.この処理後に、関連CSVファイルを編集して、MyCsvLboxのデータを作成すること。
  Rem 履歴...
  Rem   第01版:2008/08/30 作成。
  Rem   第02版:2012/05/28 関連フォルダ・関連CSVファイルの作成を追加。
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myFso As Object
  Dim myFile As Object
  '
  Dim DBPath As String
  Dim CsvDB As String
  Dim IniFile As String
  Dim myFullName As String
  '
  Dim myTitle As String
  Dim myStatusBar As String
  Dim myMsg As String
  Dim myAns As Long
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myTitle = "MyCsvLbox"
  Call MyCsvLboxConst("myTitleNew", myTitle)
  Call MyCsvLboxConst("DBPath", DBPath)
  Call MyCsvLboxConst("CsvDB", CsvDB)
  '
  myTitle = "MyCsvLboxSchemaIni"
  IniFile = "schema.ini"
  myFullName = DBPath & "\" & IniFile
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myMsg = "[初期設定] " & vbCrLf & "処理を実行します。 " & vbCrLf & vbCrLf
  myMsg = myMsg & "処理を中止したい場合は、" & vbCrLf
  myMsg = myMsg & "[キャンセル]を選択して下さい。"
  myStatusBar = Replace(myMsg, vbCrLf, "")
  '
  Application.StatusBar = myTitle & ":" & myStatusBar
  myAns = MsgBox(myMsg, vbOKCancel + vbCritical + vbDefaultButton2, myTitle)
  '
  If myAns <> vbOK Then Exit Sub
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Set myFso = CreateObject("Scripting.FileSystemObject")
  '
  If myFso.FileExists(myFullName) = True Then
    myMsg = "[初期設定] " & vbCrLf & vbCrLf
    myMsg = myMsg & "既定のフォルダとファイルは、作成済みです。"
    MsgBox myMsg, vbOKOnly + vbCritical, myTitle
    Exit Sub
  End If
  '
  Rem 関連フォルダを作成する。
  myFso.CreateFolder DBPath
  Rem 関連ファイルを作成する。
  Set myFile = myFso.CreateTextFile(myFullName)
  With myFile
    .WriteLine ("[" & CsvDB & "]") ' ("[MyCsvLbox.csv]")
    '
    .WriteLine ("ColNameHeader=True") ' 見出し行の有無:ありを指定。
    .WriteLine ("CharacterSet=oem")
    .WriteLine ("Format=CSVDelimited")
    '
    .WriteLine ("Col1=分類 Char Width 255")
    .WriteLine ("Col2=本文 Char Width 255")
    .Close
  End With
  '
  Rem 関連CSVファイルを作成する。
  Rem 1行目は見出し行。2行目以降は一例。
  Set myFile = myFso.CreateTextFile(DBPath & "\" & CsvDB)
  With myFile
    .WriteLine "分類,本文"
    .WriteLine "全角括弧,()"
    .WriteLine "全角括弧,〈〉"
    .WriteLine "全角括弧,《》"
    .WriteLine "全角括弧,〔〕"
    .WriteLine "全角括弧,〔〕"
    .WriteLine "記号,…"
    .WriteLine "記号,(1)"
    .WriteLine "記号,(2)"
    .WriteLine "記号,(3)"
    .Close
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myMsg = "[初期設定] " & vbCrLf
  myMsg = myMsg & "処理が完了しました!" & vbCrLf
  myStatusBar = Replace(myMsg, vbCrLf, "")
  '
  Application.StatusBar = myTitle & ":" & myStatusBar
  myAns = MsgBox(myMsg, vbOKOnly + vbInformation, myTitle)
  '
  Set myFso = Nothing
  Set myFile = Nothing
End Sub ' MyCsvLboxSchemaIni *----*----*    *----*----*    *----*----*    *----*----*

inserted by FC2 system