Boucle et insertion de valeur

Résolu/Fermé
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 - Modifié par pijaku le 10/02/2016 à 09:15
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 - 10 févr. 2016 à 15:16
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

A voir également:

3 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
10 févr. 2016 à 09:23
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
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 6
10 févr. 2016 à 09:31
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
10 févr. 2016 à 09:56
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
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 6 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
10 févr. 2016 à 10:20
Merci encore pour toutes ces explications et pour le temps que tu m'as consacré !

Très bonne journée à toi,

Amicalement,

Ch1ken
0
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 6
10 févr. 2016 à 13:10
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
10 févr. 2016 à 14:12
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
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 6 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
Modifié par Ch1ken le 10/02/2016 à 14:23
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
Ch1ken Messages postés 53 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 17 janvier 2017 6
10 févr. 2016 à 15:16
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