Excel VBA remplissage automatique selon somme voulu

Résolu
DragonBallZ1981 -  
T3chN0g3n Messages postés 69 Date d'inscription   Statut Membre Dernière intervention   -

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

4 réponses

  1. T3chN0g3n Messages postés 69 Date d'inscription   Statut Membre Dernière intervention   1 217
     

    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
  2. DragonBallZ1981
     

    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
    1. T3chN0g3n Messages postés 69 Date d'inscription   Statut Membre Dernière intervention   1 217
       

      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
  3. DragonBallZ1981
     

    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
    1. T3chN0g3n Messages postés 69 Date d'inscription   Statut Membre Dernière intervention   1 217
       

      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
  4. DragonBallZ1981
     

    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
    1. T3chN0g3n Messages postés 69 Date d'inscription   Statut Membre Dernière intervention   1 217
       

      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