打开表单时自动填写字段
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 事件中实现。
我有一个允许人们输入交货的表格。每个交付都有一个 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 事件中实现。