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 :

Formules Excel en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 98
    Points : 55
    Points
    55
    Par défaut Formules Excel en VBA
    Bonjour,

    je cherche à réaliser en VBA un code pour éviter à avoir à saisir les formules dans une multitude de cellules.
    je m'explique, je récupère une succession de valeurs (~32000) par nb matrices (X colonnes * Y lignes) séparées par une ligne vide.
    je dois empiler les valeurs des matrices en une colonne en autant de colonnes que de matrices.
    Pas facile à expliquer, je joins un fichier exemple commenté pour comprendre ma demande.
    J'ai fais des recherches sur le forum mais pas trouvé chaussure à mon pied !
    regardé les tutos mais du coup je n'ai plus les yeux en face

    Je fais donc appel à vos connaissances et votre généreuse aide pour m'orienter dans ce dédale d'information.

    Merci par avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,

    Si j'ai bien compris ton problème, il te faudrait passer par un index/equiv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX($B$4:$F$7;EQUIV($F25;$G$4:$G$7;0);EQUIV($G25;$B$3:$F$3;0))
    $F25 = "A" et $G25 = 1, par exemple.

    Regardes de ce côté et restructure peut être un peu tes tableaux.

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Automat
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Automat
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Pourrais tu fournir 1 ou 2 fichiers que tu dois exploiter ? ce serait plus simple pour la compréhension.

    Ci joint un bout de code comme j'ai compris, il ne reste qu'a remplacer le nom des feuilles ...


    EnjOy
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Vu la quantité de lignes X par le nombre de colonnes, à résoudre par formules, ça risque de peser lourd. Je vous propose une solution en VBA.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Explicit
     
    Sub Empilement()
        Dim f1 As Worksheet, f2 As Worksheet
        Dim i As Long, DerCol_f1 As Long, DerLig_f1 As Long, DerLig_f2 As Long, DerCol_f2 As Long, DerLig_Mes As Long, Lig_f2 As Long, Col_f2 As Long, c As Long, Nb_Lig As Long, k As Long
        Dim m As Range, cell As Range
        Dim d As Object
        Dim Couleur As Long, Couleur1 As Long, Couleur2 As Long
        Application.ScreenUpdating = False
        Set f1 = Sheets("BDD")
        Set f2 = Sheets("Synthese")
        f2.Cells.Clear
        Set d = CreateObject("Scripting.Dictionary")
        DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
        Col_f2 = 2
        For i = 1 To DerLig_f1
            Lig_f2 = 2
            With f1.Range("A1:A" & DerLig_f1)
                Set m = .Find("mesure " & i, lookat:=xlWhole)
                If Not m Is Nothing Then
                    DerCol_f1 = f1.Cells(m.Row, 1).End(xlToRight).Column
                    DerLig_Mes = f1.Cells(m.Row, "B").End(xlDown).Row
                    For c = DerCol_f1 To 2 Step -1
                        For Each cell In Range(f1.Cells(m.Row + 1, c), f1.Cells(DerLig_Mes, c))
                            d.Add cell, ""
                        Next cell
                        f2.Cells(Lig_f2, Col_f2).Resize(d.Count, 1) = Application.Transpose(d.keys)
                        Lig_f2 = Lig_f2 + d.Count
                        d.RemoveAll
                    Next c
                    f2.Cells(1, Col_f2) = "Mesure " & i
                    Col_f2 = Col_f2 + 1
                End If
            End With
        Next i
     
        'remplissage de la première colonne avec la position des relevés par ligne
        With f1.Range("A1:A" & DerLig_f1)
            Set m = .Find("mesure 1", lookat:=xlWhole)
            DerLig_Mes = f1.Cells(m.Row, "B").End(xlDown).Row
            DerCol_f2 = f2.Cells(2, 2).End(xlToRight).Column
            DerLig_f2 = f2.Columns("B").Find(what:="*", searchdirection:=xlPrevious).Row
     
            'Séparation des tranches de relevés par une alternance de couleurs
            Nb_Lig = DerLig_Mes - m.Row
            Couleur1 = 43
            Couleur2 = 4
            For k = 2 To DerLig_f2 Step Nb_Lig
                For i = 1 To DerLig_Mes 'Nb_Lig
                    If f2.Cells(k + i - 1, "B") <> "" Then f2.Cells(k + i - 1, "A") = "Ligne " & i
                Next i
                If Couleur = Couleur1 Then Couleur = Couleur2 Else: Couleur = Couleur1
                Range(f2.Cells(k, 1), f2.Cells(k + Nb_Lig - 1, DerCol_f2)).Interior.ColorIndex = Couleur
            Next k
        End With
     
        Set m = Nothing
        Set f1 = Nothing
        Set f2 = Nothing
    End Sub
    le fichier
    Pièce jointe 599899

    Cdlt

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 98
    Points : 55
    Points
    55
    Par défaut
    Houaa!!

    Bonjour et Merci à tous pour vos propositions

    je me suis connecté ce matin pour comprendre le code de Gado2600 et je ne me suis pas re penché sur le post !

    j'ai rapidement regardé vos solutions qui me semble répondre de façon différentes mais quel taf ! merci les gars

    je regarde cela en détail ce soir

    N'étant pas du tout un habitué de VBA, mais un passionné des chalenges j'ai pris ce projet.

    Dans un premier temps, j’ai repris les tutos et les réponses sur la fonction « CONCATENATE » mais je suis largué dans l’utilisation des boucles imbriquer pour réaliser cette concaténation.
    je souhaite concaténer dans une colonne les valeurs (numérique, 1 à 26) d’une colonne et les valeurs (string A à BL) d’une ligne.

    En résumé j’ai dans une colonne les valeurs de 1 à 26 et sur une ligne les valeurs de A à BL et je souhaite écrire dans une colonne la suite concaténée des A1, B1,C1….jusqu’à BL62, BL63, BL64.
    Soit 1664 ref de cellules.
    Je joins un petit fichier d’exemple pour la compréhension du but recherché.

    Merci encore pour votre aide spontanée
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonsoir,

    Proposition, en premier lieu la solution avec le résultat obtenu en 3 étapes de la colonne A à C pour en comprendre le raisonnement, et enfin la solution avec une formule unique en colonne K.
    Formules décomposées;
    en colonne A:
    en colonne B:
    en colonne C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDIRECT(GAUCHE(ADRESSE(1;$A5;4);TROUVE(1;ADRESSE(1;$A5;4))-1)&4)&$B5

    La formule unique en colonne K (un condensé des 3 autres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDIRECT(GAUCHE(ADRESSE(1;67-MOD(LIGNE()-5;64);4);TROUVE(1;ADRESSE(1;67-MOD(LIGNE()-5;64);4))-1)&4)&$B5
    Pièce jointe 599928

    Cdlt

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 98
    Points : 55
    Points
    55
    Par défaut
    Bonjour AURTURO83,

    j'ai eu des galères avec office, il m'a fallut réparer office ! plus de macro ne fonctionnait et gros problème d'affichage!!

    Bon maintenant c'est rentré dans l'ordre

    J'ai scruté les lignes ci-dessous avec les espions pour comprendre comment était sélectionnée la première valeur en F4, car dans mon fichier d'exemple initial les valeurs de B3:F1 et B9:F9 et B16:F16 n'étaient là que pour la compréhension ! mon fichier ne comporte pas de valeur sur ces plages et du coup VBA plante!

    je vois bien les variables évoluer dans le bon sens mais je n'ai pas trouvé la zone de code à modifier!
    je suis preneur du déroulement de cette sélection pour comprendre la modification à réaliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Not m Is Nothing Then
                    DerCol_f1 = f1.Cells(m.Row, 1).End(xlToRight).Column
                    DerLig_Mes = f1.Cells(m.Row, "B").End(xlDown).Row
                    For c = DerCol_f1 To 2 Step -1
                        For Each cell In Range(f1.Cells(m.Row + 1, c), f1.Cells(DerLig_Mes, c))
                            d.Add cell, ""
                        Next cell
    Sinon, merci de nouveau à chacun pour vos réponses qui n'ont permis, en partie, de mieux digérer VBA

    Cdlt

  8. #8
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    J'ai scruté les lignes ci-dessous avec les espions pour comprendre comment était sélectionnée la première valeur en F4, car dans mon fichier d'exemple initial les valeurs de B3:F1 et B9:F9 et B16:F16 n'étaient là que pour la compréhension ! mon fichier ne comporte pas de valeur sur ces plages et du coup VBA plante!
    Pourquoi ne pas avoir donner les bons emplacements?

    Sinon voici la partie de code commentée:
    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
        Set f1 = Sheets("BDD") 'contient l'ensemble des tableaux à traiter
        Set f2 = Sheets("Synthese") ' Feuille destination des resultats
        f2.Cells.Clear ' on efface les résultats précédents dans la  feuille "Synthèse"
        Set d = CreateObject("Scripting.Dictionary") 'on crée l'objet "dictionnaire"
        DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'on détermine ou se trouve le dernoier mot "mesure " dans la colonne A feuille "BDD"
        Col_f2 = 2 'on initialise la première colonne de destination dans la feuille "Syntèse"
        For i = 1 To DerLig_f1
            Lig_f2 = 2 'N° de la ligne où sera collée la  première donnée dans la feuille "Synthèse"
            With f1.Range("A1:A" & DerLig_f1) 'dans la colonne "A" de la feuille "BDD"
                Set m = .Find("mesure " & i, lookat:=xlWhole) 'Cherche le mot "mesure" dans la colonne "A"
                If Not m Is Nothing Then 'si le mot "mesure" est trouvé, alors
                    DerCol_f1 = f1.Cells(m.Row, 1).End(xlToRight).Column 'On cherche la dernière colonne du tableau à traiter
                    DerLig_Mes = f1.Cells(m.Row, "B").End(xlDown).Row 'on cherche la dernière ligne du tableau à traiter
                    For c = DerCol_f1 To 2 Step -1 'de la dernière à la 2 colonne du tableau à traiter
                        For Each cell In Range(f1.Cells(m.Row + 1, c), f1.Cells(DerLig_Mes, c)) 'pour chaque cellule de la colonne du tableau à traiter
                            d.Add cell, "" 'on enregistre dans un dictionnaire toutes les valeurs
                        Next cell ' on passe à la cellule suivante
                        f2.Cells(Lig_f2, Col_f2).Resize(d.Count, 1) = Application.Transpose(d.keys) 'on restitue dans la feuille "Synthèse"  les valeurs mémorisées dans le dictionnaire
                        Lig_f2 = Lig_f2 + d.Count 'on passe à la ligne suivante qui est égale la ligne en cours + nombre de valeurs enregistrées dans le dictionnaire
                        d.RemoveAll ' on efface le contebu du dictionnaire
                    Next c
                    f2.Cells(1, Col_f2) = "Mesure " & i 'on inscrit "Mesure " dans la colonne de la feuille "Synthese"
                    Col_f2 = Col_f2 + 1 'on passe à la colonne suivante
                End If
            End With
        Next i 'on va chercher les données de la mesure suivante
    Cdlt

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 98
    Points : 55
    Points
    55
    Par défaut
    Grace aux espions j'ai bien compris le déroulement et les variations qui en découlent.

    Mais je ne vois pas comment débuter l'enregistrement des valeurs dans le dictionnaire si les cellules de la ligne supérieur sont vides!


    là ça fonctionne!
    Nom : Capture 1.PNG
Affichages : 110
Taille : 3,8 Ko

    là ça plante !
    Nom : Capture 2.PNG
Affichages : 110
Taille : 4,1 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pourquoi ne pas avoir donner les bons emplacements?
    si si !

    Nom : Capture.PNG
Affichages : 111
Taille : 13,9 Ko

    Cdlt

  10. #10
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Mais je ne vois pas comment débuter l'enregistrement des valeurs dans le dictionnaire si les cellules de la ligne supérieur sont vides!
    De quelles lignes parlez-vous? montrez-moi des exemples.

    Sinon, le dictionnaire commence à ce remplir à partir de la ligne m.Row + 1 (m.row étant la ligne ou il trouve le mot mesure)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Range(f1.Cells(m.Row + 1, c), f1.Cells(DerLig_Mes, c)) 'pour chaque cellule de la colonne du tableau à traiter.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 98
    Points : 55
    Points
    55
    Par défaut
    Bonjour ARTURO83,

    En regardant en détail le déroulement pas à pas j'ai mis le constat dans le fichier présent dans cette réponse.
    le test fonctionne bien sur la première boucle IF mais plante sur le deuxième passage dans cette boucle.
    La dernière colonne vue non vide est =6 pour i=1 mais 16834 pour i= 2 !!
    je n'ai pas trouvé de cellule non vide au-delà de la colonne 6 !

    Du coup j'ai reformulé la ligne de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DerCol_f1 = f1.Cells(m.Row + 1, 16384).End(xlToLeft).Column
    Et ça fonctionne


    Pour le fichier de concaténation merci pour les explications en détails qui m'ont permis de comprendre et modifier mon fichier.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. formule Excel dans VBA
    Par ninette24 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/07/2008, 14h31
  2. formule excel vers VBA
    Par kedas dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/10/2007, 18h18
  3. Parseur formule Excel <-> Code VBA
    Par gretch dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/08/2007, 18h08
  4. Correspondance formules excel et VBA
    Par abu143 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/10/2006, 17h54
  5. [EXCEL][VBA] Utilisation des formules Excel en VBA
    Par Amanck dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 15h08

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