Excel VBA remplissage automatique selon somme voulu

Résolu/Fermé
DragonBallZ1981 - 2 août 2022 à 13:45
T3chN0g3n Messages postés 4971 Date d'inscription samedi 16 février 2019 Statut Membre Dernière intervention 24 avril 2024 - 3 août 2022 à 12:31

Bonjour à tous,

Est-il possible en VBA de remplir automatiquement une cellule d'un nombre en fonction d'une valeur maximum, et de valeur de d'autres cellule.

En sachant que la plage peut varier

Exemple

B1 = 4000

A1 + A2 + A3 + A4 = B1 (la plage "A1 - A4" peux varier )

Lorsqu'on remplis 3 cases la quatrième se remplis toute seule 

Si A1 = 1000, A2 = 500, A3= 900 alors A4 se remplis toute seule en 1600 (4000-1000-500-900)

Si A1=1000, A3=900, A4=1600 alors A2 se remplis toute seule en 500 (4000-1000-900-1600)

Sans oublié que la plage peut varier de 2 cases a 20 cases.

Merci de votre aide


Windows / Chrome 103.0.0.0

A voir également:

4 réponses

T3chN0g3n Messages postés 4971 Date d'inscription samedi 16 février 2019 Statut Membre Dernière intervention 24 avril 2024 1 096
2 août 2022 à 14:59

Bonjour,

Oui, c'est surement possible. Mais ont est pas là pour te fournir un code entier "tout cuit". Je pense qu'il y'a suffisamment de ressources disponibles pour commencer par toi même, et revenir nous voir avec au moins une "ébauche" de code et des questions plus précises.

Cdlt.

0
DragonBallZ1981
2 août 2022 à 15:36

Bonjour,

Mon code fonctionne mais est très long car que des répétitions sans arrêt.

Nbr_poteau est déclarer en public et récupère un nombre dans une autre macro.

Voici mon début de code ou je met des conditions a chaque fois que la plage change

Sub Remplissage

    Dim Plage As currency

    Plage = Nbr_Poteau +1

If Plage = 2 Then
    If Range(A1) = "" And Range(A2) <> "" Then
    Range(A1) = Range(B1).Value - (Range(A2).Value)
    End If

     If Range(A2) = "" And Range(A1) <> "" Then
    Range(A2) = Range(B1).Value - (Range(A1).Value)
    End If

End if

If Plage = 3 Then
    If Range(A1) = "" And Range(A2) <> "" And Range(A3) <> "" Then
    Range(A1) = Range(B1).Value - (Range(A2).Value + Range(A3).Value)
    End If

     If Range(A2) = "" And Range(A1) <> "" And Range(A3) <> "" Then
    Range(A2) = Range(B1).Value - (Range(A1).Value + Range(A3).Value)
    End If

     If Range(A3) = "" And Range(A1) <> "" And Range(A2) <> "" Then
    Range(A3) = Range(B1).Value - (Range(A1).Value + Range(A2).Value)
    End If
End if

If Plage = 4 Then
    If Range(A1) = "" And Range(A2) <> "" And Range(A3) <> "" And Range(A4) <> "" Then
    Range(A1) = Range(B1).Value - (Range(A2).Value + Range(A3).Value + Range(A4).Value)
    End If

    If Range(A2) = "" And Range(A1) <> "" And Range(A3) <> "" And Range(A4) <> "" Then
    Range(A2) = Range(B1).Value - (Range(A1).Value + Range(A3).Value + Range(A4).Value)
    End If

    If Range(A3) = "" And Range(A1) <> "" And Range(A2) <> "" And Range(A4) <> "" Then
    Range(A3) = Range(B1).Value - (Range(A1).Value + Range(A2).Value + Range(A4).Value)
    End If
     
    If Range(A4) = "" And Range(A1) <> "" And Range(A2) <> "" And Range(A3) <> "" Then
    Range(A4) = Range(B1).Value - (Range(A1).Value + Range(A2).Value + Range(A3).Value)
    End If
End if

End Sub


Je souhaiterai donc un code plus simple mais je n'arrive pas.

Alors je sollicite votre aide.

0
T3chN0g3n Messages postés 4971 Date d'inscription samedi 16 février 2019 Statut Membre Dernière intervention 24 avril 2024 1 096
Modifié le 2 août 2022 à 16:12

Ha ba voilà ont a déjà une base !  Effectivement avec cette approche tu va pas t'en sortir ...

Question, pourquoi tu déclare la variable "Plage"  en type "Currency" (= monétaire) ?

Ensuite, le VB ne se limite pas aux instructions  "if" et "then".

Une idée déjà plus compact serait de faire appel à des boucle "for" :

Sub Remplissage()

Plage = Range("E1").Value '(j'ai mis la longueur de la plage en cellule E1 pour mon essais)
Somme = 0
Result = 0

For IndexSomme = 1 To Plage
    Somme = Somme + Range("A" & IndexSomme).Value
Next IndexSomme

Result = Range("B1").Value - Somme

For IndexCellVide = 1 To Plage
    If IsEmpty(Range("A" & IndexCellVide).Value) Then
        Range("A" & IndexCellVide).Value = Result
    End If
Next IndexCellVide

End Sub
1
DragonBallZ1981
2 août 2022 à 16:53

Bonjour,

Merci beaucoup de ton aide

Ton code fonctionne bien, mais je doit l'adapter pour qu'elle ne s'active uniquement quand 1 seule cellule est vide. car c'est une macro qui se déclenche en automatique "Private Sub Worksheet_Change(ByVal Target As Range)" et du coup ca beugue.

Dès que la cellule A1 est remplis il n'attend pas de remplir d'autre cellule selon la plage, mais il met directement en A2 le résultat.

Je vais l'ajuster par rapport a mes cellules. et si vraiment j'y arrive pas je reviendrais pour demander de l'aide ou bien cloturer le sujet si j'y suis arrivé.

Bonne fin de journée et encore merci.

0
T3chN0g3n Messages postés 4971 Date d'inscription samedi 16 février 2019 Statut Membre Dernière intervention 24 avril 2024 1 096
Modifié le 2 août 2022 à 17:04

Tu donne les infos au goute à goutte donc je ne peut pas deviner ... Mais si au moins si ça t'a donné une piste c'est le principal.

0
DragonBallZ1981
3 août 2022 à 12:12

Bonjour,

Ca fonctionne merci beaucoup,

J'ai mis une boucle for pour compter le nombre de cellule pleine dans le nombre de cellule de la plage .

Et si nombre de cellule pleine = nombre de cellule plage - 1 alors appel la macro pour remplir la dernière cellule. Sinon rien

Merci T3chN0g3n pour ton aide, et pour répondre a ta question sur le Currency.

Je met tout les chiffres en Currency au cas ou j'ai une virgule, car j'ai déjà essayé single et double, mais il me limite en décimal, alors du coup je met tout en Currency.

ça peut poser problème si dans un cas ou on est sûr d'avoir un chiffre entier comme dans ce cas-ci de ne pas le déclarer en byte, integer ou long ??

Bonne journée et encore merci.

0
T3chN0g3n Messages postés 4971 Date d'inscription samedi 16 février 2019 Statut Membre Dernière intervention 24 avril 2024 1 096
3 août 2022 à 12:31

Merci d'avoir pris le temps de nous faire un retour,

Le type "Currency" est particulier, je sais pas si c'est une super habitude d'utiliser ça systèmatiquement ... Un nombre de cellule sera forcément un entier donc je vois pas trop l'intérêt de déclarer une donnée avec décimales dans ce cas. Mais si tu veut des virgules  de manière générale, il y'a tout simplement le type "decimal"

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/data-type-summary

Sinon je t'invite à passer le sujet en résolu si tout est bon pour toi →

https://www.commentcamarche.net/infos/25917-forum-ccm-mode-d-emploi-marquer-mon-sujet-comme-resolu/

Cdlt.

0