Boucle et insertion de valeur

Résolu
Ch1ken Messages postés 59 Statut Membre -  
Ch1ken Messages postés 59 Statut Membre -
Bonjour,

Je travaille sur un projet ou je dois pouvoir entrer des nombres d'heures effectués sur différents projets (chaque projet a un budget d'heures) et après insertion d'une plage horaire, le total du budget d'heures doit diminuer.

J'ai créé un première page de saisie "user-friendly" pour l'utilisateur et je suis en train de faire derrière des tables qui me permettront d'entrer les données et les utiliser pour la soustraction d'heures.

Mon problème est que j'ai créé un bouton de validation avec la macro suivante :

Sub submit()

    Sheets("HProgrammation").Select
    Range("A1").Select

    Do While Not (IsEmpty(ActiveCell))
        NbLigne = NbLigne + 1
        Selection.Offset(1, 0).Select
    Loop
    
    ActiveCell.Value = "=Saisie!HourProject"

    
    Sheets("Saisie").Select
    
End Sub


Cette macro a pour but de chercher dans mon tableau d'heure la première cellule vide et d'y insérer la valeur entrée pas l'utilisateur. Jusqu'ici tout va bien.

Le problème que je rencontre est en fait qu'une fois que les cellules de se tableaux se remplissent (par les heures saisies par l'utilisateur), la formule suivante leur vient affecté :

=heures_cours.xlsm!HourProject

