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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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_Vba_Ms Access 2010 - Fatal编程技术网

Ms access 在设计视图中打开查询,编辑,然后拉取结果

Ms access 在设计视图中打开查询,编辑,然后拉取结果,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我想知道是否有人能帮我解决这个问题。我正在excel中创建一个宏,在“设计”视图中打开一个查询,以便对其进行编辑。然后运行查询并拉入结果。不幸的是,我不断得到错误,说这个记录集是不可编辑的。代码如下 'connect to Access Database Application.StatusBar = "Connecting to Access database..." Const DbLoc As String = "I:\Ben\New Stores\Reports\Scratch Repo

我想知道是否有人能帮我解决这个问题。我正在excel中创建一个宏,在“设计”视图中打开一个查询,以便对其进行编辑。然后运行查询并拉入结果。不幸的是,我不断得到错误,说这个记录集是不可编辑的。代码如下

'connect to Access Database
Application.StatusBar = "Connecting to Access database..."
Const DbLoc As String = "I:\Ben\New Stores\Reports\Scratch Reporting DB.accdb"
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim recCount As Long
Set db = OpenDatabase(DbLoc)
Set objAccess = CreateObject("Access.Application")
With objAccess
    .opencurrentdatabase (DbLoc)
    .docmd.openquery "OOS by DC5"
    .docmd.openquery "Today2"
    .docmd.openquery "Today2_intrans"
    .docmd.openquery "Today7"
    .docmd.openquery "Today7_InTrans"
    .docmd.openquery "OOS by Dept_Final", acViewDesign
End With

Set rs1 = db.OpenRecordset("OOS by DC5", dbOpenSnapshot)
Set rs2 = db.OpenRecordset("Today7_InTrans", dbOpenSnapshot)
Set rs3 = db.OpenRecordset("Today7", dbOpenSnapshot)
Set rs4 = db.OpenRecordset("OOS by Dept_Final", dbOpenSnapshot)

'copy recordset to spreadsheet
Application.StatusBar = "Writing Access data to spreadsheet..."
If rs1.RecordCount = 0 Then
MsgBox "No data retrieved from database", vbInformation + vbOKOnly, "No Data"
GoTo Subexit
Else
rs1.MoveLast
recCount = rs1.RecordCount
rs1.MoveFirst
End If
ws11.Range("A1").CopyFromRecordset rs1
ws11.Range("B" & recCount + 1).Formula = "=SUM(B1:B" & recCount & ")"
ws11.Range("C" & recCount + 1).Formula = "=SUM(C1:C" & recCount & ")"
ws18.Range("A1").CopyFromRecordset rs2
ws19.Range("A1").CopyFromRecordset rs3
ws8.Range("A1").CopyFromRecordset rs4
注;这是整个宏的一个片段,因此这里不声明我的变量。提前感谢您的帮助

以前的SQL

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17935] AS Expr1, [OOS by Dept2].[18363] AS Expr2, [OOS by Dept2].[18455], [OOS by Dept2].[18584] AS Expr3, [OOS by Dept2].[18593] AS Expr4, [OOS by Dept2].[18638] AS Expr5, [OOS by Dept2].[18649], [OOS by Dept2].[18695] AS Expr6, [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18810] AS Expr7, [OOS by Dept2].[18919], [OOS by Dept2].[18990] AS Expr8, [OOS by Dept2].[19720]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17935], [OOS by Dept2].[18363], [OOS by Dept2].[18455], [OOS by Dept2].[18584], [OOS by Dept2].[18593], [OOS by Dept2].[18638], [OOS by Dept2].[18649], [OOS by Dept2].[18695], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18810], [OOS by Dept2].[18919], [OOS by Dept2].[18990], [OOS by Dept2].[19720];
SQL后

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17052], [OOS by Dept2].[18220], [OOS by Dept2].[18272], [OOS by Dept2].[18455], [OOS by Dept2].[18614], [OOS by Dept2].[18633], [OOS by Dept2].[18645], [OOS by Dept2].[18649], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18919], [OOS by Dept2].[19720]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17052], [OOS by Dept2].[18220], [OOS by Dept2].[18272], [OOS by Dept2].[18455], [OOS by Dept2].[18614], [OOS by Dept2].[18633], [OOS by Dept2].[18645], [OOS by Dept2].[18649], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18919], [OOS by Dept2].[19720];
SQL常量

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name];

我想这样的事情应该适合你

将这些行添加到页面顶部

删除此行

最后添加此代码以更改SQL


编辑查询的代码在哪里?哪一行导致错误?是这一行docmd.openquery OOS by Dept_Final,acviewdesign是的,这是应该打开查询以便我可以编辑它的行,也是我获取错误代码的地方。这将尝试在Access中以设计模式打开查询-不确定这是您要查找的吗?您可以通过创建Querydef对象并使用Set qdf=db.QuerydefsOOS by Dept_Final引用它来更改SQL,然后通过qdf.SQL=new sqls更改SQL您介意发布一个这样的示例吗?我对此持开放态度,但我不是100%执行死刑。手动更新此查询的方法是在“设计”视图中按Dept_Final打开OOS,删除第三列中的所有内容,然后从链接表中拖动新值。所以如何从这个不断变化的表中获取新sql?请注意,如果这不是很清楚,很抱歉。。。如果你有任何问题,请告诉我。谢谢在设计模式下,单击查看| SQL并将SQL复制/粘贴到问题中-在对查询进行更改之前和之后。链接表的名称是否始终相同?链接表中的字段是否总是相同的?@Mnathan修改了代码,使用querydf qdf2而不是Tabledef tdfAh,我明白了。。。所以现在我在'strNewFields=strNewFields&'行上获取对象变量not set error@把qdf改成QDF2太棒了!在我记下你的答案之前,先做几件事。1仍然不确定为什么在代码使用access时打开该工作簿…可能是因为它链接到了数据库,而这就是查询的更新方式?不确定。。。宏的末尾关闭并保存报告文档“wb4.close true”,但当尝试运行该代码时,我会收到运行时错误“Automation error”消息。知道为什么会发生这种情况/如何解决它吗?什么工作簿?wb4.close在代码中的什么位置?哪一行发生自动错误?我认为你需要提出一个新问题
Const QDF_MODIFY    As String = "OOS by Dept_Final"

Const BASIC_FIELDS  As String = "SELECT dept2.MaxOfDept, deptname.[Department Name]<INSERT FIELDS> "
Const BASIC_SQL As String = "FROM [OOS by Dept2] AS dept2 LEFT JOIN [dept name] AS deptname ON dept2.MaxOfDept = deptname.Dept "
Const GROUPBY_FIELDS As String = "GROUP BY dept2.MaxOfDept, deptname.[Department Name] <INSERT FIELDS> "
' Add these lines to top
Dim qdf  As DAO.QueryDef
Dim qdf2 As DAO.QueryDef

Dim strNewFields As String
Dim strNewSQL As String
Dim iField  As Integer
'.docmd.openquery "OOS by Dept_Final", acViewDesign
' Change these to Querydef qdf2 references
Set qdf2 = db.QueryDefs("OOS by Dept2")
' Zero based index - ignore first field MaxOfDept
For iField = 1 To qdf2.Fields.Count - 1
    strNewFields = strNewFields & ", dept2.[" & qdf2.Fields(iField).Name & "]"
Next
qdf2.Close

' Insert new fields and rebuild SQL
strNewSQL = Replace(BASIC_FIELDS, "<INSERT FIELDS>", strNewFields)
strNewSQL = strNewSQL & BASIC_SQL
strNewSQL = strNewSQL & Replace(GROUPBY_FIELDS, "<INSERT FIELDS>", strNewFields)
Debug.Print strNewFields

' Replace the SQL
Set qdf = db.QueryDefs(QDF_MODIFY)
qdf.SQL = strNewSQL
qdf.Close