如何使用 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 表单,其中包含 YearPolicy NumberType_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 DatesPractice 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 上的文本框

Access 子表单中的字段名称填充了 vba 记录集

在 VBA Access 中动态填充其他子表单的子表单

有啥方法可以使用 VBA 更改 Microsoft Access 中表单上的 PopUp 属性?

尝试使用 sql/vba 的结果填充文本框并出现 #Name 错误

如何使用以下 VBA 代码在生成“另存为”对话框并导出 Access 查询的表单上创建命令按钮?