Si plusieur cellules contient "texte" Alors fusionner

  • Initiateur de la discussion Initiateur de la discussion Jeremy992
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Jeremy992

XLDnaute Occasionnel
Bonjour à tous,

Je travail actuellement sur un fichier Excel que j'ai construit pour une mission de mon alternance.
Mais je rencontre quelques problème...

J'aimerais que SI sur une colonne j'ai deux cellule ("KHI2 50%" et "KHI2") ALORS je n'ai plus qu'une cellule "KHI2".

Sachant qu'en face de chaque cellule correspond un résultat que j'obtient par une formule SI+NB.SI, les résultat devrons alors être additionné.

Je vous joint un fichier exemple, ainsi que mon fichier original (où toutes mes formule sont, ainsi que tout mes onglets, d'ailleurs sur l'onglet "saisie auto" ce trouve un bouton de mise à jour général).

PS: si vous voulez des explication quand au fonctionnement du fichier original, je serais ravi de vous le détailler (actions, formule, macro, vb...)

En espérant vous lire au plus vite, mes salutations !
 

Pièces jointes

Dernière édition:
Re : Si plusieur cellules contient "texte" Alors fusionner

Bonjour Jérémy, bonjour le forum,

Essai ce code à adapter à ton cas :
Code:
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim T As Long 'déclare la variable T (Total)

Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 2 (=B) de l'onglet O
For I = DL - 1 To 4 Step -1 'boucle inversée de l'avant dernière ligne à la ligne 4 (en remontant)
    If O.Cells(I, 2).Value = "KHI2 50%" And O.Cells(I + 1, 2).Value = "KHI2" Then 'condition : si la cellule de I vaut "KIH2 50%" et la cellule de I+1 vau "KIH2"
        T = CLng(O.Cells(I, 3).Value) + CLng(O.Cells(I + 1, 3).Value) 'calcule le total
        O.Cells(I, 2).Value = "KIH2" 'place "KIH2" dans la cellule de I
        O.Cells(I, 3).Value = T 'place le total dans la cellule adjacente
        O.Rows(I + 1).Delete 'supprime la ligne I+1
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Bonjour Jeremy

Salut Robert

A tester:

Code:
Sub regroup()
For n = 2 To Sheets("Total par action (Auto)").Range("A" & Rows.Count).End(xlUp).Row
 If Sheets("Total par action (Auto)").Range("A" & n) = "KHI2 50%" Or Sheets("Total par action (Auto)").Range("A" & n) = "KHI2" Then
    KHI2 = KHI2 + Sheets("Total par action (Auto)").Range("B" & n)
    Sheets("Total par action (Auto)").Range("A" & n & ":B" & n).Delete
    n = n - 1
 End If
Next
If KHI2 <> "" Then
 Rows(3).Insert
 Sheets("Total par action (Auto)").Range("A3") = "KHI2"
 Sheets("Total par action (Auto)").Range("B3") = KHI2
End If
End Sub
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Alors, dans l'idée c'est absolument ça !! *l'espoir revient, c'est merveilleux*
Le résultat est tout as fait ce que j'attend, seulement... et oui il y a un seulement !

Dans ta macro, je dois déclaré que je recherche "KHI2 50%" et "KHI2". Ce que j'aimerais, c'est qu'il détecte automatiquement les cellules ayant la même 1er chaine de caractère et ensuite applique ta formule a ces cellule.

Exemple d'un colonne que je pourrais avoir:

KHI2 50% = 100
LFT80 = 50
SPF = 200
KHI2 = 200
LFT80 50% = 100

Résultat:
KHI2 = 300
LFT80 = 150
SPF = 200

PS: la syntaxe sera toujours la même, le nom (ex:KHI2) - espace - le pourcentage (...%)

A voir si cela est possible :/
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Bonjour PierreJean,

Même problème, je dois forcement déclaré une variable, ici "KHI2", or j'en ai d'autres, et elle peuvent changer.

PS: elle sont extraite d'un planning grâce à une formule matricielle {=ListeSansVidesNiDoublons} sur un onglet (masqué)
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Robert,

Je m'excuse beaucoup de la perte de temps que mon erreur, a savoir ne pas avoir assez développé mon exemple, à pus te causer.

J'aurais du anticiper et donner plus d'informations. Il est vrai que j'ai du mal à me mettre à la place de mon interlocuteur, ce qui me fait défaut, et donc de me dire que si cela est clair pour moi, ça ne l'ai pas pour d'autre.

Mille excuse, en espérant vous revoir tout de même :/


C'est en faisant des erreurs que l'on apprend
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Merci de votre compréhension Robert,

Si j'ai trouvé les mots pour calmer votre "grande gueule", les réactions rapide dont vous avez fait preuves vous et PierreJean à l'égard de mon problème, elles, m'ont donnée envie de m'investir bien plus sur ce forum.

Etant tout nouveau (1er post aujourd'hui), mais utilisant depuis quelque années Excel à un niveau plus important, j'ai maintenant envie de "venir en aide à mon prochain", certes mon niveau n'est pas égale au votre, mais si mes expérience passé peuvent servir, ce sera pour moi une grande satisfaction.

Bref sujet mis à part, comme vous le dite un peu plus haut, c'est la pause, alors je vous souhaite un bon appétit et tout les deux et au reste du forum bien sur 😉
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Re

A tester

Code:
Sub group(a)
For n = 2 To Sheets("Total par action (Auto)").Range("A" & Rows.Count).End(xlUp).Row
 If Sheets("Total par action (Auto)").Range("A" & n) = a Or Sheets("Total par action (Auto)").Range("A" & n) = a & " 50%" Then
    tot = tot + Sheets("Total par action (Auto)").Range("B" & n)
    Sheets("Total par action (Auto)").Range("A" & n & ":B" & n).Delete
    n = n - 1
 End If
Next
If tot <> "" Then
 Rows(3).Insert
 Sheets("Total par action (Auto)").Range("A3") = a
 Sheets("Total par action (Auto)").Range("B3") = tot
End If
End Sub
Sub regroup()
For n = 2 To Sheets("Total par action (Auto)").Range("A" & Rows.Count).End(xlUp).Row
 If InStr(Sheets("Total par action (Auto)").Range("A" & n), " 50%") <> 0 Then
 a = Replace(Sheets("Total par action (Auto)").Range("A" & n), " 50%", "")
 Call group(a)
 End If
Next
End Sub

NB: Je crains fort de passer auprès de notre cher Robert pour une feignasse because
1) je persiste à ne pas déclarer ni typer les variables
2) je ne commente mes codes que sur demande
Mais j'assume mon statut de vieille feignasse
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Bonjour le fil, bonjour le forum,

Une autre proposition que celle de PierreJean (la feignasse aux 13 000 posts ! J'en ai connu des pires...) :

Code:
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim R1 As Range 'déclare la variable R1 (Recherche 1)
Dim R2 As Range 'déclare la variable R2 (Recherche 2)
Dim T As Long 'déclare la variable T (Total)

Set O = Sheets("Total par action (Auto)") 'définit l'onget O
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière Ligne éditée DL de la colonne 1 (=A) de l'onglet O
Set PL = O.Range("A3:A" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit la dictionnaire D
For Each CEL In PL 'boucle sur toutes les celluiles CEL de la plage PL
    'si le dernier caractère de la valeur de la cellule est "%", alimente le dictionnaire D
    If Right(CEL.Value, 1) = "%" Then D(CEL.Value) = ""
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des valeurs terminant par % (sans doublon)
For I = 0 To UBound(TMP) 'boucle sur toutes les valeurs du tableau temporaire TMP
    Set R1 = PL.Find(TMP(I), , xlValues, xlWhole) 'définit la recherche R1 (recherche TMP(I) dans la plage PL)
    'définit la recherche R2 (recherche TMP(I) sans les 4 dernièrs caractères " 50%"  dans la plage PL)
    Set R2 = PL.Find(Left(TMP(I), Len(TMP(I)) - 4), , xlValues, xlWhole)
    If Not R2 Is Nothing Then 'si il exite au moins une occurrence trouvée pour la recherche R2
        T = CLng(R1.Offset(0, 1).Value) + CLng(R2.Offset(0, 1).Value) 'définit le total T
        R2.EntireRow.Delete 'supprime la ligne de l'occurrence trouvée pour la recherche R2
        R1.Value = Left(TMP(I), Len(TMP(I)) - 4) 'redéfinit la valeur de la recherche 1 (sans les 4 derniers caractères " 50%")
        R1.Offset(0, 1).Value = T 'place le total dans la cellule adjacente à R1
    End If 'fin de la condition
Next I 'prochaine valeur de la boucle
End Sub
 
Re : Si plusieur cellules contient "texte" Alors fusionner

Bonjour le fil, Robert et PierreJean,

Après adaptation a mes besoins, vos deux formule fonctionnement diablement bien !!

Seul petit bémol, j'utilisais une formule matricielle pour extraire les données du planning sans vides ni doublons, et avec ta formule Robert, ça ne fonctionne pas lors de la suppression de l'occurrence de la recherche R2.
Quand à PierreJean, la formule ne fonctionne pas du tout quand il y a utilisation de formule matricielle.

Ceci étant, j'ai tout simplement utilisé un autre moyen que cette formule matricielle, et la tout fonctionne !!

Un grand merci a vous deux, vous êtes formidable !!


Au plaisir de vous lire, Jeremy
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour