Formule ou macro

Résolu
Joie -  
 Joie -
Bonjour,

Voilà mon petit souci j'aurais souhaité que lorsque je choisis "nouveau prix" dans la cellule B5 et que par la suite dans la cellule B6 je choisis "Même tarif ou Promotion" qu'il fussionne les cellules D5 à D6. Si je choisis encore "Même tarif ou promotion qu'il me la fusionne de D5 à D7 et ainsi de suite. Il ne fusionne pas les montants uniquement s'il s'agit d'un nouveau client. Ca devrait donné ca! :-) Je serai vraiment reconnaissante à la personne qui pourra m'aider.

Je sais que je peux le faire moi-même mais si c'était automatiser ce serait vraiment pratique car il y a beaucoup de données et j'oublie quelquefois de fusionner les cellules et des les additionner.

https://www.cjoint.com/?jEwiAkISW2

:-) Help
Configuration: Windows XP Internet Explorer 7.0

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,
    si, chez moi ca défusionne; je teste toujours avant de fournir une réponse

    ci dessous nouvelle macro pour "un tableau très grand " et qui recopie les données colonnes B et D (ce n'était pas précisé dans ta demande et pourrait être fait par formule si pas "tableau très grand" )

    Option Explicit
    Const dep As Byte = 5 'ligne départ tableau
    Const texto As String = "nouveau pix" ' texte séparateur
    
    Sub fusionner_cellule()
    Dim derlig As Long, nbre As Long, lig As Long, cptr As Long
    Dim tablo
    
    'initialisation
    derlig = Range("B65536").End(xlUp).Row
    Application.ScreenUpdating = False 'fige le défilement de l'écran
    Range(Cells(dep, 6), Cells(65535, 8)).Clear 'défusionne col H et nettoie col F, G,H
    nbre = Application.CountIf(Range(Cells(dep, 2), Cells(derlig, 2)), texto)
    ReDim tablo(nbre)
    
    'collecte les numéros des lignes comportant texto
    lig = dep - 1
    For cptr = 1 To nbre
        tablo(cptr - 1) = Columns(2).Find(texto, Cells(lig, 2)).Row
        lig = tablo(cptr - 1)
    Next
    tablo(cptr - 1) = derlig + 1
    'restitue
    For cptr = 1 To UBound(tablo)
        With Range(Cells(tablo(cptr - 1), 8), Cells(tablo(cptr) - 1, 8))
            .Merge 'fusionne les cellules
            .Value = Application.Sum(Range(Cells(tablo(cptr - 1), 4), Cells(tablo(cptr) - 1, 4))) 'somme nouveau prix
        End With
    Next
    
    'recopie les nouvelles données
    Range(Cells(dep, 6), Cells(derlig, 6)) = Range(Cells(dep, 2), Cells(derlig, 2)).Value
    Range(Cells(dep, 7), Cells(derlig, 7)) = Range(Cells(dep, 4), Cells(derlig, 4)).Value
    
    ' met en forme le tableau
    With Range(Cells(dep, 6), Cells(derlig, 8))
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Borders.Weight = xlThin
    End With
    
    End Sub
    

    1
    1. joie
       
      Woua! C'est superbe ta formule marche trop bien :-) :-)

      Ca va vraiment me faciliter la vie! :-) Encore une petite question si ce n'est pas trop demandé ? Est-ce que ce serait possible qu'il me fussionne les cellules mais directement dans le premier tableau c'est-à-dire dans les lignes D :-)
      0
    2. Joie
       
      Coucou,

      Juste une dernière question il faut que j'adapte ta formule que je mette les chiffres dans la colonne V et que le les fusionnes dans la colonne X. pour que ca fussionne en colonne X j'ai compris mais par contre je n'arrive pas à modifier la formule pour que ça me prenne les résultats dans la colonne X au lieu de la colonne D. Peux-tu juste m'expliquer comment faire? :-(
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,
    regarde si cette macro te convient:

    Option Explicit
    Const dep As Byte = 5 'ligne départ tableau
    Const texto As String = "nouveau pix" ' texte séparateur
    
    Sub fusionner_cellule()
    Dim derlig As Long, nbre As Long, lig As Long, cptr As Long
    Dim tablo
    
    'initialisation
    derlig = Range("B65536").End(xlUp).Row
    nbre = Application.CountIf(Range(Cells(dep, 2), Cells(derlig, 2)), texto)
    Range(Cells(dep, 8), Cells(derlig, 9)).Clear
    ReDim tablo(nbre)
    
    'collecte les numéros des lignes comportant texto
    lig = dep - 1
    For cptr = 1 To nbre
        tablo(cptr - 1) = Columns(2).Find(texto, Cells(lig, 2)).Row
        lig = tablo(cptr - 1)
    Next
    tablo(cptr - 1) = derlig + 1
    'restitue
    For cptr = 1 To UBound(tablo)
        With Range(Cells(tablo(cptr - 1), 8), Cells(tablo(cptr) - 1, 8))
            .Merge 'fusionne les cellules
            .HorizontalAlignment = xlCenter 'présentation
            .VerticalAlignment = xlCenter 'présentation
            .Borders.Weight = xlThin  'présentation
            .Value = Application.Sum(Range(Cells(tablo(cptr - 1), 4), Cells(tablo(cptr) - 1, 4))) 'somme nouveau prix
        End With
    Next
    
    End Sub
    


    tite demo:
    https://www.cjoint.com/?kbkrFICjXB
    0
    1. Joie
       
      Salut,

      Tout d'abord merci pour ta réponse rapide c'est effectivement ce que je voulais mais l'ennui c'est que si je modifie quelque chose par exemple j'ai utilisé la macro mais je me rends compte que je me suis trompé dans la cellule F13 ou B13. Je devais mettre nouveau pris et bein ca ne le corrige pas! Il devrait défusionner la cellule...

      C'est que le tableau est vraiment très grand et desfois j'ai aussi des mauvaises informations que je dois corriger... est-ce que tu as une solution? :-(
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Il faut que tu relances la macro...
    les cellules fusionnées sont détruites au départ dans le paragraphe initialisation par cette instruction:
    Range(Cells(dep, 8), Cells(derlig, 8)).Clear

    C'est que le tableau est vraiment très grand
    Tu aurais pu le préciser AVANT: le raisonnement est souvent différent suivant le nombre de lignes prévisible (très grand est subjectif et ne veut rien dire: 1000 ou 10000 ou 50000 lignes est un renseignement exploitable ...)
    Ainsi, il faut ajouter une instruction figeant le défilement de l'écran:rapidité et confort
    Application.ScreenUpdating = False

    donc le groupe initialisation de vient celui-ci à copier coller à la place (accès VBA: Alt+F11)

    'initialisation
    derlig = Range("B65536").End(xlUp).Row
    nbre = Application.CountIf(Range(Cells(dep, 2), Cells(derlig, 2)), texto)
    Application.ScreenUpdating = False
    Range(Cells(dep, 8), Cells(derlig, 8)).Clear
    ReDim tablo(nbre)
    0
    1. JOIE
       
      Oui pardon! C'est vrai que maintenant que tu le dis ca me paraît logique! :-)

      Mais il ne me le défusionne pas! :-( Est-ce que je fais quelque chose de faux?

      Je t'ai envoyé le lien avec un exemple de correction. :-)

      https://www.cjoint.com/?kcjtnKGiIu

      Merci pour ton aide
      0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    C'est possible mais ca me fait refaire pratiquement toute la procédure, alors pitié!
    0
    1. Luna
       
      Bon tanpis j'avais qu'à être pus clair. Mais merci c'est déjà super! :-)
      0
      1. Anonyme > Luna
         
        Oups pardon j'ai emprunté le pseudo de ma soeur. Bon de toute façon merci beacoup!!!!! :-)
        0