Microsoft Access2003

Page 13 (2005/02)

宣言済み識別子
あまり必要度の低い知識かもしれませんが、他のフォームを参照する方法のひとつです。
通常は、「Foems!フォーム名」 といった具合に !演算子を使うのですが、「Form_フォーム名」とするのが宣言済み識別子とかいうようです。
これの特徴は、オープンしていないフォームも処理対象になるということです。
オープンしているファイルを探し、無い場合はオープンしていないファイルを開きます。ただし、表示はされない。
ということで、下のようなサンプルフォームを作ってみました。Test2フォームを開きコマンド0ボタンをクリックすると、フォームTest1のなかのテキストボックス、テキスト0の背景を黄色に設定し、フォームの表題を「Test1フォームのCaption」という名前に設定します。
コマンド2は、Forms(ファイル名の変数)を使って他のフォームを参照しています。
こちらはフォーム名に変数を使えるのですが、参照先のフォームはオープンしていないとエラーになります。
不思議なことに、コマンド0ボタンでTestを表示した場合はエラーになります。あらかじめTest1をオープンしておいてからこのボタンをクリックすると正常に働きます。
識別子を使ったオープンの仕方は特殊なようです。
Option Compare Database
Option Explicit
Private Sub コマンド0_Click()
  Form_Test1.テキスト0.BackColor = vbYellow      '閉じているフォームのテキスト・コントロールの背景を黄色にして
  Form_Test1.Caption = "Test1フォームのCaption"  'そのフォームの標題を設定します
  Form_Test1.Visible = True                 '不可視状態で開かれたフォームを見えるようにします。
End Sub
Private Sub コマンド2_Click()
  Dim strFName As String
  strFName = "Test1"
  MsgBox "Forms(strfname).Caption = " & Forms(strFName).Caption
End Sub
Collectionオブジェクトを作る
次のサンプルフォームは連結フォームで複数のブックマークを設定するものです。
通常はひとつのブックマークの場合は変数を使い、複数の場合は配列変数を使えばいいわけですが、この例では新しいコレクションにブックマークを保存しています。
具体的な使い道というと、いまいち思いつかないのですが、複数のレコードを処理対象にするのにはいいかもしれませんね。複数選択のリストボックスでもいいことなのですけど・・・。
フォームに連結するテーブルはコードにはまったく関係がないので、なにを使っても構いません。
移動ボタンでレコードを移動し、適当にSetBookmarkボタンでマークします。そのとき、区別するためのキーワードを入力します。このキーワードがコンボボックスの値として登録され、コンボボックスで選択しGet Bookmarkボタンを押すと、ブックマークされたレコードを表示します。
フォーム・モジュールの宣言部でMyBookmarksというオブジェクト変数を宣言しています。キーワードNewで宣言すると、新しいコレクションのインスタンスとして定義されます。
通常、オブジェクト変数は Private MyBookmarks As Collectio と言う具合に宣言するのですが、この場合は Set ステートメントで参照するオブジェクトを設定しなくてはならないのですが、Newを使うと場合はその必要はありません。
下のコードリストのなかで、太字で表示した部分がポイントです。
Option Compare Database
Option Explicit

Private MyBookmarks As New Collection

Private Sub SetBookmark_Click()
  Dim strResponse As String
  strResponse = InputBox$("このブックマークに名前を付けてください")
  If Len(strResponse) = 0 Then Exit Sub
  With Me.BMcombo
    If Len(.RowSource) = 0 Or IsNull(.RowSource) Then
      .RowSource = strResponse
    Else
      .RowSource = .RowSource & ";" & strResponse
    End If
  End With
  'コレクションMyBookmarksにアイテム(現在のレコードのブックマーク)とキー(それに付けた名前)を追加する。
  MyBookmarks.Add Item:=Me.bookmark, Key:=strResponse
End Sub

Private Sub GetBookmark_Click()
  If IsNull(Me.BMcombo.Value) Or Len(Me.BMcombo.Value) = 0 Then
    MsgBox "ブックマークを選択してください"
  Else
    'コレクションのなかの該当するBookmarkをカレントフォームに反映する
    Me.bookmark = MyBookmarks(Me.BMcombo.Value)
  End If
End Sub

Private Sub ClearBookmarks_Click()   'コレクションからメンバーを削除する
  Dim intBM As Integer
  For intBM = MyBookmarks.Count To 1 Step -1
    MyBookmarks.Remove intBM  'ユーザー定義のCollectionの場合はインデックスは0ではなく1から始まるので要注意
  Next
  Me.BMcombo.RowSource = ""
  Me.BMcombo.Value = ""
End Sub
次のコードは上のとまったく同じフォームを使って、プロパティ・プロシージャを使用したものです。まったく同じ動作をします。
でも、読みにくいですね。かなり高度な方法ですが、これを使うメリットがよく分かりません。
Option Compare Database
Option Explicit

Private MyBookmarks As New Collection

Public Property Get CurrentBookmark(KeyValue As String) As String
'Property Getはプロパティの値を返すプロシージャ。Functionプロシージャと機能がほぼ同じ
'ユーザー定義コレクションMyBookmarksの指定されたキーの値を返す

  CurrentBookmark = MyBookmarks(KeyValue)
End Property

Public Property Let CurrentBookmark(KeyValue As String, strBookmark As String)
'Property Letはプロパティに値を設定する。Getより必ず引数の数がひとつ多い
'ここではブックマークとそのキーを設定している

  MyBookmarks.Add Item:=strBookmark, Key:=CStr(KeyValue)
End Property

Private Sub SetBookmark_Click()
  Dim strResponse As String
  strResponse = InputBox("このブックマークに名前を付けてください")
  If Len(strResponse) = 0 Then Exit Sub
  With Me.BMcombo
    If Len(.RowSource) = 0 Or IsNull(.RowSource) Then
      .RowSource = strResponse
    Else
      .RowSource = .RowSource & ";" & strResponse
    End If
  End With
  '下の行でフォームのユーザー定義プロパティCurrentBookmarkに現在表示しているレコードのBookmarkをセットする
  Me.CurrentBookmark(strResponse) = Me.bookmark
  '↑からProperty Letプロシージャへ飛ぶ。カッコ内のstrResponseはProperty Letの引数KeyValueに渡され渡され
   '等号右側の Me.Bookmark はstrBookmark に渡される。

End Sub

Private Sub GetBookmark_Click()
  If IsNull(Me.BMcombo.Value) Or Len(Me.BMcombo.Value) = 0 Then
    MsgBox "ブックマークを選択してください"
    Me.BMcombo.SetFocus
  Else
    'Letとは反対に、ここではCurrentBookmarkプロパティの値をフォームのBookmarkの値とします。
    'コンボボックスの値を引数にしてProperty Getプロシージャに飛ぶ

    Me.bookmark = Me.CurrentBookmark(Me.BMcombo.Value)
  End If
End Sub

Private Sub ClearBookmarks_Click()
  Dim intBM As Integer
  For intBM = MyBookmarks.Count To 1 Step -1
    MyBookmarks.Remove intBM
  Next
  Me.BMcombo.RowSource = ""
  Me.BMcombo.Value = ""
End Sub


Page Topへ戻る