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 :

Array d'Arrays dynamiquement


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut Array d'Arrays dynamiquement
    Bonjour,

    J'ai beau chercher je ne trouve pas exactement ce que je souhaite savoir alors je me permet de poster ici.

    Voici la situation :
    Je reçois des fichiers excel (Voir pièce jointe).
    Mais les colonnes n'existent pas et il me faut donc (via une macro) scinder les lignes en différentes colonnes.
    Je fais donc cela sous Excel, avec Données --> Convertir.

    Cela revient à faire un fichier excel = Une macro de convertion de cellules.

    La fonction généré par excel est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub MacroFichier01()
     
        Columns("A:A").Select
        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
            FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(17, 1), Array(38, 1), Array(59, 1), _
            Array(71, 1), Array(79, 1), Array(84, 1), Array(87, 1), Array(98, 1), Array(109, 1), Array( _
            120, 1), Array(131, 1), Array(136, 1), Array(141, 1), Array(151, 1), Array(155, 1)), _
            TrailingMinusNumbers:=True
    End Sub
    Je souhaiterais maintenant le faire gràce à une et une seule fonction de façon dynamique.

    Pour cela, je dispose des largeurs de chaque colonnes sur le fichier excel (Elle correspondent aux nombres de tirets de la deuxième ligne du document excel)

    J'ai donc réussi à remplir une collection de largeurs afin d'instancier l'Array dynamiquement.

    Ma querstion est donc : Comment remplir dynamiquement un tableau comme celui généré par la fonction. Je n'arrive pas à boucler sur ma collection tout en instanciant mes tableaux.

    Merci à vous !
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un exemple à adapter
    Exportation de données se trouvant sur la colonne A de la feuille nommée Import vers la feuille Export du même classeur (ThisWorkbook).
    Les données sont séparées par un tiret et la première cellule remplie est A1.
    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
    Sub take()
     Dim shtImp As Worksheet, shtExp As Worksheet
     Dim myTable(), myNewTable() As String
     Dim r As Long
     Application.ScreenUpdating = False
     With ThisWorkbook
      Set shtImp = .Worksheets("Import")
      Set shtExp = .Worksheets("Export")
     End With
     myTable = shtImp.Range("A1").CurrentRegion
     For r = 1 To UBound(myTable)
      myNewTable = Split(myTable(r, 1), "-")
      With shtExp
      .Range(.Cells(r, 1), .Cells(r, UBound(myNewTable) + 1)) = myNewTable
      End With
     Next
     Application.ScreenUpdating = False
    End Sub
    Bonjour,
    Ou plutôt ceci sur la même feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim sht As Worksheet
     Set sht = ThisWorkbook.Worksheets("Import")
     Dim nb As Integer
     nb = Len(sht.Range("A1")) - Len((Replace(sht.Range("A1"), "-", ""))) + 1
     sht.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
       TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
       Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="-", FieldInfo:=Array(Array(1, 1), Array(nb, 1)), TrailingMinusNumbers:=True
    Il y a des arguments que l'on peut enlever.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Merci beaucoup pour ta réponse.

    Le premier exemple à l'air d'être ce que je cherche.

    Si j'ai bien compris, il va chercher chaque "-" pour créer les cellules dans une nouvelle feuille excel ?

    Moi je cherche à faire cela mais uniquement en me basant sur la seconde ligne (c'est elle qui me dit combien de caractères contiendra la colonne)
    exemple :
    (----- --- ----) = 1ère colonne fera 5 caractères, 2ième fera 3 carac. et la 3ième fera 4 carac.

    Je ne boucle pas sur chaque ligne pour avoir la largeur si tu vois ce que je veux dire.

    J'arrive a obtenir la longueur de chaque colonne, existe t'il une methode ou fonction permettant de scinder une ligne en plusieurs colonnes dynamiquement via notamment une collection de largeurs par exemple ?

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour séparer la chaîne de caractères en une table j'ai utilisé la fonction Split parce-que j'avais cru comprendre que tes données étaient séparées par un tiret.
    Pour en savoir plus sur cette fonction (voir le tutoriel Manipuler les chaînes de caractères en VB6 et VBA Excel) de Silkyroad.
    Le code ci-dessous, renvoie dans une table nommée myNewTable les éléments se trouvant dans myTable( r, 1) séparés par un tiret.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myNewTable = Split(myTable(r, 1), "-")
    Par exemple si la valeur de myTable(1, 1) est "Nom-Prénom-+3310000", nous aurons :
    myNewTable(0) = "Nom"
    myNewTable(1) = "Prénom"
    myNewTable(2) = "+3310000"

    Le code ci-dessous place dans une table la colonne où se trouve les données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myTable = shtImp.Range("A1").CurrentRegion
    Celui-ci parcourt la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     For r = 1 To UBound(myTable)
      myNewTable = Split(myTable(r, 1), "-") ' Converti la chaîne en table
      With shtExp
      ' Ecrit dans les colonnes 1 à x de la ligne r 
      ' x représente le nombre d'éléments que contient la table+1 soit UBound(myNewTable) +1 
      .Range(.Cells(r, 1), .Cells(r, UBound(myNewTable) + 1)) = myNewTable 
      End With
     Next
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Ces explications m'ont été très utiles !

    J'ai fini par trouver la méthode à utiliser en me basant sur ton aide, merci à toi !

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

Discussions similaires

  1. cell array --> double array ?
    Par Truth dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/04/2008, 14h24
  2. Array of array en dynamique
    Par Archimède dans le forum Langage
    Réponses: 16
    Dernier message: 03/11/2007, 17h01
  3. [Tableaux] array => fichier => array ?
    Par adimou dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2007, 21h22
  4. Déclaration de type array of array of variant
    Par Drooxy dans le forum Delphi
    Réponses: 4
    Dernier message: 14/12/2006, 19h25
  5. Comment faire le tri d'un array of array ?
    Par Tchouffy dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2005, 20h55

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