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
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
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
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
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
Salut, un conseil : Balise ton code
Re-bonjour,
Quelques commentaires par rapport à ton code :
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 ?
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
3.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.
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)
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.
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 Range(maligne & ":" & maligne + R - 1).Delete Shift:=xlUp
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
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 ^^
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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager