2009-09-04 19 views
0

私は2つのアクセスフォームを持っています。 frm_Mainとfrm_Subは、メインフォームの選択に応じて条件付きで表示されるデータを持ちます。私は、frm_Subに表示されている項目のselect all関数を記述する必要があります。 VBAでは、frm_Subに現在表示されているIDのリストを取得する方法がありますか?例えばVBA - 値のコレクションへのアクセス

、私はこの

me.controls("Svc_Tag_Dim_Tag_Num").value 

は、私がfrm_Subの行のいずれかの値を取得しない場合、すべての値を取得する方法はありますか?

多分私は別の方法で尋ねることができます。私はリストビューとして表示されるフォームを持って、VBAで、特定の列からすべての値を取得する方法はありますか?

答えて

1

別のオプションは、サブフォームが表示するレコードセットのPKを連結する関数を記述することです。あなたのメインフォームがCompanyで、サブフォームに従業員がリストアップされているとします。サブフォームコントロールのLinkMasterFieldsとLinkChildFieldsプロパティはCompanyID(CompanyテーブルのPK、EmployeesテーブルのFK)になります。したがって

、親が特定の会社の記録にあるときに、サブフォームに表示されるレコードの同じセットを取得する:

Dim db As DAO.Database 
    Dim strSQL As String 
    Dim rst As DAO.Recordset 
    Dim strEmployeeIDList As String 

    Set db = CurrentDB 
    strSQL = "SELECT Employees.* FROM Employees WHERE CompanyID=" 
    strSQL = strSQL & Me!CompanyID & ";" 
    Set rs = db.OpenRecordset(strSQL) 
    If rs.RecordCount > 0 Then 
    With rs 
     .MoveFirst 
     Do Until .EOF 
     strEmployeeIDList = strEmployeeIDList & ", " & !CompanyID 
     .MoveNext 
     Loop 
    End With 
    strEmployeeIDList = Mid(strEmployeeIDList, 3) 
    End If 
    rs.Close 
    Set rs = Nothing 
    Set db = Nothing 

、なぜあなたはこれを行う代わりにalready-を歩くだろう開いたレコードセット(つまり、サブフォームのRecordsetClone)?私は分かりません。特定のフォーム/サブフォームにルックアップを関連させたくない場合があります。連結してレコードセットを受け取り、上記のように宣言されたレコードセットを渡すか、サブフォームのRecordsetCloneに渡すことで、それを修正できます。その場合、フォーム/サブフォームに束縛されることなく連結機能をどちらかの方法で使用することができます。

1

私はあなたの質問を理解する場合は、コントロールの行ソース列を0から始まることを示すColumn(x)を使用して、コントロール内のID値にアクセスできる必要があります。例えば、IDが幅0の列0 VBAはそれをme.controls ["Svc_Tag_Dim_Tag_Num"]。column(0)として "見る"ことができます。あなたのような機能に何か作成することができ、フォームのクラスモジュールの外部から直接、サブフォームのレコードソースで取得するには

:これは別のモジュールに含まれると呼び出されたときにされるだろう

Public Function test_get_sub_form_record_set() As String 
    Dim dbs As Database 
    Dim rst As Recordset 
    Dim xcat As String 
    Set dbs = CurrentDb() 
    Set rst = [Forms]![Your Main Form Name]![Your Sub-form Name].[Form].RecordsetClone 
    If rst.RecordCount > 0 Then 
     rst.MoveFirst 
     xcat = rst!ID 
     rst.MoveNext 
     Do While Not rst.EOF 
      xcat = xcat & ", " & rst!ID 
     Loop 
    Else 
     xcat = "" 
    End If 
    test_get_sub_form_record_set = xcat 
    rst.Close 
    Set dbs = Nothing 
End Function 

は、連結を返しますIDのカンマ区切りリスト。

+0

Do Whileループ内にMoveNextを追加します。それ以外の場合は、... boomまで同じ値を繰り返し連結します! – HansUp

+0

また、使用しているレコードセットが既に存在する場合、新しいレコードセットポインタを設定するための送信もほとんど行いません。上記のコードは "WITH Me!SubForm.Form.RecordsetClone"を使用して書き換えられ、作成したレコードセット変数をクリーンアップする必要があります(おそらく、上記のコードで閉じないでください。閉じていないレコードセット、つまりサブフォームのRecordsetCloneで実際に動作しています)。 –

関連する問題