ACCESS VBAで既存のエクスポート操作を使いたい場面で出力先の設定に苦戦したのでメモ
元の定義で<ImportExportSpecification Path="ここにパス" xmlns="urn:www.microsoft.com/office/access/imexspec">
のようになっている場合以下のようにすると出力先パスを変更してエクスポート操作を指定できます。
・定義XMLの中身を確認するにはstrXML = Obj.XMLのところをデバッグ
・パスの指定箇所が上述のものと異なる構造な場合はprefix =
、newLine =
の箇所を修正
Function main()
' エクスポート操作の名前を指定
Dim strExportName As String
strExportName = "エクスポート操作の名前"
Set Prj = CurrentProject
' XMLで定義を取得する
Set Obj = Prj.ImportExportSpecifications(strExportName)
strXML = Obj.XML
strXML = ProcessLines(strXML, "ここに新しい出力先")
' 変更後のXMLを適用
Obj.XML = strXML
' エクスポート操作の実行
DoCmd.RunSavedImportExport strExportName
End Function
' エクスポート操作の一部変更用
Function ProcessLines(str As String, newPath As String) As String
Dim str2 As String
Dim lines() As String
Dim i As Integer
Dim prefix As String
Dim newLine As String
ProcessLines = ""
str2 = ""
prefix = "<ImportExportSpecification"
newLine = "<ImportExportSpecification Path=""" & newPath & """ xmlns=""urn:www.microsoft.com/office/access/imexspec"">"
' 文字列を改行で分割
lines = Split(str, vbCrLf)
' 各行を処理
For i = LBound(lines) To UBound(lines)
' 各行を表示 (ここで必要な処理を行う)
' Debug.Print (i) & ":" & lines(i)
' 文字列前方一致確認
If (Left(lines(i), Len(prefix)) = prefix) Then
' Debug.Print "変換"
str2 = str2 & newLine & vbCrLf
Else
str2 = str2 & lines(i) & vbCrLf
End If
Next i
ProcessLines = str2
End Function
無理やり感がありますが、もっとスマートな方法があれば教えていただけると嬉しいです。