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 :

Initialiser l'argument FieldInfo pour OpenText [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut Initialiser l'argument FieldInfo pour OpenText
    Bonjour,
    Je cherche désespérément à initialiser l'argument FieldInfo de la méthode OpenText à partir d'informations transmise par un opérateur.
    Tout ce que je trouve se fait directement dans le code par exemple FieldInfo:=Array(Array(0, 1), etc.

    Je voudrai juste à définir les colonnes devant avoir un format texte (pour conserver les zéros de donnée texte contenant que des chiffres). Par exemple l'opérateur transmet une variable "3;5" pour indiquer que la colonne 3 et 5 doivent être au format texte.

    J'ai dans un premier temps créer une variable string FormCol="Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1),Array(5, 2))" mais FieldInfo:=FormCol
    génère une erreur.

    Puis j'ai cherché à créer un tableau du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim FormCol(5)
    FormCol(1)=Array(1, 1)
    FormCol(2)=Array(2, 2)
    FormCol(3)=Array(3, 1)
    FormCol(4)=Array(4, 1)
    FormCol(5)=Array(5, 2)
    ....
    Workbooks.OpenText Filename:=ChemFich, ....FieldInfo:=FormCol()
    Mais cela ne marche pas non plus ....

    Par avance, merci

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Sans avoir testé, je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim FormCol(5)
    FormCol(1)="Array(1, 1)"
    FormCol(2)="Array(2, 2)"
    FormCol(3)="Array(3, 1)"
    FormCol(4)="Array(4, 1)"
    FormCol(5)="Array(5, 2)"
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    Merci pour l'idée mais je viens de faire l'essai et cela ne marche pas.
    Peut être de la façon dont je transmet le tableau FieldInfo:=FormCol() ?
    En tout cas j'ai du mal à comprendre l'initialisation de cet argument.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    pou moi c:
    FieldInfo:=Array(Array(1,4),Array(2,6),etc..)
    le premier élément des tableaux etant le numéro de colonne et commençant donc à 1 et non à 0. Mais par contre ce ne doit pas être une variable de type string, c'est bien un tableau qui est attendu.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    Cela ne vient de la façon de transmettre la variable car j'ai fait un essai qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormCol()=Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1),Array(5, 2)))
    Workbooks.OpenText Filename:=ChemFich, ....FieldInfo:=FormCol()
    J'avoue que l'argument tableau contenant un tableau vide cela me dépasse un peu...

  6. #6
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    Citation Envoyé par Benjîle Voir le message
    pou moi c:
    FieldInfo:=Array(Array(1,4),Array(2,6),etc..)
    le premier élément des tableaux etant le numéro de colonne et commençant donc à 1 et non à 0. Mais par contre ce ne doit pas être une variable de type string, c'est bien un tableau qui est attendu.
    OK pour le tableau mais comment tu l'initialise de façon dynamique ?

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    avec redim preserve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim obj()
    obj = Array(Array(1, 1))
    ReDim Preserve obj(1)
    obj(1) = Array(2, 1)
    ReDim Preserve obj(2)
    obj(2) = Array(3, 1)
    obj2 = obj(1)
    Debug.Print obj2(1)
     
     
    Workbooks.OpenText Filename:="C:\Documents and Settings\Benjîle\Bureau\myfile.log", fieldinfo:=obj

  8. #8
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    J'ai repris le principe de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim obj()
    obj = Array(Array(1, 1))
    ReDim Preserve obj(1)
    obj(1) = Array(2, 1)
    ReDim Preserve obj(2)
    obj(2) = Array(3, 1)
    Workbooks.OpenText Filename:="C:\Documents and Settings\Benjîle\Bureau\myfile.log", fieldinfo:=obj
    Je n'ai pas compris la ligne "obj2 = obj(1)" et "Debug.Print obj2(1))" que je n'ai pas repris dans mon code.

    Après essai cela ne marche toujours pas "Erreur 13" incompatibilité de type.

    Ne pourrait on pas partir d'une variable chaîne :
    "Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1),Array(5, 2)))"
    et la transformer en code interprétable pour initialiser le tableau FormCol() ?

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    les lignes obj2 et debug était juste pour faire un test.

    Où obtient l'erreur? sur la ligne opentext?

    Et as tu bien fait attentiion à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim obj()
    obj = Array(Array(1, 1))
    pour initialiser le tableau qui devra être redimensionné et son premier élément?

    En tout cas chez moi ça fonctionne parfaitement.

    EDIT: je viens de faire des essais avec tes codes à toi et je sais d'où vient l'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim FormCol(4)
    FormCol(0)=Array(1, 1)
    FormCol(1)=Array(2, 2)
    FormCol(2)=Array(3, 1)
    FormCol(3)=Array(4, 1)
    FormCol(4)=Array(5, 2)
    ....
    voici le bon code pour un fichir à 5 colonnes. Ton erreur a été de ne pas renseigner le premier indice du tableau (FormCol(0))

    Sinon tu peux ajouter l'option de compilation
    qui impose au tableau de démarrer à l'indice 1 (et ton code marchera tel quel)
    mais tous les tableaux de ta feuille de module seront ré-indicés, ça risque de bugger ailleurs.

    Perso je préfère déclarer les tableaux par

    En tout cas dans l'instruction

    le 4 ne peut être une variable. Pour rendre des instructions vraiment dynamiques à mon avis tu seras obligé de passer par redim preserve
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim preserve FormCol(0 to n)
    ça ça fonctionne


    Citation Envoyé par Trarc Voir le message
    pas "Erreur 13" incompatibilité de type.

    Ne pourrait on pas partir d'une variable chaîne :
    "Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1),Array(5, 2)))"
    et la transformer en code interprétable pour initialiser le tableau FormCol() ?
    la seule façon de procéder ainsi serait de disposer en vba d'une fonction capable d'évaluer du texte comme du vb à la façon du php, mais selon moi ça n'existe pas (sauf à faire un code bourrin qui vient modifier le projet vb).

  10. #10
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    En simplifiant mon code initial pour faire un test plus proche de ta solution cela fonction parfaitement
    Voici le test avec un fichier avec 19 colonnes dont la première doit rester en texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            InfoChp = Array(Array(1, 2))
            For x = 1 To 18
                ReDim Preserve InfoChp(x)
                InfoChp(x) = Array(x, 1)
            Next x
            Workbooks.OpenText Filename:=SourcFich, Origin:=xlMSDOS, _
                StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
                ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, _
                Comma:=False, Space:=False, Other:=False, FieldInfo:=InfoChp, _
                TrailingMinusNumbers:=True
    Il ne reste plus qu'à trouver d'où vient mon erreur...
    Merci pour ton aide.

  11. #11
    Membre averti
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut J'AI LA REPONSE
    J'avais le même problème que vous pour paramétrer dynamiquement l'ouverture d'un fichier texte.....
    En lisant vos premiers messages, j'ai eu la révélation...
    Lorsque vous dites que la numérotation du tableau débute à l'index 0, je me suis dit que la fonction ne voulait pas de cette donnée !!!!
    J'ai donc initialiser le tableau avec (1 to 40) : cela indique qu'il n'y a pas d'index 0........
    Et ça marche ! ! !
    un "Explicit base" (de mémoire) aurait fait aussi bien je pense (pas testé)

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

Discussions similaires

  1. Erreur pour initialiser les arguments
    Par LastSpear dans le forum OpenCL
    Réponses: 2
    Dernier message: 24/06/2010, 12h33
  2. argument dnDevInst pour CM_Request_Device_Eject
    Par dtcSearch dans le forum C#
    Réponses: 0
    Dernier message: 31/12/2009, 09h54
  3. Réponses: 2
    Dernier message: 11/05/2009, 15h25
  4. Réponses: 4
    Dernier message: 21/03/2008, 17h40
  5. Réponses: 5
    Dernier message: 10/03/2006, 17h13

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