Ms access 请参阅OpenArgs以识别字段名

Ms access 请参阅OpenArgs以识别字段名,ms-access,vba,ms-access-2013,Ms Access,Vba,Ms Access 2013,我在尝试使用OpenArgs引用表中的字段名时遇到了一些问题。我对这件事还不太熟悉,所以请容忍我 所以我有一个报告(CourseCatalog),它有一个文本框,其中包含从表(tblCourses)中提取的课程名称。当你点击一门课程时,它会打开一个表格,让你可以选择对课程进行评分(frmRate)。我使用OpenArgs(从报告到评级表)为frmRate制作标题。很好 现在我需要获取前面在代码中定义的数据(所选的星数,(intNumStars)),并将其放入表中。该表(“Allratings”)

我在尝试使用OpenArgs引用表中的字段名时遇到了一些问题。我对这件事还不太熟悉,所以请容忍我

所以我有一个报告(CourseCatalog),它有一个文本框,其中包含从表(tblCourses)中提取的课程名称。当你点击一门课程时,它会打开一个表格,让你可以选择对课程进行评分(frmRate)。我使用OpenArgs(从报告到评级表)为frmRate制作标题。很好

现在我需要获取前面在代码中定义的数据(所选的星数,(intNumStars)),并将其放入表中。该表(“Allratings”)有课程名称(OpenArgs值)作为列名,我想将intNumStars(1-5)放入这些列的单元格中

我似乎在提到瓦拉格家族时遇到了一些问题。我的语法/逻辑可能(可能)错误,如果有人知道更好的方法来完成这项任务,请告诉我你的想法!谢谢大家!

Private Sub btnSubmit_Click()
Dim varargs
Dim rst As dao.Recordset
Dim db As dao.Database
Dim fld As dao.Field
varargs = Me.OpenArgs
Set db = CurrentDb()
Set rst = db.OpenRecordset("Allratings")

For Each fld In rst.Fields
    If fld.Name = "varargs" Then
        rst.AddNew
        rst!"varargs" = intNumStars
        rst.Update
    End If
Next

End Sub

您正在使用字符串执行奇怪的操作,当您尝试保存/编译此字符串时,应该会出现描述性编译错误

varargs
指变量
varargs

“varargs”
是一个文本字符串,包含字母v、a、r等

rst!“varargs”
应该是
rst.Fields(“varargs”)
以避免编译错误,但实际上应该是
rst.Fields(varargs)

如果您更正了所有不正确的引号,您将得到:

Private Sub btnSubmit_Click()
Dim varargs As String
Dim rst As dao.Recordset
Dim db As dao.Database
Dim fld As dao.Field
varargs = Me.OpenArgs
Set db = CurrentDb()
Set rst = db.OpenRecordset("Allratings")

For Each fld In rst.Fields
    If fld.Name = varargs Then
        rst.AddNew
        rst.Fields(varargs) = intNumStars
        rst.Update
    End If
Next
End Sub

如果
Me.OpenArgs
只包含一个字段名,那么这似乎是有效的Eric已经演示了如何使代码工作,但是您的表设计将被证明是不切实际的。为每门新课程添加一个新列不是处理数据库的方式

我建议

tbl课程

+----------+------------+
| CourseID | CourseName |
+----------+------------+
|        1 | foo        |
|        2 | bar        |
+----------+------------+
+--------+----------+
| UserID | UserName |
+--------+----------+
|      7 | John     |
|      8 | Kate     |
+--------+----------+
tblUsers

+----------+------------+
| CourseID | CourseName |
+----------+------------+
|        1 | foo        |
|        2 | bar        |
+----------+------------+
+--------+----------+
| UserID | UserName |
+--------+----------+
|      7 | John     |
|      8 | Kate     |
+--------+----------+
所有评级(这是一个)

因此,新评级是
allRatings
中的新记录,具有固定的列名。您可以通过调用
DLookup
从传递的课程名称中获取
CourseID


通过交叉表查询

可以查看课程及其评分作为列的视图,该表(“Allratings”)以课程名称作为字段名称-如果这是真的(您并不意味着课程名称有一列),这是一个糟糕的设计。这应该是一个连接表(参见Wikipedia)。我在这里说错了,是列名,而不是字段名。我编辑这篇文章是为了反映更正。重要的是,我的任务是设计一个数据库,对我们的课程进行评分,并创建一个目录,显示所有使用stars的评论的平均评分。因此,我以这种方式设置表的原因是为了使使用字段名查找DAvg(无条件)变得更容易。我不太懂VBA。是否可以使用连接表来查找所有提交的评分的平均值?是的,这对于聚合(分组)查询来说是微不足道的。我假设我犯了一些类似的错误。我不知道引用对象时何时使用引号,何时不使用引号。然而,在做了您建议的更正之后,我遇到了与以前相同的问题。我没有出错,但什么也没发生。保存数据的表没有很好地保存评级,这可能是因为
Me.OpenArgs
永远不等于
fld.Name
。这是数据库中其他地方的问题。