2

MSAccess2003からいくつかのテーブルの内容をエクスポートしたいと思います。テーブルにはUnicode日本語文字が含まれています。それらをチルダ区切りのテキストファイルとして保存したいと思います。

これは、ファイル/エクスポートを使用して手動で行うことができ、[詳細設定]ダイアログで、フィールド区切り文字としてチルダを選択し、コードページとして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以外のものを使用する必要がありますか、それともプログラムでエクスポート仕様を作成する必要がありますか?

助けていただければ幸いです。

4

4 に答える 4

2

私は最終的にこれを解決しました。(現在 Access 2007 を使用していますが、Access 2003 と同じ問題がありました。)

まず、うまくいかなかったもの:

TransferText は、正しくフォーマットされた schema.ini を使用しても、ヘッダー行をユニコードとチルダで区切られるだけにします。(いいえ、すべてを 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 パラメーターに何を入力しても、動作するようになったのは Fixed だけでした。それ以外はすべて 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 コード フォーマッタは \" を好まないため、コードがきれいに印刷されないことにも注意してください。

于 2008-10-06T00:07:35.813 に答える
1

このスレッドに関連して、すべてのテーブル エクスポートで 1 つの仕様を使用できる非常にシンプルなソリューションに出くわしましたが、通常はそれぞれに個別の仕様を作成する必要があります。または、Richard A が提供するサブルーチンを使用します。

プロセスは次のとおりです。

任意のテーブルで区切られたパイプなどの仕様を作成し、|SQL を使用してアクセスでダイナセット クエリを開き、SELECT * FROM MSysIMEXColumns結果の行をすべて削除します。現在、この仕様は、元の仕様の作成に使用したものとは異なるテーブルを使用しようとしたときにエラー 3011 を発生させません。これは基本的に、必要なテーブル/クエリのユニバーサル パイプ エクスポート仕様です。

これは Access 2003 で発見/テストされているので、それ以降のバージョンでも機能すると思います。

敬具、

マット・ドナン

于 2011-05-24T14:24:32.290 に答える
0

私は答えの一部を持っています:

VBA で schema.ini ファイルを作成してから、TransferText を実行しています。これは、その場でエクスポート形式を作成しています。私のschema.iniには次のものが含まれていますが、唯一の問題は次のとおりです。

ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)

チルダ区切り文字を使用して、ヘッダー行のみがユニコードで出力されます。残りの行はカンマ付きの ANSI です。

于 2008-10-02T05:37:47.717 に答える
0

2 つの提案があります。

  1. [schema.ini] ファイルの新しい行に各設定を入れていることを確認してください。(ここにすべてを 1 行でリストしたので、確認してみようと思いました。)

  2. TransferText を呼び出すときは、CodePage 引数 (最後の引数) を指定することを忘れないでください。必要に応じて、サポートされている値のリストを次に示します。

http://msdn.microsoft.com/en-us/library/aa288104.aspx

それ以外は、あなたのアプローチがうまくいくようです。

于 2008-10-04T03:56:21.283 に答える