我正在尝试使用单元格中的值对访问数据库运行Excel Power查询,但一直遇到错误。我通过VBA运行查询的经验接近于0,因此最终从宏记录器中获取了90%的代码,为造成的混乱感到抱歉。
我已经针对该值运行了msgboxes以确保它们正确提取了所有内容,但是我不确定我是否正确引用了暗淡的值。
Sub QueryMacro()
'
' QueryMacro Macro
'
Dim DayRange, MonthRange, YearRange As Range
Dim YR, MR, DR As String
Set DayRange = ThisWorkbook.Sheets(1).Range("A2")
Set MonthRange = ThisWorkbook.Sheets(1).Range("B2")
Set YearRange = ThisWorkbook.Sheets(1).Range("C2")
YR = YearRange.Value
MR = MonthRange.Value
DR = DayRange.Value
ActiveWorkbook.Queries.Add Name:="Task Track", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Access.Database(File.Contents(""C:\Folder\Database_be.accdb""), [CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & " #""_Task Track"" = Source{[Schema="""",Item=""Task Track""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Filtered Rows"" = Table.SelectRows(#""_Task Track"", each [DTE] = #datetime(YR, MR, DR, 0, 0, 0))" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & _
"" & Chr(10) & " #""Filtered Rows"""
Sheets.Add After:=ActiveSheet
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Task Track"";Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Task Track]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.ListObject.DisplayName = "Task_Track"
.Refresh BackgroundQuery:=False
End With
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub
为澄清起见,此部分中会发生错误:
#""Filtered Rows"" = Table.SelectRows(#""_Task Track"", each [DTE] = #datetime(YR, MR, DR, 0, 0, 0))"
我尝试引用一个暗淡的值YR,而不是静态日期#datetime(2019,10,11,0,0,0)。
它返回“错误1004:[Expression.Error]导入YR与任何导出都不匹配。您是否错过了模块引用?”
据我了解,它试图在访问数据库中查找YR,而不是使用我暗化的YR值。
帮助?
答案 0 :(得分:1)
连接变量。
认为不需要这些Chr(13)和Chr(10)代码。
我用撇号代替双引号。
声明为String可能不是问题,但是由于值实际上是数字,因此应该声明为Integer或Long。
Dim YR, MR, DR As String
DR = ThisWorkbook.Sheets(1).Range("A2")
MR = ThisWorkbook.Sheets(1).Range("B2")
YR = ThisWorkbook.Sheets(1).Range("C2")
ActiveWorkbook.Queries.Add Name:="Task Track", Formula:="let" & _
"Source = Access.Database(File.Contents('C:\Folder\Database_be.accdb'), [CreateNavigationProperties=true])," & _
"#'_Task Track' = Source{[Schema='',Item='Task Track']}[Data]," & _
"#'Filtered Rows' = Table.SelectRows(#'_Task Track', each [DTE] = #datetime(" & _
YR & ", " & MR & ", " & DR & ", 0, 0, 0)) in #'Filtered Rows'"
Sheets.Add After:=ActiveSheet
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location='Task Track';Extended Properties=''" _
, Destination:=Range("$A$1")).QueryTable