Ms-Access
使用 Powershell 可以在 Access 中插入宏嗎?
我正在使用 PowerShell 自動將訪問數據庫 (.accdb) 導出到 postgresql。作為其中的一個步驟,我使用 VBA 腳本將所有表名和列名轉換為小寫,以便它們更好地與 postgresql 查詢配合使用。
在將數據庫複製到本地位置後,我想插入將執行此任務的宏。這是為了防止清理腳本在生產數據庫上執行。
我的問題是,使用 powershell 是否可以將宏插入訪問數據庫?我可以找到有關如何使用 excel 執行此操作的文件,但據我所知,它並不能轉化為訪問權限。
編輯:或者,一個可以使用給定輸入創建另一個宏的宏,或者一個將執行通過輸入參數提供給它的程式碼的宏。
為了解決這個問題,我創建了一個額外的數據庫,其目的是容納用於遷移的 VBA。它不包含表,不包含查詢等。
下面的程式碼接受一個 ODBC DSN 和一個我實際想要使用的訪問數據庫的文件位置。
Sub ExportTbls(ODBCDSN As String, dbLocation As String) Dim sTblNm As String Dim sTypExprt As String Dim sCnxnStr As String Dim vStTime As Variant Dim accObj As Access.Application Dim tbldef As DAO.TableDef Dim sDropTable As String On Error GoTo ExportTbls_Error sTypExprt = "ODBC Database" 'Export Type sCnxnStr = "ODBC;DSN=" + ODBCDSN 'Create the connection string Set accObj = New Access.Application accObj.OpenCurrentDatabase dbLocation, True For Each tbldef In accObj.CurrentDb.TableDefs If Left(tbldef.Name, 4) <> "MSys" And Left(tbldef.Name, 4) <> "~TMP" Then Debug.Print tbldef.Name sTblNm = tbldef.Name accObj.DoCmd.TransferDatabase acExport, sTypExprt, sCnxnStr, acTable, sTblNm, sTblNm End If Next tbldef On Error GoTo 0 SmoothExit_ExportTbls: Exit Sub ExportTbls_Error: 'MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ExportTblsODST" Resume SmoothExit_ExportTbls End Sub
呼叫它的 Powershell 如下。我沒有包括一些變數的聲明,但我認為它已經足夠自我解釋了。
Write-Host "Connecting to Access" #Connect to access Add-Type -AssemblyName Microsoft.Office.Interop.Access $MsAccess = New-Object -ComObject Access.Application Start-Sleep 15 $MsAccess.OpenCurrentDatabase($MacroDB) Start-Sleep 15 Write-Host "Making tables and column names lowercase" #Groom the data to make it easier to use in postgresql $MsAccess.run("ConvertTablesAndFieldsToLowercase", [ref] $CopyLocation) Start-Sleep 60 #Copy the database Write-Host "Export Access to Postgres. This may take a bit" $MsAccess.run("ExportTbls", [ref] $ODBCDSN,[ref] $CopyLocation) Start-Sleep 60 Write-Host "Export to postgresql is complete"
通過宏執行此操作似乎是一個奇怪且不必要的步驟。理論上,您應該只需要創建一次新模式。
我將在 postgress 中創建新模式並使用 ETL 工具在它們之間進行映射。
我將使用編輯器或作為導出過程的一部分導出訪問模式並將名稱轉換為小寫。此連結詳細介紹瞭如何使用 vba https://www.techrepublic.com/article/exporting-access-schema-using-xml/
另一種選擇是導入模式,然後使用 alter table 語句使用小寫重命名列。編寫可以重用的東西應該不會太難。