2014-10-06 141 views
0

我有2个字段 - txtTR1_Unit和cmbTR2_Unit。这两个字段共同表示总单元。 cmbTR2_Unit有一个唯一值列表,当选中时 - txtTR1_Unit自动获取相关值。SetFocus被忽略 - 为什么?

我创建了一个名为Tier1from2的函数 - 接受'string'并返回相关的Tier1值。

因此,当我更新我的After_Update事件cmbTR2_Unit时,我想自动选项卡到下一个字段。 - 另一个组合框。我认为我不应该设置任何焦点,因为它会在更新后自动进入下一个字段。

txtTR1从我的函数中得到更新,但它只是坐在那里,不会去下一个字段。所以我已经试图在更新后的'SetFocus'到下一个字段。

还是不行。我错过了什么??

Private Sub cmbTR2_UNIT_AfterUpdate() 
     If Len(Me.cmbTR2_UNIT.Value) <> 0 Then 
     Me.txtTR1_UNIT.Value = Tier1From2(Me.cmbTR2_UNIT.Text) 
     'cmb_CostCenter.setfocus - 'this doesn't seem necessary - but it doesn't work anyway. 

     End If 

    End Sub 

作为测试我试图消除功能“Tier1From2(Me.cmbTR2_UNIT.text)”简单地硬编码在txtTR1_UNIT词“结果”,它工作顺利。我知道我以前写的更简单的功能,但我还没有在一段时间触及VBA - 如何简化此功能:

Private Function Tier1From2(strTier2 As String) As String 

    Dim qdf As DAO.QueryDef 
    Dim db As DAO.Database 
    Dim strQry As String 
    Dim rs As Recordset 

    Set db = CurrentDb 
    Set qdf = db.QueryDefs("qUNIT_HUB") 

    strQry = "SELECT Tier1_Unit, Tier2_Unit " & _ 
    " FROM LTBL_Cost_Collector " & _ 
    " GROUP BY Tier1_Unit, Tier2_Unit " & _ 
    " HAVING (((Tier2_Unit) = '" & strTier2 & "'));" 


    qdf.SQL = strQry 
    db.QueryDefs.Refresh 

    Set rs = db.OpenRecordset(strQry) 


    Tier1From2 = rs![Tier1_Unit] 

    Set db = Nothing 
    Set qdf = Nothing 
    Set Recordset = Nothing 


End Function 
+0

您是否已经设置了选项卡排序控件,以便它们在层次结构中相互关联?如果您不这样做,默认的Tab键顺序就是创建顺序,可能不是您所期望的。 – Markus 2014-10-06 21:43:12

+0

cmb_CostCenter是在一个框架还是多页面? – 2014-10-06 22:18:09

+0

是,标签顺序已设置。我已经将txtTR1_Unit设置为“TabStop:NO”,cmb_CostCenter目前仅处于相同的形式。我担心的是,当我从cmbTR2_Unit中选择一个值并按Tab键时,窗口会发出不适当的铃声。就好像Tab不可用。然而,如果我不选择一个价值,我可以毫无问题地挑选。 MS Access的版本是2007. – monty327 2014-10-06 23:19:39

回答

0

原来的东西在这个函数是导致该领域,并形成松散焦点。 db.QueryDefs.refresh也许?解决方案是更新我的功能如下

Private Function Tier1From2(strTier2 As String) As String 
    Dim rs As DAO.Recordset 
    Dim db As DAO.Database 
    Dim strSQL As String 
    Dim strTier1 As String 

    Set db = CurrentDb 

    strSQL = "SELECT Tier1_Unit, Tier2_Unit " & _ 
    " FROM LTBL_Cost_Collector " & _ 
    " GROUP BY Tier1_Unit, Tier2_Unit " & _ 
    " HAVING (((Tier2_Unit) = '" & strTier2 & "'));" 

    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) 

    strTier1 = rs!Tier1_Unit 

     Set rs = Nothing 
     Set db = Nothing 

    Tier1From2 = strTier1 
End Function 

这工作顺利。