打开表单时自动填写字段

时间:2015-04-27 16:41:28

标签: vba ms-access access-vba ms-access-2010

我有一张允许人们输入货物的表格。每个交付都有一个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语句来处理我认为的其余部分。

我收到错误说"您无法为此对象分配值"

有什么想法吗?

2 个答案:

答案 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属性,但我认为这大致相当于使用公共变量或全局变量。大概无论如何。您可以在其他地方查找详细信息。