我有一张允许人们输入货物的表格。每个交付都有一个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语句来处理我认为的其余部分。
我收到错误说"您无法为此对象分配值"
有什么想法吗?
答案 0 :(得分:1)
表单打开过早分配任何东西。最好的使用方法是Load或Current。这样说,Current更合适,因为在打开表单时只会触发一次Load。每次进入记录时都会触发电流。
考虑到你的特殊情况,这可能有点棘手,更不用说非常规了。 fundamental principle of DB design表示数据应该是原子,考虑到您在一个字段中存储多个组件的情况。这不仅违反了设计原则,而且忽略了索引和优化的概念。
所有这一切,这就是您的代码可能需要的。
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事件中实现。
答案 1 :(得分:0)
您可能需要发布更多代码,如果您这样做,我可能会稍微修改一下这个答案。
有很多方法可以解决这个问题,但这是一个简单的可能性。
假设您在表单上创建了一个名为&#34; IdBox&#34;的文本框。你的表格被称为&#34; MyUserForm&#34;然后你可以这样做:
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
然后在创建from后设置该属性的值:
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属性,但我认为这大致相当于使用公共变量或全局变量。大概无论如何。您可以在其他地方查找详细信息。