Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MS Access错误3464-对INSERT INTO语句中的字段使用变量_Ms Access_Vba - Fatal编程技术网

Ms access MS Access错误3464-对INSERT INTO语句中的字段使用变量

Ms access MS Access错误3464-对INSERT INTO语句中的字段使用变量,ms-access,vba,Ms Access,Vba,我正在尝试使用vba运行查询,在INSERT INTO语句中使用一个变量来选择要使用的字段。我做了一些研究,发现了一些类似的问题,解决方案是创建一个带有变量的函数,并在sql语句中调用该函数,但我仍然遇到了一些问题。如果我硬编码这个字段,它就会工作。提前谢谢。以下是我目前的代码: Option Compare Database Public var As Variant Public Function GetVar() As String GetVar = var End Functi

我正在尝试使用vba运行查询,在INSERT INTO语句中使用一个变量来选择要使用的字段。我做了一些研究,发现了一些类似的问题,解决方案是创建一个带有变量的函数,并在sql语句中调用该函数,但我仍然遇到了一些问题。如果我硬编码这个字段,它就会工作。提前谢谢。以下是我目前的代码:

Option Compare Database
Public var As Variant

Public Function GetVar() As String
    GetVar = var
End Function

Sub Build()

Dim varX As String
Dim count As Integer
Dim AccountName As String

For count = 1 To 50

    varX = DLookup("[AcctName]", "AcctTable", "[AcctNum] =" & count)
    AccountName = varX
    var = varX


    StrSql = "INSERT INTO [Testresult] (Year, Period, Entity, Region, [Product Recall], Account, AcctVal)" & _
    " SELECT Year, Period, Entity, Region, [Product Recall], """ & AccountName & """, getvar() FROM [MFTest] "

    CurrentDb().Execute StrSql, dbFailOnError

    Next count

End Sub

看起来您正在从MfTest中提取每条记录,并将账号1-50的每条记录都添加到新表中。如果是这样的话,你会喜欢这项工作吗

INSERT INTO [Testresult]
([Year], [Period], [Entity], [Region], [Product Recall], [Account], [AcctVal])
SELECT
  [MFTest].[Year], [MFTest].[Period], [MFTest].[Entity], [MFTest].[Region],
  [MFTest].[Product Recall], [AcctTable].[AccountName], [AcctTable].[AccountName]
FROM
  [MFTest],
  [AcctTable]
WHERE
  [AcctTable].[AcctNum] between 1 and 50
作为单个语句,而不是在循环中

唯一需要注意的是,上面的代码还应该包括没有此类账号的空格——这可能是您想要的,但我直觉上怀疑不是,因为您会为每个非账号重复空格

顺便说一下,这是一个笛卡尔连接,通常是偶然完成的,但在这种情况下,它似乎是您想要的


如果这不起作用,我建议在insert查询中添加参数。即使您可以让它工作,参数绑定变量也是一种更好的做法,从长远来看,它将为您省去麻烦。

添加调试。将StrSql打印到CurrentDb.Execute之前的行中,然后运行代码。当您再次出现错误3464时,从即时窗口复制StrSql文本并显示给我们。您可以使用Ctrl+g转到即时窗口。此外,当您得到错误时,var的值是多少?以下是打印输出:插入[Testresult]年、期间、实体、地区、[Product Recall],帐户、会计科目选择年、期间、实体、地区、[Product Recall],其他毛保费,从[MFTest]获取var。Var=其他总保费。我试图从表中提取其他字段,我认为这是引号的问题?那么如果您更改&AccountName&to&AccountName&try.,[&AccountName&],…也将语句中的两个位置更改为[Year],以区分字段和Year函数,您是否得到了想要的结果。Hambone,实际上,我想做的是将多列数据表重新格式化为单列表。我试图使用一个变量来选择数据列,但无法获得正确的语法。Nathan_Sav和HansUp回答了我的问题。谢谢