1
此事很難解釋,但更容易看到。我試圖編寫一個動態的用於從訪問到Excel的quertytable。這樣用戶可以選擇他們想要查詢的文件,表格,屬性和日期過濾器。將項目添加到具有某些項目確定的數組中VBA
這是怎樣將Excel的看向管理查詢(可以改變的,但可以處理):
這是代碼,當我錄製宏,而這樣做的東西:
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array(_
"ODBC;DSN=MS Access Database;DBQ=Z:\Informes de actividad\BBDD\2017\BBDD_ADIF_2017.accdb;DefaultDir=Z:\Informes de actividad\BBDD\201" _
), Array("7;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;")), _
Destination:=Range("$A$1")).QueryTable
.CommandText = Array(_
"SELECT PREVISIONES.Centro, PREVISIONES.`Skill Nombre`, PREVISIONES.Fecha, PREVISIONES.Tramo, PREVISIONES.`Prevision Recibidas Cliente`, PREVISIONES.`Prevision Atento`, PREVISIONES.`Prevision Recibidas`, PREVISI" _
, _
"ONES.`Prevision Atendidas`, PREVISIONES.`Prevision TMO`, PREVISIONES.`Prevision de Ocupacion s/Requeridos`, PREVISIONES.`Prevision de Ocupacion s/Programados`" & Chr(13) & "" & Chr(10) & "FROM `Z:\Informes de actividad\BBDD\2017" _
, _
"\BBDD_ADIF_2017.accdb`.PREVISIONES PREVISIONES" & Chr(13) & "" & Chr(10) & "WHERE (PREVISIONES.Fecha>{ts '2017-02-01 00:00:00'} And PREVISIONES.Fecha<{ts '2017-03-01 00:00:00'})" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Tabla_Consulta_desde_MS_Access_Database"
End With
End Sub
這就是我所做的得到它動態:
Sub Macro2()
Dim QT As QueryTable, wsPr As Worksheet, Año As String, Ruta As String, Archivo As String, Tabla As String, _
FechaInicio As Date, FechaFin As Date, TablaPropiedades As String, CPropiedades As Collection, i As Integer, _
Propiedades As String
Set wsPr = ThisWorkbook.Worksheets("Previsiones")
Set CPropiedades = New Collection
Año = "2017"
Ruta = "Z:\Informes de actividad\BBDD\" & Año
Tabla = "BBDD_ADIF_2017"
Archivo = "\" & Tabla & ".accdb"
TablaPropiedades = "PREVISIONES"
FechaInicio = Sheets("Hoja69").Range("C2").Value
FechaFin = Sheets("Hoja69").Range("C3").Value
For i = 0 To 10
CPropiedades.Add (TablaPropiedades & "." & Sheets("Hoja69").Cells(i + 2, 2).Value)
Next i
For i = 0 To CPropiedades.Count - 1
If i = 0 Then Propiedades = " " & CPropiedades(i + 1)
If i <> 0 And i <> CPropiedades.Count Then Propiedades = Propiedades & ", " & CPropiedades(i + 1)
If i = CPropiedades.Count Then Propiedades = ", " & Propiedades + CPropiedades(i + 1)
Next i
With wsPr.ListObjects.Add(SourceType:=0, Source:=Array(Array(_
"ODBC;DSN=MS Access Database;DBQ=" & Ruta + Archivo & ";DefaultDir=" & Ruta) _
, Array("DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;")), _
Destination:=wsPr.Range("$A$1")).QueryTable
.CommandText = Array("SELECT " & Propiedades & Chr(13) & "" & Chr(10) & _
"FROM `" & Ruta + Archivo & "`.PREVISIONES PREVISIONES" & Chr(13) & "" & Chr(10) & _
"WHERE (PREVISIONES.Fecha>{ts '" & Format(FechaInicio, "yyyy-mm-dd") & " 00:00:00'}" & _
"And PREVISIONES.Fecha<{ts '" & Format(FechaFin, "yyyy-mm-dd") & " 00:00:00'})")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Previsiones"
End With
Call ActualizarPrevisiones
wsPr.Cells.ClearFormats
End Sub
宏在.CommandText行失敗,我想因爲即時插入所有propierties作爲一個項目,每個屬性應該是1項目。事情是...我怎麼能在那裏添加我的集合中的每個項目作爲數組的一個項目(並不總是相同數量的collecions)。
我找不到從使用集合從頭開始創建數組的任何事情......但這不是我想要的,我相信。
有人可以給我一個小費繼續前進嗎?謝謝!