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 :

Macro pour fusionner une sélection


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Macro pour fusionner une sélection
    Bonjour,

    Mon but est que l'utilisateur de la macro, puisse fusionner plusieurs lignes qu'il sélectionne avec concaténation du texte et somme des nombres. Voir fichier ci-joint.

    Merci

    fusion.xlsx

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 108
    Points : 171
    Points
    171
    Par défaut macro pour fusionner une selection
    Bonjour
    En premier déterminer la selection (fait)
    En second concatener les éléments de la selection (à faire): tester si numerique avec la fonction IsNumeric alors additionner, sinon concatener '+'

    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 Detecter_Limites_Lignes_colonnes(rowmax As Long, rowmin As Long, colmax As Long, colmin As Long)
        Dim cell As Object
        Dim maxlong As Long
        maxlong = 2 ^ 31 - 1
        rowmax = 0: colmax = 0: rowmin = maxlong: colmin = maxlong
        For Each cell In Selection
            If cell.row < rowmin Then rowmin = cell.row
            If cell.Column < colmin Then colmin = cell.Column
            If cell.row > rowmax Then rowmax = cell.row
            If cell.Column > colmax Then colmax = cell.Column
     
        Next cell
        MsgBox " row max=" & rowmax & "column max=" & colmax & " row min=" & rowmin & " col min=" & colmin
    End Sub

  3. #3
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    @fraflt69 : à quoi sert ton code dans ce cas ?
    @xuan203 : déjà, bienvenu au forum.
    Tu pourras répondre à beaucoup de questions de syntaxe en VBA grâce à l'enregistreur de macro.
    Du coup, comment fusionner des cellules --> voir avec l'enregistreur de macro.
    Ensuite, comme te dis fraflt69, il faudrait que tu détectes de quel type sont les cellules (numériques ou non) grâce à IsNumeric pour savoir s'il faut concaténer (&) ou additionner (+).
    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 fusion()
        Dim texte As Boolean
        Dim cellule As Range
        texte = False    
        '1. Quel type de valeurs
        For Each cellule In Selection
            If isNumeric(cellule) Then texte = True : Exit For
        Next cellule
        '2. Faire la somme/concaténation
        If texte = True Then
             '...
        Else
            '...
        End if
        '3. Fusionner
        'cf. enregistreur de macro
        '4. Mettre la valeur finale (concaténation ou somme) dans la fusion
        '...
    End Sub

  4. #4
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut solution
    Merci de vos réponses,

    Voici ma solution grâce à vos conseils.

    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
    Public Sub test()
    Dim plage As Range
    Dim R As Integer
    Dim maligne As Long
     
    Set plage = Selection
    R = plage.Rows.Count
    R = R - 1
    maligne = plage(1, 1).Row
    MsgBox R
    For C = 1 To R
        For D = 1 To 10
        If IsNumeric(plage(C + 1, D)) And plage(C + 1, D) <> "" Then
        plage(C + 1, 1).Value = plage(C + 1, 1) + plage(C, 1)
        Else:
            If Not IsEmpty(plage(C + 1, D)) Then
            plage(C + 1, D).Value = plage(C, D) & "-" & plage(C + 1, D)
            End If
        End If
        MsgBox C
        Next
    Next
     
    For i = maligne To maligne + R - 1
    Rows(maligne).Select
    Selection.Delete Shift:=xlUp
    Next
     
    End Sub

  5. #5
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, un conseil : Balise ton code

  6. #6
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Re-bonjour,
    Quelques commentaires par rapport à ton code :
    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    '----- Ceci :
    R = plage.Rows.Count
    R = R - 1
    '----- C'est tout simplement :
    R = plage.Rows.Count - 1
    2. Tu fais une boucle For D = 1 To 10. Est-ce que tu supposes que ta sélection a forcément 10 colonnes, du coup ?
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    '----- Tu écris
    plage(C + 1, 1).Value = plage(C + 1, 1) + plage(C, 1)
    '----- Ne serait-ce pas plutôt ? 
    plage(C + 1, D).Value = plage(C + 1, D) + plage(C, D)
    4. Tu vérifies pour chaque cellule individuellement si elle est numérique, puis pour cette cellule, tu décides s'il faut additionner ou concaténer. Mais supposons que tu ais une plage de cellules avec des valeurs numériques et du texte. Tu ne peux que concaténer. Or avec ton code, tu essaies d'additionner ta valeur numérique à la chaine de caractère concaténée. Est-ce que tu vois ce que je veux dire ? C'est pour cela que je te propose de vérifier d'abord s'il y a au moins 1 valeur non numérique dans ta plage de cellules. Si c'est le cas, il faut tout concaténer, sinon il faut tout additionner.
    5. Pourquoi fais-tu une double boucle (sur les lignes et les colonnes) ? Tu peux faire une boucle For Each sur les cellules de ta plage.
    6. A la fin, tu supprimes des lignes, tu ne fusionnes pas. Est-ce normal ? Je te rappelle que pour connaître le code de la fusion, tu peux utiliser l'enregistreur de macro.
    7. Plutôt que de faire une boucle sur les lignes pour supprimer les lignes 1 à 1, tu peux les supprimer toutes d'un coup.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(maligne & ":" & maligne + R - 1).Delete Shift:=xlUp
    D'ailleurs, quand on supprime des lignes, il faut le faire avec une boucle en sens inverse.

    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
    Sub fusion()
        Dim texte As Boolean
        Dim concat As String
        Dim addition As Double
        Dim cellule As Range
        texte = False    
        '----- 1. Quel type de valeurs
        For Each cellule In Selection       'boucle sur les cellules
            If isNumeric(cellule) Then texte = True : Exit For     '--> si seulement 1 valeur est du texte, on fait la concaténation.
        Next cellule
        '----- 2. Faire la somme/concaténation
        If texte = True Then            'si il y a au moins 1 valeur de texte parmis les cellules
            For Each cellule In Selection
                concat = concat & cellule.Value        'concaténation
            Next cellule
        Else               'si toutes les cellules sont au format numérique
            For Each cellule In Selection
                addition = addition + cellule.Value         'addition
            Next cellule
        End if
        '----- 3. Fusionner
        'cf. enregistreur de macro
        '----- 4. Mettre la valeur finale (concaténation ou somme) dans la fusion
        '...
    End Sub

  7. #7
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je n'avais pas vu la dernière réponse. Merci bcp c'est très utile.
    Pour répondre à chaque point

    1: Merci je ne connais pas très bien les simplifications
    2: Oui dans mon cas il n'y aura pas plus de 10 colonnes
    3: Super c'est exact
    4: dans mon cas je concatène toujours quand il y a du texte même si il y a des valeurs dedans
    5: je veux concaténer les cellules du même colonne. Je suis pas sur que c'est possible avec un "for each"
    6: Oui je doit supprimer ces lignes
    7: super bcp plus simple ^^

  8. #8
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Citation Envoyé par xuan203 Voir le message
    4: dans mon cas je concatène toujours quand il y a du texte même si il y a des valeurs dedans
    Justement, ton code ne fais pas cela. A chaque cellule de ta plage, tu vérifies si elle est numérique ou non. Si elle est numérique tu ajoutes la valeur de cette cellule en additionnant à ta concaténation actuelle et si elle est textuelle tu l'ajoutes en concaténant. Or, si il y a AU MOINS UNE valeur textuelle dans ta plage de cellules, alors il faut que tu concatènes TOUTES les cellules (même s'il y a aussi une valeur numérique). Donc, il faut d'abord que tu vérifies s'il y a au moins une valeur non numérique dans ta plage de cellules, puis tuen déduis s'il faut additionner ou concaténer toutes les valeurs.

    Citation Envoyé par xuan203 Voir le message
    5: je veux concaténer les cellules du même colonne. Je suis pas sur que c'est possible avec un "for each"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim cel As Range
    Dim texte As String
    For Each cel in Range("A1:A25")    '<--- tu peux mettre n'importe quel range
        texte = texte & cel.Value
    Next cel

Discussions similaires

  1. Macro pour traiter une colonne en relatif
    Par jacques64 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 14/06/2007, 12h53
  2. [VBA]Macro pour lancer une recherche dans un tableau
    Par manhes dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2007, 18h08
  3. macro pour lancer une requête
    Par Kleer dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/02/2007, 21h16
  4. macro pour remplire une liste dans une même cellule
    Par fabiend83 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/07/2006, 09h32
  5. [VBA-E] [help]macro pour dupliquer une feuille (en valeur)
    Par minikisskool dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 07/11/2005, 19h24

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