Excel 2010: une exception dans mes calculs

Ju@nita Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai une macro qui fait un tas de calcul et de tri pour faire ma facturation. J'ai par contre une seule exception qui n'embarque pas dans le pattern des formules.
Dans un fichier qui m'est fourni par quelqu'un, il y a une cellule qui contient 2 numéros de client. Le but est de séparer le montant à facturer entre ces 2 clients, qui eux, ont déjà des données plus haut dans la liste.
Donc, il faut chercher la cellule qui a les 2 numéros ensemble, prendre son montant, le diviser par 2 et aller le rajouter aux autres.
voici un exemple dans le fichier joint. Le premier tableau est ce qui m'est fourni, et celui dans la 2e feuille est le résultat donc j'ai besoin.

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

J'essaie de me composer une formule juste pour ce cas, et je voudrais l'incorporer dans ma macro avant le bloc qui fait tout le reste du travail de tri et de calcul.
Informations importantes: cette exception est toujours présente et ce sont toujours les 2 mêmes clients. Ce qui peut changer, ce sont les montants et la ligne où se situent les numéros de clients. Je dois avoir une seule ligne par client. Je ne peux donc pas juste séparer les montants sur 2 nouvelles lignes sinon, j'aurais 2 lignes à facturer par client.

Merci pour votre aide.

4 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    une façon :
    Sub repartir()
        Dim c1 As Range, c2 As Range, client As Variant
        Dim cli As Long, ven As Long
        Application.ScreenUpdating = False
        Set c1 = [A:A].Find("-", LookIn:=xlValues, lookat:=xlPart)
        While Not c1 Is Nothing
            client = Split(c1, "-") ' recup n° clients
            For cli = 0 To UBound(client)
                Set c2 = [A:A].Find(client(cli), LookIn:=xlValues, lookat:=xlWhole)
                If c2 Is Nothing Then
                    MsgBox " Erreur, client " & cli & " non trouvé"
                Else
                    For ven = 0 To 1 ' repartir les ventes
                        c2.Offset(, ven + 1) = c2.Offset(, ven + 1) + c1.Offset(, ven + 1) / 2
                    Next ven
                End If
            Next cli
            c1.EntireRow.Delete
            Set c1 = [A:A].Find("-", LookIn:=xlValues, lookat:=xlPart)
        Wend
    End Sub 

    Tu peux avoir plus de 2 clients séparés par des "-".
    Bien que ça ne puisse pas arriver, si un des 2 clients n'existe pas j'alerte quand même. A toi de noter combien lui ajouter en créant la ligne.
    https://www.cjoint.com/?DEiwGjREsLb

    eric
    En essayant continuellement, on finit par réussir.
    Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
    En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
    0
  2. Ju@nita Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   2
     
    MA-LA-DE !
    pensais même pas que ça se pouvait.
    et ça marche du premier coup et j'ai réussi à l'incorporer dans ma macro et d'en changer un peu les paramètres car les info ne sont pas dans les mêmes colonnes que dans le fichier test.

    un gros merci.
    0
  3. Juanita
     
    bonjour,

    finalement, ça accroche à quelque part. Pour le fichier test, ça fonctionne très bien. Mais mon fichier de base est plus gros et les clients et leurs données ne sont pas dans les mêmes colonnes, ni les entêtes de colonne qui ne sont pas sur la ligne 1 non plus.

    Comme je ne comprends vraiment rien à la macro proposée, j'ai de la difficulté à l'adapter. Pourriez-vous svp me dire quelles sont les paramètres que je dois changer, ou autrement dit, que veut dire chaque étape ?
    voici la macro:
    Sub repartir()
    Dim c1 As Range, c2 As Range, client As Variant
    Dim cli As Long, ven As Long
    Application.ScreenUpdating = False
    Set c1 = [A:A].Find("-", LookIn:=xlValues, lookat:=xlPart)
    While Not c1 Is Nothing
    client = Split(c1, "-") ' recup n° clients
    For cli = 0 To UBound(client)
    Set c2 = [A:A].Find(client(cli), LookIn:=xlValues, lookat:=xlWhole)
    If c2 Is Nothing Then
    MsgBox " Erreur, client " & cli & " non trouvé"
    Else
    For ven = 0 To 1 ' repartir les ventes
    c2.Offset(, ven + 1) = c2.Offset(, ven + 1) + c1.Offset(, ven + 1) / (UBound(client) + 1)
    Next ven
    End If
    Next cli
    c1.EntireRow.Delete
    Set c1 = [A:A].Find("-", LookIn:=xlValues, lookat:=xlPart)
    Wend
    End Sub

    Déjà en partant, je ne sais pas ce que veut dire: Dim c1 as Range.

    svp j'ai besoin d'aide.
    merci.
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      Dim sert à déclarer et typer les variables.
      Pas obligatoire mais fortement recommandé.

      2 mois après il faut tout reprendre à zéro. Tu aurais pu te réveiller plus tôt...
      Il est où le fichier de travail qui correspond à la réalité ?

      eric
      0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Comme j'ai été censuré et toi aussi : sert toi de la touche F1 et de google
    eric
    0