Ms-Access

使用 Powershell 可以在 Access 中插入宏嗎?

  • March 26, 2018

我正在使用 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 語句使用小寫重命名列。編寫可以重用的東西應該​​不會太難。

引用自:https://dba.stackexchange.com/questions/201930