2012-11-01 32 views
2

我們試圖在Access中自動執行郵件合併過程 - 單擊按鈕後,指定當前數據庫的VBA運行(accdb )作爲數據源並按照以下代碼運行SQL:訪問/ Word 2010 VBA郵件合併嘗試打開[Foldername] .mdb而不是ACCDB源

'Set up Word 
Dim objWord As Object 
Set objWord = CreateObject("Word.Application") 

'Make visible, open specified doc to merge 
With objWord 
    .Visible = True 
    .Documents.Open strDocName 
End With 

'Set the data source path 
Dim docPath As String 
docPath = CurrentProject.Path & "\" & CurrentProject.Name 

'Open the merge data source - simplified 
objWord.activedocument.mailmerge.opendatasource _ 
    Name:=docPath, _ 
    SQLStatement:=strSQL 

strDocName和strSQL傳入幷包含有效的功能內容。

它成功打開單詞,使其可見並打開要合併到的模板。然而,在那個時候,它出現要求確認數據源,並顯示可能的數據源列表。點擊'show all'複選框後,我可以通過ODBC(.mdb,.accdb)向下滾動到MS Access數據庫並從列表中選擇它。

它然後用標題爲「ODBC Microsoft Access驅動程序登錄失敗」,說一個盒子呈現「找不到文件:‘[路徑數據庫文件夾] /的.mdb [包含的文件夾的名稱]’」

所以,如果我的數據庫位於C:\ Temp中,則錯誤路徑將顯示爲'C:\ Temp.mdb'。將訪問數據庫移動到另一個文件夾會導致錯誤路徑更新,以根據包含文件夾查找相應命名的mdb文件。

我不知道它是否相關,但它似乎是在模板本身編輯模式下打開模板,而不是從該模板生成新文檔。

我在這裏錯過了什麼或有沒有人有任何想法?

乾杯


隨着Remou的協助之下,我們放棄了直接鏈接來訪問和使用來自Remou的建議鏈接到輸出的代碼到一個臨時文本文件,然後從那裏合併。

我們修改了代碼以刪除CurrentBackendPath()和更改的唯一參考這個功能如下:

Private Function GetStartDirectory() As String 
    'GetStartDirectory = CurrentBackendPath() & "mm\" 
    GetStartDirectory = CurrentProject.Path & "\mm\" 
End Function 

我們使用的唯一其他的修改是修改代碼具體到我們的目的。再次感謝大家的回覆。如果我有足夠的聲譽,我會鼓勵Remou的迴應!

+0

根據MSDN(http://msdn.microsoft.com/en-us/library/office/ff841005.aspx),「*當通過開放式數據庫連接檢索數據(ODBC ),你指定一個連接字符串*「你似乎是提供文件路徑而不是連接字符串。 – HansUp

+0

回覆:模板 - 使用Open方法打開現有文檔,在這種情況下是模板。如果要創建新文檔,請使用Documents.Add並將路徑作爲第一個參數傳遞給模板。請記住,Documents.Add將返回對新創建的文檔的引用。 –

+0

@HansUp你看起來是正確的 - 我會在Remou的回答下面嘗試解決這個問題。感謝您的答覆! – WaideWalker

回答

1

我強烈建議你不是鏈接到MS Access文件。將所需的數據輸出到文本文件並鏈接到該文件。鏈接到Access對於手動控制的郵件合併器來說都是非常好的,但當你想自動化時,它會變得非常單調乏味。您不妨讀一讀http://www.tek-tips.com/faqs.cfm?fid=5088

話雖這麼說,錄製宏,我得到如下:

ActiveDocument.MailMerge.OpenDataSource Name:="Z:\Docs\Test.accdb", _ 
    ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _ 
    AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _ 
    WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _ 
    Format:=wdOpenFormatAuto, Connection:= _ 
    "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=Z:\Docs\Test.accdb;Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk" _ 
    , SQLStatement:="SELECT * FROM `Table1`", SQLStatement1:="", SubType:= _ 
    wdMergeSubTypeAccess 

上述的大部分是不必要的,但你會看到它包含一個連接字符串。在早期版本中情況並非如此。你可以通過:

With objWord.ActiveDocument.MailMerge 
    .OpenDataSource Name:="Z:\Docs\Test.accdb", _ 
     ConfirmConversions:=False, LinkToSource:=True, _ 
     Connection:= _ 
     "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Z:\Docs\Test.accdb;" _ 
     , SQLStatement:="SELECT * FROM `Table1`" 
End With 
+0

感謝您的及時回覆 - 我今天下午會回答您的問題,並會告訴您結果如何。 – WaideWalker

+0

嗨Remou,我已經試過在今天下午和你的建議一起玩,都用變量和硬編碼值來看看它是否有所作爲。我還沒有對這個問題產生影響 - 它仍然堅持不能找到數據源。我將在星期一上午再次處理這個問題,並隨着我的進展更新你。再次感謝你的幫助。 – WaideWalker

+0

您是否嘗試在Word中錄製宏? – Fionnuala