2014-05-20 92 views
0

我試圖存儲和檢索在Excel中輸入到Excel中的數據。我是一個Access新手,並已在前端的Excel程序,導致我驅動從Excel導入。我已經成功地想出瞭如何將Excel命名範圍保存到所需的Access表中,但是現在我需要弄清楚如何將該Access表中的特定數據返回到Excel中。我知道我可以簡單地使用Excel中的「獲取外部數據」功能將整個Access表導入到Excel中,但我需要只能根據預先確定的一組參數將表的特定部分導入到Excel中。這可能嗎?使用Excel作爲前端將特定的Access表數據導入到Excel中

作爲該程序的背景,基本上它存儲了零件編號運行的數據。我不僅需要將新的零件運行保存到Access數據庫中(我想到了這一點),而且還需要能夠將以前的零件編號從Access運回Excel以執行進一步的分析。這就是爲什麼我需要弄清楚如何只導入表的特定部分。我不確定哪些代碼,如果有的話,我可以發佈,因爲我基本上是從頭開始尋找代碼;但如果您認爲您需要從我的Excel程序中獲取任何代碼,我很樂意提供它。謝謝你的幫助。下面是代碼:

Sub GetSpecData() 
Application.ScreenUpdating = False 
'******************************************************************************* 
'Open the connection to the data source. 
Set Connection = New ADODB.Connection 
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=\\Server2013\network_shared\QC SHARED\Databases\P&Q_Tracking_Data_Storage.mdb;" 
'******************************************************************************* 
'Create the new RecordSet. 
Set Recordset = New ADODB.Recordset 
With Recordset 
'Define the appropriate Filter(s) and notify the user of the selection criteria. 
    Src = "Select * from Raw_Data where Tag = 'GHI' " 
    Src = Src & "or Tag = 'DEF' " 
    Src = Src & "or Tag = 'LMN'" 
    .Open Source:=Src, ActiveConnection:=Connection 
    'Write the field names. 
    For ODCol = 0 To .Fields.Count - 1 
     Tracking.Sheets("Selected Past Data").Range("B7").Offset(0, ODCol).Value = .Fields(ODCol).Name 
    Next 
    'Write the recordset. 
    Tracking.Sheets("Selected Past Data").Range("B7").Offset(1, 0).CopyFromRecordset Recordset 
End With 
Set Recordset = Nothing 
Connection.Close 
Set Connection = Nothing 
'******************************************************************************* 
'Create and format the table from the Recordset. 
With Tracking.Sheets("Selected Past Data") 
    DataLastRow = .Range("A" & Rows.Count).End(xlUp).row 
    .ListObjects.Add(xlSrcRange, Range("B7:M" & DataLastRow), , xlYes).Name = "INC2tbl" 
    .ListObjects("INC2tbl").ShowTotals = True 
End With 
Application.ScreenUpdating = True 
'******************************************************************************* 

末次

在下面的評論谷歌搜索的建議後,我有幾個問題。首先,上面的代碼似乎通過三個鍵過濾訪問數據:GHI,DEF和LMN。我解釋正確嗎?第二,它說:「選擇*從Raw_Data其中標籤='GHI'」,因爲這是在引號中,這不是實際的代碼將被執行,是正確的?這只是一個提示或類似的東西,對嗎?

+0

google for「excel vba adodb.connection access database」。這會幫助你。 – Jzz

+0

下面是我爲這個過程創建的子。在Google上線之後,我仍然從我在網上找到的代碼中進行調整。我有一些關於它的問題。 – jlynn303

+0

更新了上面的原始問題以包含有關它的代碼和問題。謝謝。 – jlynn303

回答

0

SELECT * FROM TABLE;輸出到TABLEName.EXL FORMAT sql;

+0

請您用實際的代碼詳細說明這一點嗎?謝謝。 – jlynn303

0

首先,上面的代碼似乎通過三個 鍵來過濾訪問數據:GHI,DEF和LMN。我解釋正確嗎? 其次, 它說:「選擇*從Raw_Data其中標籤='GHI'」,因爲 用引號引起,這不是實際的代碼將被執行, 正確?這只是一個提示或類似的東西,對嗎?

第一個和第二個問題密切相關,所以我會作爲一個答案。這裏的基本思想是有一個到你定義的數據庫的連接(在Connection.Open語句中)。這個連接本身並沒有做什麼,建立連接。與數據庫的實際通信是用特定的語言完成的,名爲SQL(有許多方言,但爲了簡單起見,現在稱之爲SQL)。因此,您的代碼使用VBA語言,但與數據庫的通信是在SQL中完成的。 VBA代碼必須生成SQL語句(並且這些是字符串,因此您需要引號)。這就是Src變量的含義;和SQL語句。在這種情況下:

"Select * from Raw_Data where Tag = 'GHI' or Tag = 'DEF' or Tag = 'LMN'" 

我覺得這不是教你SQL的地方,但是網上有很多關於它的信息。這條語句的作用是:

從表格「Raw_Data」中選擇所有列,但僅選擇Tag列中具有'GHI','DEF'或'LMN'的數據行。

所以從表「part_numbers」接收所有數據,你將不得不使用:

"SELECT * FROM part_numbers;" 

如果您需要導入只列「COL_1」和「COL_2」,你可以使用:

"SELECT col_1,col_2 FROM part_numbers;" 

如果您需要導入只列 「COL_1」 和 「COL_2」,只有行以 「PART_ID」 低於1000,你可以使用:

"SELECT col_1,col_2 FROM part_numbers WHERE part_id < 1000;" 

就是這樣。現在,如果您的記錄集(將其視爲包含所請求數據的數組)已查詢數據庫,則可以循環它來解析數據。喜歡的東西:

Set Recordset = Connection.Execute(Src) 
Do until Recordset.EOF 
    debug.print Recordset!col_1 
    Recordset.movenext 
loop 

同樣,谷歌是這樣的:「VBA擅長ADODB訪問」,你會打很多的例子。

+0

非常感謝@Jzz。這確實有幫助。 – jlynn303

0

在研究了SQL代碼格式之後,我對這個主題有了更多的瞭解。謝謝您的幫助。