我一直在为我们的培训机构创建一个主屏幕。在这个主屏幕中,我创建了一个按钮,用于启动教师将用于输入培训评估的表单。我已经请求建立一个额外的按钮,它将启动一个不同的形式,以便教师可以为每个问题提供平均分数,并说出有多少人参加了课程。提交此表单后,需要创建与参与者一样多的记录,以便在运行报告时每天的平均权重可以正常。
我找不到符合我需要的解决方案,但这里是我尝试使用的按钮的VBA:
DoCmd.RunMacro“DuplicateRecord”,Forms!Feedback_Form!Attendees
这对我来说似乎没有任何作用。我知道这很简单,但我是VBA的新手。
最好的方法是什么?
答案 0 :(得分:0)
不幸的是,从您的描述中我无法理解,特别是因为我无法看到您桌子的结构。 无论如何,让我们讨论如何将记录从表复制到另一个表。 有很多方法可以做到这一点(像往常一样)。 我告诉你两个 第一个是一个非常紧凑的复制记录解决方案(在你的情况下只有一个)。
如果你是vba的新手,那么第二个会有点棘手,但是你可以更好地控制你正在做的事情。 我个人更喜欢第二种解决方案
第一个解决方案 - 使用SQL SELECT INTO指令
SQL事务是
SELECT *
INTO TargetTable
FROM SourceTable WHERE Condition;
在此示例中, newtable 是您要复制记录的目标表名称。 SourceTable 是要从中复制记录的表的名称 条件是选择要复制的记录的条件。如果您的记录有ID字段(例如,名为ID),则条件可以是 ID = NumID ,其中NumID是要复制的记录的ID值。
您如何使用此交易? 您可以为SQL语句构建一个字符串,然后执行它。
Private Sub CopyRecord(lngID As Long, strSourceTable As String, strTargetTable As String)
Dim strSQL as string
strSQL = "SELECT * INTO " & strTargetTable " FROM " & strSourceTable & " WHERE ID=" & CStr(lngID)
DoCmd.RunSQL strSQL
End Sub
可以从您以某种方式访问某个记录的表单中调用此子例程
Call CopyRecord(Me.ID,"SourceTable", "TargetTable") ' Copy record
DoCmd.OpenForm "frmFeedback_Form", ,acNormal,"ID = "+CStr(Me.ID) ' Open 2nd form @ new record
第二个解决方案 - 使用DAO.RECORDSET 使用此解决方案,您可以在复制期间修改字段的内容。 您还可以为2个不同的表使用不同的名称。在第一种情况下,您使用相同的字段名称物理复制记录。
Private CopyRecord(lngID As Long, strSourceTable As String, strTargetTable As String)
dim rsSource as DAO.RecordSet
dim rsTarget as DAO.RecordSet
Set rsSource = CurrentDb.OpenRecordSet("SELECT * FROM SourceTable WHERE ID = " & CStr(lngID),dbOpenDynaset) ' Open Source Table
Set rsTarget = CurrentDb.OpenRecordSet("SELECT * FROM SourceTable WHERE ID = " & CStr(lngID),dbOpenDynaset) ' Open Target Table
if rsSource.EOF Then Exit Sub ' Exit if no record is selected
rsTarget.AddNew ' Append a new record to destination table
rsTarget!TrgtField1 = rsSource!SrcFields1 ' Copy Source field 1 into target field 1
rsTarget.TrgtField2 = rsSource!SrcFields2 ' Copy Source field 2 into target field 2
...
rsTarget.Update ' Save new record
rsTarget.Close ' Close Recordset
rsSource.Close ' Close Recordset
Set rsSource = Nothing ' Free memory
Set rsTarget = Nothing ' Free memory
End Sub
子程序的调用与第一种情况相同。
请注意我已注意到目标记录的ID字段。 这非常重要,因为如果您使用带有自动编号的ID字段(KEY)(像往常一样),您不必为其分配任何内容,因为插入后它会自动生成新记录。
请告诉我这是否适合您。
再见: - )