2012-01-03 96 views
8

我有一個項目,基本上目標是生成Excel(報告)開始點擊Access中的按鈕使用VBA。VBA - 從訪問生成Excel文件(QueryTable)

此報告的內容是存儲過程SQL Server數據庫的結果。

錯誤的行:

With MeuExcel.Worksheets(4) 
    .QueryTables.Add connection:=rs, Destination:=.Range("A2") 
End With 

我得到的是:

invalid procedure call or argument (erro '5') 

完整的代碼(使用Remou用戶提示編輯):

Sub GeraPlanilhaDT() 

Dim MeuExcel As New Excel.Application 
Dim wb As New Excel.Workbook 

Set MeuExcel = CreateObject("Excel.Application") 
MeuExcel.Workbooks.Add 

MeuExcel.Visible = True 

Dim strNomeServidor, strBaseDados, strProvider, strConeccao, strStoredProcedure As String 

strNomeServidor = "m98\DES;" 
strBaseDados = "SGLD_POC;" 
strProvider = "SQLOLEDB.1;" 
strStoredProcedure = "SP_ParametrosLeads_DT" 

strConeccao = "Provider=" & strProvider & "Integrated Security=SSPI;Persist Security Info=True;Data Source=" & strNomeServidor & "Initial Catalog=" & strBaseDados 

Dim cnt As New ADODB.connection 
Dim cmd As New ADODB.command 
Dim rs As New ADODB.recordset 
Dim prm As New ADODB.parameter 

cnt.Open strConeccao 

cmd.ActiveConnection = cnt 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = strStoredProcedure 
cmd.CommandTimeout = 0 

Set prm = cmd.CreateParameter("DT", adInteger, adParamInput) 
cmd.Parameters.Append prm 
cmd.Parameters("DT").Value = InputBox("Digite o Código DT", "Código do Distribuidor") 

Set rs = cmd.Execute() 

Dim nomeWorksheetPrincipal As String 
nomeWorksheetPrincipal = "Principal" 

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = nomeWorksheetPrincipal 



With MeuExcel.Worksheets(4) 
    .QueryTables.Add connection:=rs, Destination:=.Range("A2") 
End With 


cnt.Close 
Set rs = Nothing 
Set cmd = Nothing 
Set strNomeServidor = Nothing 
Set strBaseDados = Nothing 
Set strProvider = Nothing 

If (ActiveSheet.UsedRange.Rows.Count > 1) Then 
    FormataDadosTabela 
Else 
    MsgBox ("Não foi encontrado nenhum Distribuidor com esse DT") 
End If 


End Sub 

奇怪的是,代碼在Excel中運行時工作,但在Access中不起作用

+0

好吧,像你一樣,我現在的代碼可以在Excel中工作,但在Access中不起作用。添加查詢表似乎有問題。我看不出爲什麼。我想知道另一種解決方案是否適合?例如,簡單地將記錄寫入工作表是否合適? – Fionnuala 2012-01-04 13:08:41

+0

僅供參考:儘管使用Access數據作爲源,但我幾年來都沒有問題地從Access中自動執行Excel Querytables。但是,我還沒有在Office 2010中試過它。 – 2012-01-04 16:52:47

+0

@Rachel也許你可以發佈一些工作的Access代碼? – Fionnuala 2012-01-04 18:23:38

回答

5

在Access中,你需要前綴與Excel的應用實例Excel應用程序對象,例如:

With MeuExcel.Worksheets(4).QueryTables.Add(_ 
    connection:=recordset, _ 
    Destination:=Range("A2")) 
End With 

而且,除非你有對Excel庫的引用,YPU將需要提供的價值爲建在Excel常量中。

對變量使用對象的名稱是一個非常糟糕的主意。不要說:

Dim recordset As recordset 
Set recordset = New recordset 

說,例如:

Dim rs As recordset 

或者更好:

Dim rs As New ADODB.Recordset 

如果你有合適的參考。你可以跳過CreateObject。

EDIT

供應商必須訪問OLEDB 10提供程序,如用於結合記錄集。這對我的作品通過訪問使用SQL Server中創建數據表:

strConnect = "Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=True;" _ 
& "Data Source=XYZ\SQLEXPRESS;Integrated Security=SSPI;" _ 
& "Initial Catalog=TestDB;Data Provider=SQLOLEDB.1" 
+0

感謝您的提示,但沒有解決我的問題 – Predoff 2012-01-03 18:14:18

4

FWIW,兩點最爲突出:

  1. 由於@Remou指出,Excel的引用都需要合格。目前,Range("A2")不合格。在Excel中運行代碼時,假定爲ActiveSheet。但是,從另一個應用程序運行時,該應用程序將在其自己的庫中尋找名爲Range的方法或屬性,這會在Microsoft Access中出現該錯誤。

  2. With塊中沒有任何代碼,因此您可以刪除WithEnd With關鍵字;當這樣做也去除外層(),是這樣的:

wb.Worksheets(4).QueryTables.Add Connection:=rs, Destination:=wb.Worksheets(4).Range("A2")

或者,With塊轉移到Worksheet水平:

With wb.Worksheets(4) 
    .QueryTables.Add Connection:=rs, Destination:=.Range("A2") 
End With 

更新 - 訪問Excel示例

此示例代碼從Access自動化Excel,創建一個新的工作簿並向第一張表中添加一個Querytable。源數據是一個Access表。這將運行在Office 2007

Public Sub ExportToExcel() 
    Dim appXL As Excel.Application 
    Dim wbk As Excel.Workbook 
    Dim wst As Excel.Worksheet 
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set appXL = CreateObject("Excel.Application") 
    appXL.Visible = True 
    Set wbk = appXL.Workbooks.Add 
    Set wst = wbk.Worksheets(1) 

    Set cn = CurrentProject.AccessConnection 
    Set rs = New ADODB.Recordset 
    With rs 
    Set .ActiveConnection = cn 
    .Source = "SELECT * FROM tblTemp" 
    .Open 
    End With 

    With wst 
    .QueryTables.Add Connection:=rs, Destination:=.Range("A1") 
    .QueryTables(1).Refresh 
    End With 

End Sub 
+0

無效的過程調用或參數 – Predoff 2012-01-04 12:20:10

+0

謝謝,但沒有解決我的問題:/ – Predoff 2012-01-04 12:20:26

+0

@Predoff我修改了我的示例,用「Workbook」對象代替「Excel應用程序對象。不知道這是否會解決您的問題,但它是更正確的。 – 2012-01-04 16:49:08

0

你不說什麼的Office版本,但在Excel 2007/10一個的QueryTable是的ListObject的屬性,以便您的代碼將是這樣的:

With MeuExcel.Worksheets.ListObjects.Add(Connection:=rs, Destination:=Range("A2")).QueryTable 
+2

重新閱讀問題後,我意識到這不是問題 - 因爲您有運行時錯誤。我認爲@RachelHettinger(像往常一樣)已經擊中了頭部。 – 2012-01-03 23:48:45

+0

未命名的參數 – Predoff 2012-01-04 12:18:23