打开表单时自动填写字段

Automatically filling a field when a form is opened

我有一个允许人们输入交货的表格。每个交付都有一个 ID,自动编号功能可以工作,除非我需要适应我组织以前的交付编号方案,所以我不能简单地自动编号 1、2、3 等。

我需要的是 ID 字段是字符串 "DD",后跟日期 m/d/y,然后是表示该日期交货的数字。

所以今天的第一批货物是 DD0427151,然后下一批是 DD0427152,明天第一批是 DD0428151,依此类推。

我正在尝试编写 VBA 代码,以便在活动期间,当打开表单时,它将表单的 ID 区域设置为我想要的。这是我正在使用的代码,但失败了:

Private sub Form_Open(cancel as Integer) 
ID.Value="DD" & Date()
end sub

我知道这不会完全符合我的要求,但如果我能让它工作,那么我可以使用 if then 语句来处理我认为的其余部分。

我收到一条错误消息 "You can't assign a value to this object"

有什么想法吗?

您可能需要 post 更多代码,如果需要,我可能会稍微修改一下这个答案。

有多种方法可以解决这个问题,但这里有一种简单的方法。

假设您在名为 "IdBox" 的表单上创建了一个文本框,并且您的表单名为 "MyUserForm" 那么您可以这样做:

Dim MyForm As MyUserForm
Set MyForm = New MyUserForm
MyForm.IdBox.Text = "DD" & Date()
MyForm.Show

这应该能让您得到想要的结果。

更好的做法是在您的表单中创建一个 属性:

Private pID As String
Public Property Let ID(value As String)
    pID = value
End Property
Public Property Get ID() As String
    ID = pID
End Property

然后在创建您的来源后设置 属性 的值:

Dim MyForm As MyUserForm
Set MyForm = New MyUserForm
MyForm.ID = "DD" & Date()
MyForm.Show

但是您还需要将激活事件处理程序添加到您的表单中:

Private Sub UserForm_Activate()
    Me.IdBox.Text = Me.ID
End Sub

这样就可以了。

还有一个 .Tag 属性 可以使用,但我认为这大致等同于使用 public 或全局变量。反正差不多。您可以在其他地方查找详细信息。

Form Open 分配任何内容都太早了。最好使用的方法是负载或电流。也就是说,Current 会更合适,因为 Load 在打开表单时仅触发一次。每次流经记录时都会触发电流。

考虑到您的特定情况,这可能有点棘手,更不用说非常规了。 fundamental principle of DB design 建议 Data 应该是原子的 ,考虑到您的情况,您将多个组件存储在一个字段中。这不仅违反了设计原则,而且忽略了索引和优化的概念。

综上所述,这就是您的代码可能需要的内容。

Private Sub Form_Current()
    Dim tmpID as String, tmpCtr As Long
    tmpCtr = 1
    If Me.NewRecord Then
        Me.yourControlName = "DD" & Format(Date(), "mmddyy") & tmpCtr
        While DCount("*", "yourTableName", "fieldName = '" & Me.yourControlName & "'") <> 0 
            tmpCtr = tmpCtr + 1
            Me.yourControlName = "DD" & Format(Date(), "mmddyy") & tmpCtr
        Wend
    End If
End Sub 

如果系统由多个用户使用,这是解决方案的一部分。该代码还需要在 BeforeUpdate 事件中实现。