IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb avec .TextFileColumnDataTypes [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut Pb avec .TextFileColumnDataTypes
    Bonjour,
    J'écris une macro pour automatiser l'import de fichier .csv avec le bon format. J'utilise donc la propriété .TextFileColumnDataTypes pour construire ma table de requête mais je n'arrive vraiment pas à faire passer des paramètres variables.
    La forme classique est, par exemple :
    .TextFileColumnDataTypes = Array(1, 4, 2)
    et ça fonctionne très bien... tant que c'est en dur dans le code, du style :
    Dim vzone as Variant
    vzone = Array(1, 4, 2)
    ...
    .TextFileColumnDataTypes = vzone


    Mais, selon le fichier que j'importe, j'ai besoin de faire passer différents paramètres calculés dans Excel même. Une fois les valeurs dans des variables, je n'arrive pas à reconstituer un 'Array' que la fonction accepte. Je reçoit toujours une erreur 5 : Argument ou appel de procédure incorrect.
    Voici un extrait du code dont je me sers pour chercher une solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub go4it()
        Dim vZone As Variant
        vZone = Array(1, 2, 4)
    ' vFichier  est le nom complet avec le path du fichier .csv
    ' vNom est juste le nom du fichier .csv
        ActiveWorkbook.Worksheets.Add
        With ActiveSheet.QueryTables.Add(Connection:=vFichier, Destination:=Range("$A$1"))
            .Name = vNom
            .FieldNames = True
            .RowNumbers = False
            .PreserveFormatting = True
            .AdjustColumnWidth = True
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileSemicolonDelimiter = True
            .TextFileColumnDataTypes = vZone
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    Ce serait vraiment sympa si quelqu'un pouvait m'aider... et notamment à mieux comprendre comment fonctionne les 'Array' en VBA.
    Merci beaucoup.
    Emmanuel

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir
    J'ai testé ton code sur l'un de mes fichier sans souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub go4it()
    Dim vNom As String, vFichier As String
    Dim vZone As Variant
     
     
    vNom = "Classeur2"
    vFichier = "C:\Users\user\Desktop\" & vNom & ".csv"
    vZone = Array(1, 2, 3)
    ThisWorkbook.Worksheets.Add
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & vFichier, Destination:=Range("$A$1"))
        .Name = vNom
        .FieldNames = True
        .RowNumbers = False
        .PreserveFormatting = True
        .AdjustColumnWidth = True
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileSemicolonDelimiter = True
        .TextFileColumnDataTypes = vZone
        .Refresh BackgroundQuery:=False
    End With
    End Sub

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut
    Bonjour Mercatog,

    Merci pour ta réponse mais je me suis sans doute mal exprimé : Mon code fonctionne chez moi aussi mais je voudrais que les 1, 2 et 4 de mon exemple dans l'array soient des variables que je récupère dans des cellules pour que ça donne à peu près ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    v1 = Cells (1, 1)
    v2 = Cells (2, 2)
    v3 = Cells (3, 3)
    vzone = Array(v1, v2, v3)
    et ça ne fonctionne pas
    Sais-tu comment faire ? Merci
    Emmanuel

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Supposons que tu récupères tes données de ton array dans A1, B1 et C1 de la feuille Feuil2. Cette plage doit être remplie convenablement sinon, tu auras une erreur.

    Code testé en mettant 1 dans A1, 2 dans B1 et 1 dans C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub go4it()
    Dim vNom As String, vFichier As String
    Dim vZone As Variant
     
     
    vNom = "Nom"
    vFichier = "C:\Documents and Settings\Administrateur\Bureau\" & vNom & ".csv"
    'Tu récupère les données des cellules de Feuil2
    With ThisWorkbook.Worksheets("Feuil2")
        vZone = .Range("A1:C1")
        'ou comme ceci si les cellules ne sont pas contigues
        'vZone = Array(.Cells(1, 1), .Cells(2, 2), .Cells(3, 3))
    End With
     
    ThisWorkbook.Worksheets.Add
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & vFichier, Destination:=Range("$A$1"))
        .Name = vNom
        .FieldNames = True
        .RowNumbers = False
        .PreserveFormatting = True
        .AdjustColumnWidth = True
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileSemicolonDelimiter = True
        .TextFileColumnDataTypes = vZone
        .Refresh BackgroundQuery:=False
    End With
    End Sub

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut
    ça marche ! Merci beaucoup !
    Je râle juste un peu de ne pas avoir réussi tout seul... surtout que je suis passé tout près du but à maintes reprises.

    En tous cas, merci beaucoup et bravo pour la maîtrise ! J'ai passé quelques heures sur le forum à regarder les réponses (dont les tiennes) : Impressionnant !
    A bientôt,
    Emmanuel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo