XL 2013 Ajustement total en se basant sur la quantité objectif

donadoni16

XLDnaute Junior
Bonjour à tous,
sur le fichier ci-annexé qui me sert à faire des calcules pour but de faciliter ce que je fais dans mon quotidien
je compte créer un code un VBA qui fait ceci :

1__si une cellule de la colonne G = DIRECT et la cellule de la colonne E < > 0, alors enlever la quantité qu'on a en moins dans la colonne E en supprimant des quantités qu'on a en commençant de la colonne AI jusqu'a R cad la dernière cellule qui contient un chiffre sans prendre en compte les colonnes qui sont colorées en gris et dans le cas ou la quantité de la colonne E et en plus il faut l'ajouter et non pas la supprimer.

je donne un exemple :
*(1er Cas)
G4= Direct et E4=(-35) donc on doit enlever 35 et en commancant de AI4 on constate que la première cellule qui contient un chiffre c'est X4, donc on va enlever 20 qui se trouve dans X4 puis en passe à V4 puisque on prend pas en considérations les colonnes qui sont en gris, on prend 10 de V4 et on va prendre juste 5 de U4 et on laisse 5 comme ça on aura E4=0

*2ème Cas
G5=Direct et E5=16 dans ce cas en va commencer de la colonne R jusqu'a a ce qu'on trouve la 1er cellule qui contient pas un chiffre qui est Y5 et on ajoute les 18 qui manque pour avoir E5=0

2__si une cellule de la colonne G = INDIRECT et la cellule de la colonne I n'égale pas la cellule de la colonne N, alors enlever la quantité qu'on a en plus dans la colonne N en supprimant des quantités en commençant de la colonne AI jusqu'a R cad la dernière cellule qui contient un chiffre sans prendre en compte les colonnes qui sont colorées en gris et dans le cas ou la quantité de la colonne N et en mois il faut l'ajouter pour que la cellule de la colonne N égale la cellule de la colonne I.

je donne un exemple :
*(1er Cas)
G96= Indirect et N96>I96 donc on doit enlever 14 pour que N96=I96 et en commancant de AI4 on constate que la première cellule qui contient un chiffre c'est AH96, donc on va enlever 14 qui manque et on garde 16 comm ça on aura N96=I96

*2ème Cas
G97=Indirect et N97<I97 donc on doit ajouter 12 pour que N97=I97 dans ce cas en va commencer de la colonne R jusqu'a a ce qu'on trouve la 1er cellule qui contient pas un chiffre qui est Z97 et on ajoute les 12 qui manque pour avoir N97=I97

Merci d'avance
 

Pièces jointes

  • Matrice exportée.XLSX
    59.2 KB · Affichages: 33

thebenoit59

XLDnaute Accro
Bonjour Donadoni.

Je te propose une première solution, dans laquelle j'ai essayé de bien décomposer les procédures pour que tu t'y retrouves.
Sur certaines lignes, par exemple la 120, la dernière colonne remplie est AI, j'ai donc ajouter la valeur en AK.

Par ailleurs, il faudrait que tu travailles avec des formules pour les colonnes grisées, sinon les résultats sont faussés. Je me suis permis de les ajouter. Egalement, j'ai modifié les formules de la colonne N pour les Indirect, ayant ajouté des valeurs en AK tu ne tomberais pas sur le bon résultat sinon.
 

Pièces jointes

  • Donadoni16 - Ajustement total en se basant sur la quantité objectif.xls
    169 KB · Affichages: 36

donadoni16

XLDnaute Junior
Bonjour thebenoit,
merci beaucoup pour ta réponse c'est exactement ce que je cherchais mais j'ai des petites remarques a modifier

***je commence avec l'exemple de la ligne 120 que tu as cité : AI120 est la dernière cellule avant la dernière colonne grisé du tableau dans ce cas on rajoute la valeur qui manque (40,94) + la valeur qui existe dejà sur la la cellule I120 (0,5) pour enfin avoir dans AI120= 41,44

***sur certaines lignes comme 101 par exemple, normalement N101 doit égale I101 chose qu'on trouve pas dans les résultats et cela est dû je crois a la colonne L qui represente l'état d'avancement de la colonne I et dans ce cas on constate que j'ai mis dans L101 (32) alors que I101 qui represente la quantité objectif égale (5) c'est pourquoi on trouve I101=5 et N101=32
pour éviter cela je propose une chose:
vu que la colonne L je vais la remplir à la main au début, si je mets une valeur qui dépasse celle qui se trouve dans la colonne I un message qui m'interdira de le saisir
exemple: si je mets 32 dans L101 un message m'interdira la saisie vu que I101=5
 

thebenoit59

XLDnaute Accro
J'ai corrigé la première partie, en ajoutant à la colonne AI la différence entre N et I.

Pour la seconde partie seul toi peut savoir ce qui est le mieux. Ne connaissant pas le fonctionnement de ton état d'avancement, je ne travaille pas de cette façon en entreprise.
J'ai ajouté la procédure comme demandée. Le code est directement dans la feuille.
 

Pièces jointes

  • Donadoni16 - Ajustement total en se basant sur la quantité objectif.xls
    176.5 KB · Affichages: 34

donadoni16

XLDnaute Junior
re,
le deuxiemme fichier ne répond pas sur les 2 dernières parties:
***pour la première partie...sur AI120 j'avais dèjà 0.5 et la différence qui devait s'ajouter c'était 40,94 pour avoir en total 41,44 mais le code à enlever déja 0.5 qui était déjà saisie et la remplacer avec 40,94 chose qui a donné comme résultat dans N120 99,5 qui n'ègale pas I120 qui est 100....


***pour la seconde partie sur la cellule par exemple L119 j'avais déjà 78 comme quantité saise qui était supérieur a I119, si je mets par exemple 15 qui est aussi supérieur a I119, le message affichant une erreur quand il s'affiche pour m'indiquer une erreur une fois je clique sur ok il disparait pas il revient a la valeur precedente qui est 78 e affiche erreur, alors que L122 par exemple ou j'avais déjà saisi une valuer inferieur, si je saisie une valeur supérieur que celle de la colonne I le message affiche une erreur et vide la cellule concerné
 
Dernière édition:

thebenoit59

XLDnaute Accro
Pour la première partie, j'ai fais une erreur avec le fichier envoyé, il faut modifier ainsi :

VB:
Cells(Ligne, Col(i)).Value = Delta + Cells(Ligne, Col(i)).Value: Exit Sub

Pour la seconde partie, c'est vrai que tu peux avoir un problème à cause d'un nombre déjà supérieur.
On peut soit : Modifier le fonctionnement de la procédure, et au lieu de revenir à la valeur précédente, appliquer la valeur de la colonne I. Ou vider la cellule en ne mettant rien à la place.
Je te laisse choisir :

VB:
        'Application.Undo
        Range(Target.Address).Value = Cells(Target.Row, "I").Value
        'Range(Target.Address).ClearContents
 

donadoni16

XLDnaute Junior
re,
ci-joint le fichier modifié merci de me confirmer que la modification à été faite dans sa place

autre remarque:
1)pour les directs:

***dans la ligne 16 si on a aucune donnée saisie dans entre R16 et AI16 et on met une valeur dans L16 (48 dans cet exemple) une fois on clique sur le code rien ne se passe, alors que 52 qui affiche la colonne delta doit être copier dans la derniere cellule avant la colonne grisée qui est AI16

2) pour les indirects:
***dans la ligne 99 si on a aucune donnée saisie dans entre R99 et AI99 et on met une valeur dans L99 (9 dans cet exemple)
une fois je clique sur le code rien ne se passe, alors que le chiffre 6 qui manque pour que N99 égale I99 doit être copier dans la dernière cellule avant la colonne grisée qui est AI99
 

Pièces jointes

  • Donadoni 3.xls
    185 KB · Affichages: 43

thebenoit59

XLDnaute Accro
Bonjour Donadoni.

Le fichier a bien été modifié.
Tu ne m'avais pas spécifié ces deux cas particuliers, mais il n'y a aucune difficulté.
En effet cette situation ne peut arriver qu'en cas d'Ajout.

VB:
Sub Ajouter(Ligne%, Delta As Double)
Dim i%
    For i = LBound(Col) To UBound(Col)
        If Cells(Ligne, Col(i)).Value <> 0 Then
            If i = 0 Then
                Cells(Ligne, Col(i)).Value = Delta + Cells(Ligne, Col(i)).Value: Exit Sub
                Else
                Cells(Ligne, Col(i - 1)).Value = Delta: Exit Sub
            End If
        End If
    Next i
    Cells(Ligne, "AI").Value = Delta
End Sub

De plus, la fonction est quittée quand nous avons réparti le Delta, donc nous pouvons ajouter une ligne à la fin, le seul moment où elle utilisée sera quand aucune colonne ne sera remplie.
 

donadoni16

XLDnaute Junior
Bonjour,
merci beaucoup thebenoit d'avoir consacré du temps pour répondre sur ma problématique,
c'est exactement ce que je cherchais

il me reste une petite remarque que je viens de découvrir,
comme vous pouvez voir sur le fichier ci-annexé j'ai ajouté l'année 2018 (colonnes AK:AW) et en appliquant votre code je n'ai pas eu le résultat souhaité c'est a dire qu'il n'est pas variable
vu que je bosse sur beaucoup de chantier, chacun d'entre eux a un planning différent donc j'aimerais bien que le code soit variable en détectant tout seul la dernière colonne grisée, la derniere cellule avant la cellule grisée...ect, tout en sachant que le plannig comence toujours de la colonne R...puis les colonnes E,G,I,L, et N sont constantes...si c'est possible biensur
 

Pièces jointes

  • Donadoni.xls
    204 KB · Affichages: 34
Dernière édition:

donadoni16

XLDnaute Junior
super merci beaucoup,
mais pour les lignes je crois que c'est pas automatisé parce que comme tu vois dans le fichier ci-joint j'ai copié des données dans la ligne 58078 une fois j'éxcute le code il bloque dans cette ligne :

ii = f.[g65000].End(xlUp).Row
 

Pièces jointes

  • Donadoni (1).xls
    220 KB · Affichages: 39

Discussions similaires

Réponses
22
Affichages
782

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote