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
Pièce jointe 289443
Version imprimable
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
Pièce jointe 289443
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:
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:
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:
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:
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:
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:Range(maligne & ":" & maligne + R - 1).Delete Shift:=xlUp
Code:
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:
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