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 :

VBA - Récuperer des données en tableau sous deux colonnes [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut VBA - Récuperer des données en tableau sous deux colonnes
    Bonjour,
    J'ai un fichier sous la forme
    N°! NOM    ! Prénom ! Activité ! Lieu... 
    1 ! Durant ! Marc   ! TC       ! 1er 
    2 ! Job    ! Léo    ! TC       ! 19e
    Je voudrais avoir mes données
    Col1 ! Col2 
    N°   ! Nom 
         ! Prénom 
         ! Activité 
         ! Lieu 
    1    ! Durant 
         ! Marc 
         ! TC 
         ! 1er 
    2    ! Job 
         ! Léo 
          ... 
    (!repésente les colonnes)
    Les nb de colonnes et de lignes sont aléatoires et le résultat sur une autre feuille
    Est-ce que quelqu'un peut m'aider, svp.
    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Je vous suggère de commencer en mode enregistrement macro + utilisez les fonctions collage + transposition pour Nom, Prénom, .... et de regarder ce que celà donne, ça sera plus enrichissant que de vous fournir en bout de code.
    Par curiosité, je suis curieux de savoir pourquoi vous avez besoin d'un tel format de sortie, peut facile à réutiliser par ailleurs ....

    Bonne journée

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Les données initiales étant sur "Feuil1" et les résultats sur "Feuil2", essaie :

    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 test()
        Dim Plage As Range, C As Range, Ligne As Long, Col As Integer
        With Sheets("Feuil1") 'feuille contenant les données
            Set Plage = .Range("B1", .Cells(.Rows.Count, 2).End(xlUp))
        End With
        With Sheets("Feuil2") 'feuille contenant les données
            For Each C In Plage
                If C.Offset(, -1) <> "" Then
                    Ligne = Ligne + 1
                    .Cells(Ligne, 1) = C.Offset(, -1).Value
                    Col = 1
                Else
                    Col = Col + 1
                    .Cells(Ligne, Col) = C.Value
                End If
            Next C
        End With
    End Sub
    Je reste à ta disposition pour tout complément d'information.

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour !

    Données sur la feuille 1 en bloc à partir de la cellule A1,
    une variante somme toute classique à coller dans le module de la feuille résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Demo1()
        With Feuil1.Cells(1).CurrentRegion
            CC& = .Columns.Count - 1:  If CC = 0 Then Beep: Exit Sub
            NL& = 1:  Application.ScreenUpdating = False:  Cells(1).CurrentRegion.Clear
     
            For R& = 1 To .Rows.Count
                         Cells(NL, 1).Value = .Cells(R, 1).Value
              Cells(NL, 2).Resize(CC).Value = Application.Transpose(.Cells(R, 2).Resize(, CC).Value)
                                         NL = NL + CC
            Next
        End With
    End Sub

    Plus la source contient de lignes plus une variante utilisant des variables tableaux sera la plus rapide,
    démonstration à coller également dans le module de la feuille résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Demo2()
        With Feuil1.Cells(1).CurrentRegion
            CC& = .Columns.Count:   If CC < 3 Then Beep: Exit Sub
            RC& = .Rows.Count:      VA = .Value
        End With
                                    ReDim AR(1 To RC * (CC - 1), 1 To 2)
        For R& = 1 To RC
            L& = L& + 1:  AR(L, 1) = VA(R, 1):  AR(L, 2) = VA(R, 2)
            For C& = 3 To CC:    L = L + 1:     AR(L, 2) = VA(R, C):    Next
        Next
     
        Cells(1).CurrentRegion.Clear
        Cells(1).Resize(UBound(AR), UBound(AR, 2)).Value = AR:  Erase AR, VA
    End Sub
    _________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  5. #5
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut
    Bonjour Vinc_bilb, Daniel, et Marc
    Merci de vos réponses ; j'ai mis un peu de temps à répondre, car j'ai essayé de comprendre et de réutiliser
    Vinc_bilb : j'ai créé une procédure pour la planification mensuelle des tâches et des permanences
    J'ai créé une table agent, N°! NOM ! Prénom! Activité !Lieu... , facile à remplir et à mettre à jour
    Mais dans mes feuilles de planification, j'ai besoin de récupérer ces infos dans le format demandé...
    Daniel : ta poposition est à ma portée, j'ai donc pu l'aménager comme j'en avais besoin
    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
    Sub test()
    Dim Plage As Range, C As Range, Ligne As Long, Col As Integer
    Dim DerLg As Long, t As Single
    t = Timer
    DerLg = Sheets("Feuil1").Range("A600").End(xlUp)(1).Row
        Set Plage = Sheets("Feuil1").Range("A2:A" & DerLg)
    With Sheets("Feuil4") 'feuille contenant les données
        Cells(1).CurrentRegion.Clear
        For Each C In Plage
                Ligne = Ligne + 1
                .Cells(Ligne, 1) = C.Offset(, 3).Value  'Cells(Lg,1) à remplir N°
                .Cells(Ligne, 2) = C.Offset(, 0).Value 'à coté => Nom
                .Cells(Ligne + 1, 2) = C.Offset(, 1).Value  'Dessous le prénom
                .Cells(Ligne + 2, 2) = C.Offset(, 2).Value  'Dessous le Métier
                Ligne = Ligne + 2
        Next C
    End With
        MsgBox Timer - t    '3.288
    End Sub
    Marc: là j'ai du mal, mais c'est super - ça va vraiment très vite
    Pour le Demo1 j'ai pu suivre et adapter ; pour Demo2, là j'ai beaucoup plus de mal ; il faut dire que tu joues beaucoup d'abréviations
    Si tu pouvais détailler un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           For C& = 3 To CC:    L = L + 1:     AR(L, 2) = VA(R, C):    Next
    ...
        Cells(1).Resize(UBound(AR), UBound(AR, 2)).Value = AR:  Erase AR, VA

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           For C& = 3 To CC:    L = L + 1:     AR(L, 2) = VA(R, C):    Next
    ...
        Cells(1).Resize(UBound(AR), UBound(AR, 2)).Value = AR:  Erase AR, VA
    Tout découle du tutoriel, en le lisant cela deviendra donc clair !

    • Ligne n°1 : C comme colonne, L comme ligne, R comme Row (ligne), Whou-Ou ‼
    Rien qu'en regardant dans le code l'initialisation des variables CC & RC

    • Ligne n°3 : Copie la variable tableau dans la feuille de calculs puis réinitialise les variables (pas obligatoire) …

    Rappel du B-A-BA : positionner le curseur texte sur une instruction puis appuyer sur la touche , tout est là !

    Et ici ce n'est pas le forum dédié au VBA mais celui des formules de feuilles de calculs !
    Si j'y avais prêté attention hier, je n'aurais rien posté …

    _________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  7. #7
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut
    Bonjour Marc,

    Merci de tes explications, désolée de t'avoir énervé. je ne sais pas de quel Tutoriel tu fais allusion, il n'y en a pas beaucoup qui traitent les Array et pour moi en tout cas, ce n'est pas évident.
    Quant au choix VBA, j'étais partie sur l'idée d'une formule avec Décaler, mais j'ai changé d'avis...

    Bonne fin de journée

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

Discussions similaires

  1. [AC-2007] Enregistrer des données dans un sous formlaire en VBA
    Par Azomix dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/01/2012, 16h20
  2. [Débutant] Extraire une partie des données d'un fichier à deux colonnes.
    Par NoobTotal dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/12/2011, 17h15
  3. [XL-2010] Transferer des données d'excel sous Word - VBA sous excel
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/08/2011, 13h48
  4. Réponses: 2
    Dernier message: 22/07/2011, 15h44
  5. Récuperer des données dans un tableau
    Par yacinus2007 dans le forum ASP.NET
    Réponses: 23
    Dernier message: 20/06/2007, 11h49

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