如何使用 VBA 代码填充表单上的 Access 2010 文本框
Posted
技术标签:
【中文标题】如何使用 VBA 代码填充表单上的 Access 2010 文本框【英文标题】:How to populate Access 2010 text boxes on a Form using VBA code 【发布时间】:2015-08-14 15:40:09 【问题描述】:我有一个 Access 2010 表单,其中包含 Year
、Policy Number
和 Type_Code
的三个组合框。在这些旁边我有一个政策查找按钮,在所有这些下方我有一个文本框,用于保存政策数据。
当用户从组合框中选择年份、保单编号和类型代码时,他们然后单击保单查找按钮。然后,策略查找按钮运行以下代码,以查找在组合框中选择的策略的策略数据。
Private Sub PolSearch_Click()
On Error GoTo Err_PolSearch_Click
Dim SQL As String
Dim BD, PRC, PP, I, RFD, TAD, CPYMT, LC, PN, TYP, RY As String
PN = Me!cboPN.Value
TYP = Me!cboTYP.Value
RY = Me!cboRY.Value
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT DISTINCT GA_Loss_Credit.Billing_Date AS BD,
GA_Loss_Credit.Practice_Code as PRC, GA_Loss_Credit.producer_premium as PP,
GA_Loss_Credit.Interest as I, " & _
" GA_Loss_Credit.Refund_Amount as RFD, GA_Loss_Credit.Balance_Due as TD,
GA_Loss_Credit.Payment_Amount AS CPYMT, " & _
" GA_Loss_Credit.Loss_Credit as LC " & _
" FROM [GA_Loss_Credit] " & _
(" WHERE (([GA_Loss_Credit].REINSURANCE_YEAR) ='" & [RY] & "')
AND (([GA_Loss_Credit].POLICY_NUMBER) ='" & [PN] & "')
AND (([GA_Loss_Credit].TYPE_CODE)='" & [TYP] & "')") & _
(" ORDER BY GA_Loss_Credit.Billing_Date ;"))
While Not rs.EOF
BDATE.SetFocus
If IsNull(BDATE.Value) Then
BDATE.Value = rs![BD]
ElseIf IsNull(BDate_2.Value) Then
BDate_2.Value = rs![BD]
ElseIf IsNull(BDate_3.Value) Then
BDate_3.Value = rs![BD]
ElseIf IsNull(BDate_4.Value) Then
BDate_4.Value = rs![BD]
ElseIf IsNull(BDate_5.Value) Then
BDate_5.Value = rs![BD]
ElseIf IsNull(BDate_6.Value) Then
BDate_6.Value = rs![BD]
ElseIf IsNull(BDate_7.Value) Then
BDate_7.Value = rs![BD]
ElseIf IsNull(BDate_8.Value) Then
BDate_8.Value = rs![BD]
ElseIf IsNull(BDate_9.Value) Then
BDate_9.Value = rs![BD]
ElseIf IsNull(BDate_10.Value) Then
BDate_10.Value = rs![BD]
End If
PCode_1.SetFocus
If IsNull(PCode_1.Value) Then
PCode_1.Value = rs![PRC]
ElseIf IsNull(PCode_2.Value) Then
PCode_2.Value = rs![PRC]
ElseIf IsNull(PCode_3.Value) Then
PCode_3.Value = rs![PRC]
ElseIf IsNull(PCode_4.Value) Then
PCode_4.Value = rs![PRC]
ElseIf IsNull(PCode_5.Value) Then
PCode_5.Value = rs![PRC]
ElseIf IsNull(PCode_6.Value) Then
PCode_6.Value = rs![PRC]
ElseIf IsNull(PCode_7.Value) Then
PCode_7.Value = rs![PRC]
ElseIf IsNull(PCode_8.Value) Then
PCode_8.Value = rs![PRC]
ElseIf IsNull(PCode_9.Value) Then
PCode_9.Value = rs![PRC]
ElseIf IsNull(PCode_10.Value) Then
PCode_10.Value = rs![PRC]
End If
rs.MoveNext
Wend
rs.Close
Exit_PolSearch_Click:
Exit Sub
Err_PolSearch_Click:
MsgBox Err.Description
Resume Exit_PolSearch_Click
End Sub
正在运行的查询最多可以为 Billing Dates
和 Practice Types
带回 10 条记录。
上述代码有效,但我的问题是;有没有更好的方法来代替编写十个不同的 IF Then Else 语句。
任何帮助/建议将不胜感激
【问题讨论】:
【参考方案1】:有更好的方法来做到这一点。您要做的是使用计数器,然后调用适当的控件。
首先,将第一个框重命名为“BDATE_1”,而不仅仅是“BDATE”
Dim controlCounter As Integer
.... other code
controlCounter = 1
While (Not rs.EOF) And controlCounter <= 10
Me.Controls("BDATE_" & controlCounter).Value = rs![BD]
Me.Controls("PCode_" & controlCounter).Value = rs![PRC]
controlCounter = controlCounter + 1
rs.MoveNext
Wend
....rest of code
请注意,我进行了额外检查,以确保计数器不会太大而超过您拥有的组合框。
此代码至少会填充您的框。可能有更好的方法来设计整个表单,例如使用列表框而不是一堆文本框来保存信息并将 listbox.recordsource 属性设置为您用于记录集的查询,但我不完全了解并且没有花时间弄清楚您的表单的确切意义是什么。
【讨论】:
感谢 OpiesDad,我会尝试在其中添加一个计数器,我什至没有想过要使用一个。我会告诉你进展如何。 OpiesDad,再次感谢您的反建议,它就像做梦一样。 before 是我使用的计数器 @Bassmas5 如果有效,请将其标记为答案。【参考方案2】:控制计数器 = 1 While (Not rs.EOF) and controlCounter
Me.Controls("BDATE_" & controlCounter).Value = rs![BD]
Me.Controls("PCode_" & controlCounter).Value = rs![PRC]
Me.Controls("PPrem_" & controlCounter).Value = rs![PP]
Me.Controls("Inter_" & controlCounter).Value = rs![I]
Me.Controls("RAmt_" & controlCounter).Value = rs![RFD]
Me.Controls("TDue_" & controlCounter).Value = rs![TD]
Me.Controls("PPay_" & controlCounter).Value = rs![CPYMT]
Me.Controls("LCR_" & controlCounter).Value = rs![LC]
controlCounter = controlCounter + 1
rs.MoveNext
Wend
rs.Close
【讨论】:
以上是关于如何使用 VBA 代码填充表单上的 Access 2010 文本框的主要内容,如果未能解决你的问题,请参考以下文章
Access VBA 引用 Active Form 上的文本框
有啥方法可以使用 VBA 更改 Microsoft Access 中表单上的 PopUp 属性?