如何使用VBA在MS Access中添加新记录?

问题描述 投票:0回答:4

我正在使用绑定表单供用户更新新客户或现有客户的信息。现在,我在提交按钮上使用“添加新记录”宏(因为我不确定如何通过 VBA 添加或保存新记录)。

我添加了一个更新前事件(使用 VBA),让用户在退出表单之前确认他们想要保存更改。由于某种原因,这会覆盖添加记录按钮,现在用户在退出表单之前无法添加新记录。

如何使用VBA将新的客户信息添加到正确的表中?这是应该用宏来完成的事情吗?

更新前表格代码:

Private Sub Form_BeforeUpdate(Cancel As Integer) 
Dim strmsg As String 
strmsg = "Data has been changed." 
strmsg = strmsg & " Save this record?" 
If MsgBox(strmsg, vbYesNo, "") = vbNo Then 
    DoCmd.RunCommand acCmdUndo 
Else 
End If 
End Sub

添加录制按钮:

Private Sub btnAddRecord_Click() 
Dim tblCustomers As DAO.Recordset 

Set tblCustomers = CurrentDb.OpenRecordset("SELECT * FROM [tblCustomers]") 
tblCustomers.AddNew 
tblCustomers![Customer_ID] = Me.txtCustomerID.Value 
tblCustomers![CustomerName] = Me.txtCustomerName.Value 
tblCustomers![CustomerAddressLine1] = Me.txtCustomerAddressLine1.Value 
tblCustomers![City] = Me.txtCity.Value 
tblCustomers![Zip] = Me.txtZip.Value 
tblCustomers.Update 
tblCustomers.Close 
Set tblCustomers = Nothing 
DoCmd.Close 
End Sub
vba forms ms-access button
4个回答
9
投票

为了使用 VBA 提交记录,请为按钮创建一个

On Click
事件,并在其中
Sub
运行以下命令:

Private Sub submitButton_Click()

    'All the code to validate user input. Prompt user to make sure they want to submit form, etc.

    DoCmd.RunSQL "INSERT INTO tblCustomers (CustomerID, CustomerName, CustomerAddressLine1, City, Zip) values (txtCustomerID.Value, txtCustomerName.Value, txtCustomerAddressLine1.Value, txtCity.Value, txtZip.Value)"

End Sub

在此子中,您可以添加所有想要验证用户输入的值的代码,并选择是否要提交记录。使用 VBA 提交表单有很多控制,因此您不需要

BeforeUpdate
事件。

此外,请勿使用此方法绑定表单。我不知道会有什么后果,但我不会尝试。 Access 非常适合入门,但当您想做更复杂的事情时,仅使用 VBA 会更容易。


1
投票

附注: 我注意到通过 VBA 功能添加记录(如在“添加记录按钮”代码中)比使用 DoCmd.Run SQL“INSERT INTO...”快约 400 倍: 与 5 列表(ID+4 短字符串)的 140 条记录/秒相比,约为 55k 条记录/秒。

这对于表单而言没有实际意义,其中数据是手动输入的,但如果表单生成更多记录,这可以节省大量时间。


1
投票

您会为表单创建一个更新前事件以在关闭之前创建提示,这似乎很奇怪。也许您应该尝试使用 on close 事件。如果您想使用 vba 从表单中添加新记录,您可以简化您的语句。我在为 Access DB 设计自己的表单时遇到了类似的情况。这段代码已经过测试并且可以工作:

Dim sVIN As String
Dim sMake As String
Dim sModel As String
Dim sColor As String
Dim sType As String
Dim intYear As Integer

sVIN = Me.txtVIN.Value
sMake = Me.txtMake.Value
sModel = Me.txtModel.Value
sColor = Me.txtColor.Value
sType = Me.comboType.SelText
intYear = Me.txtVehicleYear.Value

DoCmd.RunSQL "INSERT INTO Vehicles (VIN, Make, Model, VehicleYear, Color, Type) VALUES ('" & sVIN & "', '" & sMake & "', '" & sModel & "', " & intYear & ", '" & sColor & "', '" & sType & "')"

如果您在项目中仅使用一个数据库并且在启动时进行连接,有时可以运行简单的 DoCmd.RunSQL 语句,如下所示。您可以采用此处的语法并将其适应您自己的项目。我自己从 W3 学校学到了基本语法。学习编写 SQL 查询的好网站。还应该注意的是,这里不包括验证测试。您应该确保它包含在表单验证规则或 vba 代码中。还有一件事......在您的 SQL 中,您似乎正在尝试从文本框条目为 ID 列分配一个值;如果 ID 是自动编号列,则不要这样做。 ID 列通常会自动分配一个数字,因此您不需要(或不想)为其指定插入值。


0
投票

以下代码可用于克服 Microsoft Access 表中 255 个字段的限制并向子表添加记录:

可以使用相同的主键字段(例如ID)制作关联表。在父表中,将 ID 设置为自动编号,在子表中将 ID 设置为数字(整数)。不要将它们都设置为自动编号。使用“引用完整性”、“级联更新”和“级联删除”建立关系。 仅将自定义表单用于附加,这是用户通常使用的。当他们单击追加新记录时,表单将触发新父记录插入后的 AfterInsert 代码: (您可以为 fMyParentForm、MyChildTable 和 MyUniqueID 插入 3 个变量。)

Private Sub Form_AfterInsert()
    'Add record to Child table after adding ID to Parent table
    Dim frmParent As String
    Dim tblChild As String
    Dim fldId As String
    Dim nId As Integer
    frmParent = "fMyParentForm"
    tblChild = "MyChildTable"
    fldId = "MyUniqueID"
    nId = Forms(frmParent).Controls(fldId)
    If 1 = MsgBox("Add to " & tblChild & "." & fldId & "=" & nId & Chr(13) & "(recommended)",   vbOKCancel) Then
        Set recChild = CurrentDb.OpenRecordset("select * from " & tblChild)
        recChild.AddNew
        recChild![ID] = nId
        recChild.Update
        recChild.Close
        Set recChild = Nothing
        Me.Refresh
    Else
        MsgBox ("No Change")
    End If
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.