문제

MSAccess2003에서 여러 테이블의 내용을 내보내고 싶습니다. 테이블에는 유니 코드 일본어가 포함되어 있습니다. Tilde가 구분 된 텍스트 파일로 저장하고 싶습니다.

파일/내보내기를 사용하여 수동으로 수행 할 수 있으며, '고급'대화 상자에서 Tilde를 필드 구분 기자로, 유니 코드를 코드 페이지로 선택합니다.

이것을 수출 사양으로 저장할 수는 있지만 이것은 테이블별로 보입니다.

VBA 코드를 사용하여 많은 테이블을 내보내고 싶습니다.

지금까지 나는 시도했다 :

하위 수출물 ()

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 '를 찾을 수 없습니다. 객체가 존재하고 이름과 경로 이름을 올바르게 철자하는지 확인하십시오.

이 시점에서 디버그하면 Tablemename은 예상대로 'Allowance1'입니다.

내 Unicodetilde 내보내기 사양이 테이블별로 구체적이므로 여러 테이블에 사용할 수 없습니다.

해결책은 무엇인가? TransferText 이외의 다른 것을 사용해야합니까, 아니면 프로그램 적으로 내보내기 사양을 만들어야합니까?

모든 도움이 감사합니다.

도움이 되었습니까?

해결책

나는 결국 이것을 해결했다. (저는 현재 Access 2007을 사용하고 있지만 Access 2003과 동일한 문제가있었습니다.)

첫째, 작동하지 않은 것 :

TransferText는 올바른 형식의 스키마를 사용하여 헤더 행 유니 코드와 Tilde가 구분되게 만듭니다. (아니요, 모든 것을 한 줄에 넣지 않았습니다. 그것은 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

내 최종 솔루션은 내 자신의 스키마를 만들고 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 Code Formatter는 내 "를 좋아하지 않으므로 코드를 잘 인쇄하지는 않습니다.

다른 팁

이 스레드와 관련하여 나는 모든 테이블 내보내기에서 하나의 사양을 사용할 수 있도록 엄청나게 간단한 솔루션을 우연히 발견했지만 일반적으로 각각 별도의 별도를 만들어야합니다. 또는 Richard A가 제공 한 하위 루틴을 사용하십시오.

프로세스는 다음과 같습니다.

사양 (예 : 파이프)을 만듭니다 | 모든 테이블로 구분 된 다음 SQL을 사용하여 액세스에서 Dynaset 쿼리를 엽니 다. SELECT * FROM MSysIMEXColumns 그런 다음 모든 결과 행을 삭제하십시오. 이제이 사양은 원래 사양을 작성하는 데 사용한 것과 다른 테이블을 사용하려고 시도 할 때 오류 3011을 제공하지 않으며 기본적으로 원하는 테이블/쿼리에 대한 범용 파이프 내보내기 사양입니다.

이것은 Access 2003에서 발견/테스트되었으므로 이후 버전에도 효과가 있다고 가정합니다.

친절한 안부,

매트 도난

두 가지 제안이 있습니다.

  1. 각 설정을 [schema.ini] 파일에 새 줄에 넣어야합니다. (당신은 여기에 한 줄에 그것을 모두 나열 했으므로 확실하다고 생각했습니다.)

  2. TransferText를 호출 할 때 CodePage 인수 (마지막)를 제공하는 것을 잊지 마십시오. 필요한 경우 지원되는 값 목록은 다음과 같습니다.

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

그 외에는 접근 방식이 작동하는 것처럼 보입니다.

답의 일부가 있습니다.

VBA로 schema.ini 파일을 작성한 다음 전송 텍스트를 작성하고 있습니다. 이것은 즉시 수출 형식을 생성하는 것입니다. 유일한 문제는 내 schema.ini가 포함되어 있지만 :

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

Tilde Delimiters와 함께 유니 코드에서 헤더 행 만 나옵니다. 나머지 행은 쉼표가있는 ANSI입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top