(HourProject étant le nom de la cellule ou l'utilisateur rentre le montant voulu)

Du coup si l'on rentre tout le temps les mêmes valeurs, aucun problème ! Mais si la première heure rentrée est 5, et que le suivante est 4, la première cellule qui contenant 5 se transformera pour contenir 4 (à cause de la formule précédente) et si ensuite j'insère 4, les 2 cellules précédentes qui contenaient 5 et 4 ainsi que la 3ème cellule (première vide) vont alors toutes contenir 3. Mes calculs deviennent donc totalement erronés !

Quelqu'un peut aurait une idée pour m'aider ?

J'espère avoir été clair !

Merci beaucoup pour votre aide !

Cordialement,

Ch1ken

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pour bien débuter en VBA, pense à ne jamais utiliser .Select en boucle.

    Regarde ce que fait ce code et si cela te convient :

    Sub Submit()
    Dim HeureSaisie
    HeureSaisie = Range("HourProject").Value
    With Sheets("HProgrammation")
       .Columns(1).Find("*", , , , , xlPrevious).Offset(1, 0).Value = HeureSaisie
    End With
    End Sub 

    1
  2. Ch1ken Messages postés 59 Statut Membre 6
     
    Bonjour Pijaku,

    Merci beaucoup pour ta réponse, ton code fonctionne parfaitement !

    Pourrais-tu, si tu as le temps et que tu le veux bien, m'expliquer brièvement ton code ?

    Merci encore et bonne journée !

    Cordialement,

    Ch1ken
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Pas de souci.
      Dim HeureSaisie
      : Décaration d'une variable. Ici je ne l'ai pas typée ne sachant pas quel type de valeur (date, nombre, caractères, etc) celle-ci devait contenir.

      HeureSaisie = Range("HourProject").Value
      : Stocke, dans notre variable, la valeur contenue dans la cellule nommée HourProject

      With Sheets("HProgrammation")
      : Indique au programme que nous allons travailler sur l'objet référencé. Ici l'objet est la feuille HProgrammation. Nous n'activons pas cette feuille, c'est inutile. ==> Pas de Select, pas d'Activate...

         .Columns(1).Find("*", , , , , xlPrevious).Offset(1, 0).Value = HeureSaisie
      : Ici, on dit que la valeur
      value
      de la cellule en dessous de
      Offset(1, 0)
      la dernière cellule remplie de la colonne 1
      Columns(1).Find("*", , , , , xlPrevious)
      est égale au contenu de notre variable
      = HeureSaisie
      .

      End With
      : Fin du bloc With, on ne travaille plus sur l'objet.
      Ce bloc nous a permis de travailler sans changer de feuille active...
      0
      1. Ch1ken Messages postés 59 Statut Membre 6 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Merci encore pour toutes ces explications et pour le temps que tu m'as consacré !

        Très bonne journée à toi,

        Amicalement,

        Ch1ken
        0
  3. Ch1ken Messages postés 59 Statut Membre 6
     
    Dans le code que tu m'as fourni, pour rappel :

    Sub submit()
    Dim HeureSaisie
    HeureSaisie = Range("HourProject").Value
    With Sheets("HProgrammation")
    .Columns(1).Find("*", , , , , xlPrevious).Offset(1, 0).Value = HeureSaisie
    End With
    End Sub

    Est-il possible de changer la nomination de la page "HProgrammation" par une cellule ? Je m'explique, les heures saisies doivent l'être sur 3 cours différents et le cours de programmation est le premier cours. Dans la page de saisie, j'ai créé une liste déroulante avec les 2 autres cours. J'aurai aimé que les données viennent s'inscrire dans la page correspondante au cours que l'utilisateur aura sélectionné.

    J'ai tenté de nommer cette cellule et de changer la feuille dans ton code :

    With Sheets(CoursePage)

    CoursePage étant le nom de la cellule qui contient le nom du cours, mais cette méthode ne fonctionne pas. J'aurais également aimé pouvoir changer le numéro de colonne à la ligne juste avant le "End With" de la même manière car chaque colonne représente 1 mois. La colonne 1 se rapporte à Août 2016 mais Septembre devrait se trouver dans la 2ème colonne.

    Je ne sais pas si j'ai été assez clair ?

    Ce serait vraiment très aimable de me répondre encore une fois de plus.

    Merci d'avance et très bonne journée.

    Amicalement,

    Ch1ken
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Passe par une variable de type String.

      Sub submit() 
      Dim HeureSaisie 
      Dim maFeuille As String
         HeureSaisie = Range("HourProject").Value 
         maFeuille = Range("CoursePage").Value
         With Sheets(maFeuille) 
            .Columns(1).Find("*", , , , , xlPrevious).Offset(1, 0).Value = HeureSaisie 
         End With 
      End Sub 
      0
      1. Ch1ken Messages postés 59 Statut Membre 6 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Merci pour ta réponse Pijaku mais ca ne fonctionne malheureusement pas :(

        Voici l'intitulé de l'erreur : "Run-time error '1004':

        Method 'Range' of object '_Global' failed"

        MODIF : Non je n'ai rien dit, il s'agissait en fait du nom de cellule CoursPage, voilà la raison de l'erreur :)

        S'agit-il de la même logique pour le numéro de colonne ? J'imagine... je vais tester et rendre réponse ici.

        Quoi qu'il en soit, merci encore à toi Pijaku pour ton super soutien !
        0
    2. Ch1ken Messages postés 59 Statut Membre 6
       
      Voilà, le code fonctionne parfaitement, j'ai même encore rajouté un bouton (macro delete) qui permet de supprimer la dernière entrée du tableau. Voici mon code :

      Sub submit()
      Dim HeureSaisie
      Dim Page As String
      Dim Column As Integer
      HeureSaisie = Range("HourProject").Value
      Page = Range("CoursPage").Value
      Column = Range("ColumnMonth").Value
      With Sheets(Page)
      .Columns(Column).Find("*", , , , , xlPrevious).Offset(1, 0).Value = HeureSaisie
      End With
      End Sub


      Sub Delete()
      Dim Page As String
      Dim Column As Integer
      Page = Range("CoursPage").Value
      Column = Range("ColumnMonth").Value
      With Sheets(Page)
      .Columns(Column).Find("*", , , , , xlPrevious).ClearContents
      End With
      End Sub


      Merci encore pijaku et bonne journée à tout le monde !
      0