2012-01-03 87 views
8

Tôi có một dự án về cơ bản mục tiêu là tạo Excel (Báo cáo) bắt đầu Nhấp vào nút trong Access bằng VBA.VBA - Tạo tệp Excel từ Access (QueryTable)

Nội dung của báo cáo này là kết quả của Cơ sở dữ liệu SQL Server được lưu trữ.

dòng lỗi:

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

tôi nhận được là:

invalid procedure call or argument (erro '5') 

Hoàn Mã (Edited sử dụng lời khuyên Remou Thành viên):

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 

Điều kỳ lạ là các mã hoạt động khi chạy trong Excel nhưng không hoạt động trong Access

+0

Okay , giống như bạn, bây giờ tôi có mã hoạt động trong Excel nhưng không hoạt động trong Access. Dường như có sự cố khi thêm bảng truy vấn. Tôi không thể thấy lý do tại sao. Tôi tự hỏi nếu một giải pháp thay thế sẽ phù hợp? Ví dụ, chỉ cần viết các bản ghi vào một trang tính phù hợp? – Fionnuala

+0

FYI: Tôi có Excel Querytables tự động truy cập trong nhiều năm mà không có vấn đề, mặc dù với dữ liệu Access là nguồn. Tuy nhiên, tôi đã không thử nó trong Office 2010. –

+0

@Rachel Có lẽ bạn có thể đăng một số mã Access làm việc? – Fionnuala

Trả lời

5

Trong Access, bạn cần phải thêm tiền tố các đối tượng ứng dụng Excel với các trường hợp ứng dụng Excel, ví dụ:

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

Hơn nữa, trừ khi bạn có một tham chiếu đến thư viện Excel, ypu sẽ cần phải cung cấp giá trị cho xây dựng các hằng số Excel.

Ý tưởng rất xấu khi sử dụng tên đối tượng cho biến. Đừng nói:

Dim recordset As recordset 
Set recordset = New recordset 

Say, ví dụ:

Dim rs As recordset 

Hoặc tốt hơn nhiều:

Dim rs As New ADODB.Recordset 

Nếu bạn có một tài liệu tham khảo phù hợp. Sau đó, bạn có thể bỏ qua CreateObject.

EDIT

Nhà cung cấp phải là nhà cung cấp truy cập OLEDB 10, được sử dụng để ràng buộc recordset. Này làm việc cho tôi để tạo ra một bảng dữ liệu thông qua truy cập sử dụng 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

Cảm ơn lời khuyên, nhưng không giải quyết được vấn đề của tôi – Predoff

4

FWIW, có hai điều nổi bật:

  1. Như @Remou chỉ ra, tài liệu tham khảo Excel cần phải có đủ điều kiện. Hiện tại, Range("A2") không đủ điều kiện. Khi chạy mã trong Excel, giả định ActiveSheet. Tuy nhiên, khi chạy từ một ứng dụng khác, ứng dụng đó sẽ tìm kiếm một phương thức hoặc thuộc tính trong thư viện riêng của nó có tên là Range, sẽ cung cấp cho bạn lỗi đó trong Microsoft Access.

  2. Không có mã nào trong khối With, vì vậy, bạn có thể xóa các từ khóa WithEnd With; khi bạn làm điều này cũng loại bỏ bên ngoài(), như thế này:

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

Ngoài ra, chuyển khối With đến Worksheet mức:

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

Update- Truy cập vào Mẫu Excel

Mã mẫu này tự động hóa Excel từ Access, tạo sổ làm việc mới và thêm Querytable vào trang tính đầu tiên. Dữ liệu nguồn là một bảng Access. Này chạy trong 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

cuộc gọi hoặc thủ tục không hợp lệ – Predoff

+0

Cảm ơn, nhưng không giải quyết được vấn đề của tôi:/ – Predoff

+0

@Predoff Tôi sửa đổi ví dụ của mình để thay thế đối tượng '' Workbook'' cho '' Excel Đối tượng Application''. Không chắc chắn nếu điều này sẽ giải quyết vấn đề của bạn, nhưng nó là chính xác hơn. –

0

Bạn không nói những gì phiên bản Office, nhưng trong Excel 2007/10 một QueryTable là một tài sản của một Listobject do đó, mã của bạn sẽ như thế nào:

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

Sau khi đọc lại câu hỏi, tôi nhận ra rằng đây không phải là vấn đề - vì bạn có lỗi thời gian chạy. Tôi nghĩ rằng @RachelHettinger (như thường lệ) đã đánh vào móng trên đầu. –

+0

Không tìm thấy đối số được đặt tên – Predoff

Các vấn đề liên quan