Question

Je souhaite exporter le contenu de plusieurs tables à partir de MSAccess2003. Les tableaux contiennent des caractères japonais unicode. Je souhaite les stocker sous forme de fichiers texte délimités par des tilde.

Je peux le faire manuellement en utilisant Fichier / Exporter et, dans la boîte de dialogue "Avancé", en sélectionnant un tilde comme séparateur de champs et unicode comme page de code.

Je peux stocker ceci en tant que spécification d'exportation, mais cela semble être spécifique à un tableau.

Je souhaite exporter de nombreuses tables à l'aide du code VBA.

Jusqu'à présent, j'ai essayé:

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

End Sub

Lorsque je lance ceci, une exception se produit:

Erreur d'exécution '3011': Le moteur de base de données Microsoft Jet n'a pas pu trouver l'objet "Allowance1 # txt". Assurez-vous que l'objet existe et que vous épelez son nom et le nom du chemin correctement.

Si je débogue à ce stade, TableName correspond à "Allocation1", comme prévu.

Je suppose que ma spécification d'exportation UnicodeTilde est spécifique à une table. Je ne peux donc pas l'utiliser pour plusieurs tables.

Quelle est la solution? Devrais-je utiliser autre chose que TransferText ou peut-être créer la spécification d'exportation par programme?

Toute aide appréciée.

Était-ce utile?

La solution

J'ai finalement résolu ce problème. (J'utilise maintenant Access 2007, mais j'ai les mêmes problèmes qu'avec Access 2003.)

Tout d'abord, ce qui n'a pas fonctionné:

TransferText rendrait uniquement l'en-tête Unicode et tilde délimités par la ligne d'en-tête, même avec un fichier schema.ini correctement formaté. (Non, je n'ai pas tout mis sur une seule ligne, c'était simplement un problème de formatage avec le code HTML sur stackoverflow.)

[MyTable.txt]
CharacterSet = Unicode
Format = Delimited(~)
ColNameHeader = True
NumberDigits = 10
Col1= "Col1" Char Width 10
Col2= "Col2" Integer
Col3= "Col3" Char Width 2

En utilisant simplement une instruction select:

SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]

Totalement ignoré le FMT. J'ai trouvé très difficile de trouver de la documentation sur le format des paramètres. Quoi que j'ai entré dans le paramètre FMT, les seules choses que je pouvais travailler étaient Fixées. Tout le reste a été traité comme CSVDelimited. Je pourrais vérifier si l'instruction select a créé un fichier schema.ini comme suit:

[MyTable.txt]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=Col1 Char Width 10
Col2=Col2 Integer
Col3=Col3 Char Width 2

Ma solution éventuelle était de créer mon propre fichier schema.ini, puis d'utiliser l'instruction select. Le code de mon module ressemble à ceci:

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

Je ne prétends pas que c'est élégant, mais ça marche. Notez également que le formateur de code stackoverflow n'aime pas mon \ " ;, il n'imprime donc pas vraiment mon code.

Autres conseils

En ce qui concerne ce fil de discussion, je suis tombé sur une solution incroyablement simple pour pouvoir utiliser une spécification dans toutes les exportations de table, alors qu’il faudrait normalement en créer une distincte pour chacune d’elles; ou utilisez la sous-routine fournie par Richard A.

Le processus est le suivant:

Créez une spécification, par exemple un tuyau | délimité par une table, puis ouvrez une requête de feuille de réponse dynamique avec un accès utilisant SQL SELECT * FROM MSysIMEXColumns , puis supprimez simplement toutes les lignes résultantes. Désormais, cette spécification n’indiquera pas l’erreur 3011 lorsque vous tenterez d’utiliser une table différente de celle utilisée pour créer la spécification d’origine. Il s’agit essentiellement d’une spécification universelle d’exportation de canal pour toute table / requête de votre choix.

Cela a été découvert / testé dans Access 2003, donc je suppose que cela fonctionnera également pour les versions ultérieures.

Cordialement,

Matt Donnan

J'ai deux suggestions pour vous:

  1. Assurez-vous de mettre chaque paramètre du fichier [schema.ini] sur une nouvelle ligne. (Vous l'avez répertorié ici sur une seule ligne, je pensais donc m'en assurer.)

  2. N'oubliez pas de fournir l'argument CodePage (le dernier) lorsque vous appelez votre TransferText. Voici une liste des valeurs prises en charge si vous en avez besoin:

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

En dehors de cela, il semble que votre approche devrait fonctionner.

J'ai une partie de la réponse:

J'écris un fichier schema.ini avec VBA, puis je fais mon TransferText. Cela crée un format d'exportation à la volée. Le seul problème est, bien que mon schema.ini contienne:

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

Seule la ligne d'en-tête est en sortie unicode avec des délimiteurs de tilde. Le reste des lignes est ANSI avec des virgules.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top