2016-03-06 157 views
0

我有一個訪問數據庫,用戶應該從Excel複製並導入到Access表中。用戶可以從幾個「進口」中進行選擇,他們可以自己創建新的進口。一旦他們選擇了導入 - 即時創建查詢,並將所需的列導入到表中。所有導入都將填充同一個表,但並非所有列都與每個導入相關。因此,如果選擇Import1,則查詢將顯示例如。第2欄,第3欄和第4欄。如果選擇了import2,那麼它可能是column2和column5等。之後,導入查詢將在VBA代碼中被刪除。使用VBA動態列從Excel複製到Access

我不確定這是否是解決問題的最佳解決方案,但原則上它是有效的(但有時如果用戶在完成等操作之前退出數據庫,刪除查詢可能會出現問題 - 因此可能會手動刪除舊查詢需要)。

然而,問題在於,除了用戶複製到表中的數據之外,還需要使用VBA代碼中設置的預定義值來完成一些列。一個例子可能是我需要一個ImportID列來存儲用戶爲每個用戶複製的行選擇的導入的ID。這需要在用戶將Excel中的數據粘貼到查詢中時同時完成。否則,我將無法根據需要從其他導入中識別表中的數據。

我唯一的解決方法是動態創建一個表單(對於每個請求的導入),在表單中包含ImportID列,通過VBA爲Import列設置預定義值,鎖定導入列,然後隱藏它的形式。這樣,當用戶從Excel中粘貼數據時 - ImportID列也填充了正確的值 - 而用戶不必與其相關聯。

問題是,我擔心這是一個「混亂」的解決方案,通過VBA在數據庫中創建多個查詢和表單,需要刪除 - 我相信他們中的很多用戶將會退出在完成之前的過程中等。

如果有人有更好的方法來做到這一點,將不勝感激。但是,我確實需要通過複製/粘貼來完成導入操作(不讀取文件,儘管這可能是一種補充 - 它無法取代當前的解決方案)。


我會試着解釋一下過程是如何工作的:首先我們定義了一個「賬戶圖表」。我們假設帳戶4000-4100是來自CRM系統的數據。賬戶5000-5100是來自工資系統的數據。然後,用戶可以設置一個稱爲「CRM導入」的導入,需要第2列,第3列和第5列以賬戶4000-4100完成,以及一個導入稱爲「工資導入」,需要以賬戶5000完成第2列,第3列和第7列-5100。

啓動«CRM»導入時 - VBA代碼只是打開由VBA(DoCmd.OpenQuery)創建的查詢,顯示第2,3和5列。在Excel工作表中 - 用戶具有相同格式的數據。因此,用戶只需從Excel工作表複製並粘貼到開放的Access查詢中即可。同樣,當用戶啓動「工資導入」時,第2,3和7列將顯示在VBA生成的查詢中。用戶還有另一個這種格式的Excel工作表來複制。這些是「超級用戶」,它們複製並粘貼到數據庫中 - 而不僅僅是任何用戶。所有來自不同源的數據都被複制到同一個訪問表中以便稍後處理(因此查詢只顯示相同表的相關列)。從Excel複製/粘貼是將這些數據存入Access解決方案的首選方法。

更新18日。 3月: 我仍然得到的問題是,我無法爲每個導入預定義一個表單。可以有多個導入,導入可能會被刪除,用戶通過界面添加和修改。所以我的想法是,當用戶從列表中選擇一個導入時,將打開表單(所有導入的一個表單)。並根據所選的導入,VBA代碼選擇應在子窗體中顯示哪些列。需要在每次打開導入時檢查哪兩列顯示。

但是,如果我在VBA中這樣做,兩個用戶可以同時打開同一個表單(它們在相同的訪問文件中工作),並且有兩個不同的導入並顯示不同的列?或者我需要爲每個用戶創建一個表單實例,然後在用戶完成時刪除該實例?這似乎不是最好的想法,但我不知道如何解決這個問題。

+0

(1/2)我對用戶如何將Excel數據「導入」到Access數據庫感到困惑。你提到他們可以從幾個「進口」中選擇 - 這是如何準確地設置..?它是一個Access窗體,顯示一組預定義的Excel文檔以運行VBA導入腳本?你提到「導入查詢」 - 這是一個'INSERT' sql語句,還是像'TransferSpreadsheet'這樣的VBA方法嗎?您還提到用戶「將Excel中的數據粘貼到查詢中」 - 現在開始使它聽起來像您沒有使用SQL/VBA來獲取Excel數據,而是... –

+0

(2/2)。 ..依靠用戶從字面上複製並粘貼到Access ...是這種情況?不要吝嗇挑剔;我認爲你想要做的事情很可能是可能的,但是你可能需要編輯你的問題,並提供一個更清晰的描述,說明你已經設置了什麼(有一些截圖和你正在使用的代碼)以及你正試圖去。 –

+0

謝謝馬特。我已經添加了「更新」部分,我試圖更詳細地解釋。讓我知道你是否需要進一步的信息,以提供你的建議。 – XYZcode

回答

2

如果我瞭解安裝程序和用戶正在遵循的過程,您將擁有一個主表來存儲用戶將從CRM和工資表電子表格複製並粘貼的所有各種記錄。例如像這樣的表:

enter image description here

你再有獨立的CRM和薪資查詢,簡單地顯示來自進口表中的不同組列:

enter image description here

enter image description here

然後,您已經設置了一些表單,它允許用戶打開正確的查詢:

enter image description here

..例如, qryCRM:

enter image description here

..和複製/從相關的Excel電子表格粘貼數據:

enter image description here

我想你會遇到麻煩試圖趕上與查詢任何用戶交互對象作爲查詢對象,據我所知,沒有很多觸發VBA代碼的事件。

我建議做的是用你的CRM,工資單等進口的子表單設置一個窗體。

該子表單可以將您的CRM和工資查詢作爲記錄源。例如,下面是一個使用查詢qryCRM作爲記錄源子窗體:

enter image description here

...如果您還設置窗體爲「數據表」的默認視圖..

enter image description here

...用戶將能夠在查詢對象本身的一個類似電子表格樣式與窗體進行交互:

enter image description here

然後,您可以設置您的導航形式爲指向的形式,而不是查詢:

enter image description here

Private Sub cmdImportCrm_Click() 

    DoCmd.OpenForm "frmCRM" 

End Sub 

現在,您可以利用一系列子窗體的事件中的數據集,以獲得額外的數據,當用戶粘貼新記錄。

到目前爲止,我已經找到了最好的方法是使用窗體的BeforeInsert事件:

enter image description here

此事件每一個新的記錄添加到數據集時觸發的,所以如果你粘貼5新行,事件應該觸發這5行中的每一行。

對於這一事件,我只是表示自己希望ImportID列來獲取文本「CRM導入」(你可以明顯地指定別的東西):

Private Sub Form_BeforeInsert(Cancel As Integer) 

    Me.ImportID = "CRM Import" 

End Sub 

因此,當我們貼上我們的數據作爲新記錄,我們也得到了我們的ImportID列規定以及文:

enter image description here

希望這有助於: )

+0

首先 - 非常感謝你爲這個馬特所做的努力!這絕對看起來像是正確的方法。我建議的做法是爲每個CRM,薪資等進口設置一個子表單 – XYZcode

+0

但是,如果兩個用戶同時打開帶有兩個不同的CRM,工資單等的表單進口 – XYZcode

相關問題