2012-07-10 59 views
2

目前我在Access上有一個窗體過濾來自子窗體的記錄,並在單擊按鈕時在第一個窗體上創建一個帶有數據的Excel文檔。我在後續工作表中發生了一系列其他計算,但是我只需要它們針對第一個工作表上「名稱」列中已存在「名稱」字段的條目。其他計算是通過SQL語句完成的。如何將整個Excel列分配給Access中VBA中的變量?

我的思維過程是做這樣的事情:

SELECT (various fields) FROM (query name) WHERE (first couple of where statements) AND NameField IN NameColumn 

如果名稱字段將是name元素和名稱列將整列。我試圖用多種方式創建這個變量而沒有成功。例如,我嘗試過的一件事是在正確的實例中循環添加「(」,「,」和「)」的記錄,但字符串太長,Access無法運行。我也嘗試了界定,如變量:

NameColumn = ExcelApplication.Range("A:A") 

而且

NameColumn = Worksheet.Range("A:A") 

而且

NameColumn = ExcelApplication.Columns("A:A").EntireColumn 

等,但所有這些似乎只引用列的第一個條目。我試過研究解決方案,但是我也沒有找到任何有用的東西。有人知道我會如何處理這樣的事情嗎?

編輯:我應該也許應該提到,我以爲我只是得到使用這些方法的第一個條目,因爲NameColumn沒有被定義爲任何事情之前。但我想這樣做:

Dim NameColumn As Range 

但我會得到以下錯誤:

Compile Error: 
User-defined type not defined 

這是奇怪的,因爲經過一番研究,我已經注意到範圍似乎是一個有效的數據類型

編輯2:這是我如何定義我的Excel應用程序和工作表:

編輯3:編輯它使它更加完整,以防萬一它有幫助

編輯4:更新更多的代碼

Dim rst As DAO.Recordset 
Dim ApXL As Object 
Dim xlWBk As Object 
Dim xlWSh As Object 
Dim fld As DAO.Field 
Const xlCenter As Long = -4108 
Const xlBottom As Long = -4107 

On Error GoTo err_handler 

Set rst = frm.RecordsetClone 

Set ApXL = CreateObject("Excel.Application") 
Set xlWBk = ApXL.Workbooks.Add 
ApXL.Visible = True 

Set xlWSh = xlWBk.Worksheets("Sheet1") 

#THESE TWO BLOCKS COPY THE DATA FROM THE SUBFORM# 
For Each fld In rst.Fields 
    ApXL.ActiveCell = fld.Name 
    ApXL.ActiveCell.Offset(0, 1).Select 
Next 

rst.MoveFirst 
xlWSh.Range("A2").CopyFromRecordset rst 
. 
. 
. 
Dim FirstColumn As Object 
Set FirstColumn = xlWSh.Columns(1) 
. 
. 
. 
+0

現在這個問題包含兩個完全不同的兩個問題完全不同的答案,所以它真的應該分裂。請確定您想要的問題的哪一部分,Excel自動化或Access SQL,然後答案可以與問題相關。 – Fionnuala 2012-07-11 13:11:31

回答

1

爲什麼不使用子查詢的?

AND NameField IN (SELECT NameField FROM [Sheet1$a1:a10]) 

或者名爲範圍:

AND NameField IN (SELECT NameField FROM NameColumn) 

再評論

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8, _ 
    "Atable", "z:\docs\test.xls", True, "A1:A15" 

最後:

SELECT * FROM Table1 
WHERE ADate NOT IN (
    SELECT SomeDate 
    FROM [Excel 8.0;HDR=YES;DATABASE=Z:\Docs\Test2.xls].[Sheet1$a1:a4]) 
+0

這實際上是我遇到麻煩的部分。我假設兩個NameFields不同,因爲第二個NameField特別對應於[Sheet1 $ a1:a10]/NameColumn,對吧?無論如何,我無法讓這些工作。 對於第一個,第二個NameField應該是什麼?我剛剛嘗試過: AND NameField IN(Worksheet.Range(「A1:A10」)) 因爲我想不出會是什麼,但是這給了我一個「類型錯誤」的錯誤。 此外,在你的第二個例子中,NameColumn將是一個子表單,所以它給了我錯誤,因爲我認爲它期望一個表或查詢。 – KryptKeeper 2012-07-10 14:24:58

+0

我從編輯中看到,您正在嘗試使用Excel實例,但這不是查詢的方式。您可以將範圍或命名範圍連接爲表格,並像處理任何Access表格那樣使用它,或多或少。您還可以編寫一個在Excel中引用範圍的查詢。你的大綱查詢是否使用Excel或Access? – Fionnuala 2012-07-10 16:03:11

+0

哇,我不知道甚至有可能將範圍轉換成表格。我現在正在研究這個問題,但是你有沒有什麼有用的鏈接可以很難找到這樣的事情?對不起,「大綱查詢」是什麼意思?如果這就是你的意思,我在Access中完成大部分工作。 – KryptKeeper 2012-07-10 16:13:12

2

but I would then get the following error: Compile Error: User-defined type not defined which is weird since after some research I've noticed Range seems to be a valid datatype

你是得到該錯誤是因爲Excel Range不是Access對象而是Excel對象。您必須將其定義爲

Dim NameColumn As oXl.Range 

其中,oXL是您在應用程序中定義的Excel應用程序。

,並設置範圍,則不能使用

NameColumn = Worksheet.Range("A:A") 

你必須使用這個詞Set。所以上面的代碼更改爲

Set NameColumn = Worksheet.Range("A:A") 

Set NameColumn = Worksheet.Columns(1) 

隨訪

我想這和它的作品

Dim ApXL As Object, xlWBk As Object, xlWSh As Object, NameColumn As Object 

Set ApXL = CreateObject("Excel.Application") 
ApXL.Visible = True 

Set xlWBk = ApXL.Workbooks.Add 
Set xlWSh = xlWBk.Worksheets("Sheet1") 
Set NameColumn = xlWSh.Columns(1) 
+0

嗨,謝謝你的迴應!它沒有工作,但我感覺比以前更接近。我定義的Excel應用程序是:「ApXL」。嘗試做你說的話(Dim NameColumn As ApXL.Range)後,我仍然得到相同的錯誤。但是,如果我嘗試註釋掉該代碼,但仍然保留[Set NameColumn = Worksheet.Columns(1)],我得到的錯誤是:「應用程序定義或對象定義的錯誤」,這讓我覺得有一種不同的方式定義將使其工作的範圍。有任何想法嗎? – KryptKeeper 2012-07-10 15:30:40

+0

你能分享你定義包括'Worksheet'在內的Excel對象的代碼嗎?您可以編輯您的問題並將代碼粘貼到那裏。 – 2012-07-10 15:31:48

+0

當然,我剛添加它 – KryptKeeper 2012-07-10 15:43:20

相關問題