Tilde区切り文字を使用したUnicodeとしてのMSAccessテーブルのエクスポート
質問
MSAccess2003からいくつかのテーブルの内容をエクスポートしたい。 テーブルには、ユニコードの日本語文字が含まれています。 チルダ区切りのテキストファイルとして保存したい。
ファイル/エクスポートを使用して手動でこれを行うことができ、「詳細」ダイアログでフィールド区切り文字としてチルダを選択し、コードページとしてUnicodeを選択します。
これをエクスポート仕様として保存できますが、これはテーブル固有のようです。
VBAコードを使用して多くのテーブルをエクスポートしたい。
これまでに試しました:
Sub ExportTables()
Dim lTbl As Long
Dim dBase As Database
Dim TableName As String
Set dBase = CurrentDb
For lTbl = 0 To dBase.TableDefs.Count
'If the table name is a temporary or system table then ignore it
If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
'~ indicates a temporary table
'MSYS indicates a system level table
Else
TableName = dBase.TableDefs(lTbl).Name
DoCmd.TransferText acExportDelim, "UnicodeTilde", TableName, "c:\" + TableName + ".txt", True
End If
Next lTbl
Set dBase = Nothing
サブの終了
これを実行すると、例外が発生します:
実行時エラー '3011': Microsoft Jetデータベースエンジンは、オブジェクト" Allowance1#txt 'を見つけることができませんでした。オブジェクトが存在すること、およびその名前とパス名を正しく綴ることを確認してください。
この時点でデバッグする場合、TableNameは予想どおり「Allowance1」です。
UnicodeTildeのエクスポート仕様はテーブル固有であるため、複数のテーブルに使用することはできません。
解決策は何ですか? TransferText以外の何かを使用するか、プログラムでエクスポート仕様を作成する必要がありますか?
ご協力ありがとうございます。
解決
私は最終的にこれを解決しました。 (現在Access 2007を使用していますが、Access 2003と同じ問題がありました。)
まず、機能しなかったもの:
TransferTextは、schema.iniが正しくフォーマットされていても、ヘッダー行をUnicodeおよびチルダで区切るだけです。 (いいえ、すべてを1行にまとめたわけではありません。これは、stackoverflowのhtmlのフォーマットの問題にすぎません。)
[MyTable.txt]
CharacterSet = Unicode
Format = Delimited(~)
ColNameHeader = True
NumberDigits = 10
Col1= "Col1" Char Width 10
Col2= "Col2" Integer
Col3= "Col3" Char Width 2
selectステートメントを使用するだけ:
SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]
FMTは完全に無視されました。パラメータの形式に関するドキュメントを見つけるのは非常に困難でした。 FMTパラメーターに入力したものが何であれ、作業できるのは修正されたものだけでした。その他はすべてCSVDelimitedとして扱われました。 selectステートメントが次のようなschema.iniファイルを作成したため、これをチェックできます。
[MyTable.txt]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=Col1 Char Width 10
Col2=Col2 Integer
Col3=Col3 Char Width 2
最終的な解決策は、独自のschema.iniを作成してから、selectステートメントを使用することでした。私のモジュールコードは次のようになります。
Option Compare Database
Option Explicit
Public Function CreateSchemaFile(bIncFldNames As Boolean, _
sPath As String, _
sSectionName As String, _
sTblQryName As String) As Boolean
Dim Msg As String
On Local Error GoTo CreateSchemaFile_Err
Dim ws As Workspace, db As Database
Dim tblDef As TableDef, fldDef As Field
Dim i As Integer, Handle As Integer
Dim fldName As String, fldDataInfo As String
' -----------------------------------------------
' Set DAO objects.
' -----------------------------------------------
Set db = CurrentDb()
' -----------------------------------------------
' Open schema file for append.
' -----------------------------------------------
Handle = FreeFile
Open sPath & "schema.ini" For Output Access Write As #Handle
' -----------------------------------------------
' Write schema header.
' -----------------------------------------------
Print #Handle, "[" & sSectionName & "]"
Print #Handle, "CharacterSet = Unicode"
Print #Handle, "Format = Delimited(~)"
Print #Handle, "ColNameHeader = " & _
IIf(bIncFldNames, "True", "False")
Print #Handle, "NumberDigits = 10"
' -----------------------------------------------
' Get data concerning schema file.
' -----------------------------------------------
Set tblDef = db.TableDefs(sTblQryName)
With tblDef
For i = 0 To .Fields.Count - 1
Set fldDef = .Fields(i)
With fldDef
fldName = .Name
Select Case .Type
Case dbBoolean
fldDataInfo = "Bit"
Case dbByte
fldDataInfo = "Byte"
Case dbInteger
fldDataInfo = "Short"
Case dbLong
fldDataInfo = "Integer"
Case dbCurrency
fldDataInfo = "Currency"
Case dbSingle
fldDataInfo = "Single"
Case dbDouble
fldDataInfo = "Double"
Case dbDate
fldDataInfo = "Date"
Case dbText
fldDataInfo = "Char Width " & Format$(.Size)
Case dbLongBinary
fldDataInfo = "OLE"
Case dbMemo
fldDataInfo = "LongChar"
Case dbGUID
fldDataInfo = "Char Width 16"
End Select
Print #Handle, "Col" & Format$(i + 1) _
& "= """ & fldName & """" & Space$(1); "" _
& fldDataInfo
End With
Next i
End With
CreateSchemaFile = True
CreateSchemaFile_End:
Close Handle
Exit Function
CreateSchemaFile_Err:
Msg = "Error #: " & Format$(Err.Number) & vbCrLf
Msg = Msg & Err.Description
MsgBox Msg
Resume CreateSchemaFile_End
End Function
Public Function ExportATable(TableName As String)
Dim ThePath As String
Dim FileName As String
Dim TheQuery As String
Dim Exporter As QueryDef
ThePath = "c:\export\"
FileName = TableName + ".txt"
CreateSchemaFile True, ThePath, FileName, TableName
On Error GoTo IgnoreDeleteFileErrors
FileSystem.Kill ThePath + FileName
IgnoreDeleteFileErrors:
TheQuery = "SELECT * INTO [Text;DATABASE=" + ThePath + "].[" + FileName + "] FROM [" + TableName + "]"
Set Exporter = CurrentDb.CreateQueryDef("", TheQuery)
Exporter.Execute
End Function
Sub ExportTables()
Dim lTbl As Long
Dim dBase As Database
Dim TableName As String
Set dBase = CurrentDb
For lTbl = 0 To dBase.TableDefs.Count - 1
'If the table name is a temporary or system table then ignore it
If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
'~ indicates a temporary table
'MSYS indicates a system level table
Else
TableName = dBase.TableDefs(lTbl).Name
ExportATable (TableName)
End If
Next lTbl
Set dBase = Nothing
End Sub
これはエレガントだとは言いませんが、うまくいきます。また、stackoverflowコードフォーマッタは私の\"を好まないため、コードをあまりきれいに印刷しません。
他のヒント
このスレッドに関連して、すべてのテーブルエクスポートで1つの仕様を使用できるという非常にシンプルなソリューションに出くわしましたが、通常は、それぞれに対して個別の仕様を作成する必要があります。または、リチャードAが提供するサブルーチンを使用します。
プロセスは次のとおりです。
任意のテーブルで区切られたパイプ |
などの仕様を作成し、SQL SELECT * FROM MSysIMEXColumns
を使用してアクセス中のダイナセットクエリを開き、結果の行をすべて削除します。これで、元の仕様の作成に使用したテーブルとは異なるテーブルを使用しようとしても、この仕様ではエラー3011が発生せず、基本的には任意のテーブル/クエリのユニバーサルパイプエクスポート仕様になります。
これは、Access 2003で発見/テストされたため、今後のバージョンでも機能すると思われます。
よろしく、
マット・ドンナン
2つの提案があります:
-
[schema.ini]ファイルの各設定を新しい行に入れていることを確認してください。 (ここにすべてを1行でリストしているので、確認したいと思いました。)
-
TransferTextを呼び出すときに、CodePage引数(最後の引数)を忘れずに指定してください。必要に応じて、サポートされている値のリストを次に示します。
http://msdn.microsoft.com/en-us/library /aa288104.aspx
それ以外は、あなたのアプローチがうまくいくようです。
答えの一部があります:
VBAでschema.iniファイルを作成し、TransferTextを実行しています。これは、その場でエクスポート形式を作成しています。唯一の問題は、schema.iniに次のものが含まれていることです:
ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)
チルダ区切り文字を含むユニコードでヘッダー行のみが出力されます。残りの行はカンマ付きのANSIです。