Incrément de date

Bonjour,

je cherche à rentrer des valeurs via un UserForm. Pour chaque nouvelle saisie, il faut rentrer la date qui sera afficher dans une colonne "Date (JJ/MM/YYYY)" qui se décalera de 5 lignes vers le bas si la cellule visée contient déjà une date. Voici le code que j'utilise :

Private Sub CommandButton3_Click() 'bouton "Ok"

Sheets("Feuil2").Activate 'Active la feuil2

Dim i As Integer 'Défini la variable i
i = 3 'Initialise la variable i

Cells(A, i).Select 'Selectionne la cellule

If Cells(A,i) = "" Then 'Si la cellule est vide alors
Cells(A,i) = TextBox16
Else: i = i + 5 'Décale la cellule à la prochaine vide
End If

TextBox1.SetFocus

End Sub

Seulement voilà, celui-ci ne fonctionne pas et je n'arrive pas à comprendre pourquoi, pouvez-vous m'aider ?

Bonne journée !

Ok tu décale ton compteur de 5 ligne mais tu ne fais rien de plus.

Essaye plutot ça

    Private Sub CommandButton3_Click() 'bouton "Ok"
    Dim i As Integer 'Défini la variable i - Il est plus propre de déclarer toutes tes variable après la déclaration de procédure
    Sheets("Feuil2").Activate 'Active la feuil2
    i = 3 'Initialise la variable i
   [barrer]Cells(A,i).Select 'Selectionne la cellule[/barrer]'inutile de sélectionner la cellule pour travailler dessus. En plus l'écriture est fausse

    If Cells(i,1) <> "" Then i=i+5 'Quand on utilise Cells on commence par la ligne puis la colonne et on utlise des chiffres
    Cells(i,1) = TextBox16
    TextBox1.SetFocus

    End Sub

Attention ce code ne va tester qu'une seule fois la présence d'une date sur la cellule, si tu veux tester jusqu'à trouver une place il va falloir remplacer ton if par une boucle while.

Bonsoir,

5 remarques sur ton code (hormis l'erreur de syntaxe déjà soulevée par Astragor ( Salut ! ) :

  • Chaque fois que tu écris Activate ou Select, si ce n'est pas la fin en soi, c'est à dire visant à modifier l'affichage écran pour présentation à l'utilisateur, tu fais simplement une opération supplémentaire et parasite dont l'effet est uniquement de ralentir l'exécution de ton code, donc quelque chose que tu peux et tu dois éviter, ce qui est toujours possible !
  • Si tu pars toujours de la ligne 3 : si A3 n'est pas vide, tu passes à A8, si c'est la 3e fois, A8 ne sera pas vide ! Astragor a aussi soulevé ce problème. Il faut donc introduire une boucle pour pouvoir passer à A13, etc. ou bien si l'on ne doit pas aller au-delà de A8 une condition pour empêcher d'écraser la valeur existante (à moins que A8 demeure modifiable en permanence alors que A3 ne le serait pas... mais on ne peut le déduire de ton code et tu ne le dis pas).
  • Tu affectes à une cellule une date issue d'une TextBox (qui rappelons-le ne saurait contenir de valeur de type Date, mais seulement une valeur texte). Si dans la chaîne appelée à devenir une date, le quantième du jour est inférieur à 13 tu auras toute chance d'obtenir dans ta cellule une inversion mois/jour (selon le format américain que VBA applique par défaut). Pour l'éviter, il convient de convertir en date le texte issu de ta TextBox.
  • Les déclarations de variables se placent par convention en-tête de procédure, avant le code exécutable (les déclarations n'en sont pas). Il est toujours préférable de respecter les conventions, car elles permettent à tout le monde de toujours s'y retrouver (comme le code de la route par exemple !) et elles sont généralement conçues pour rendre plus rapide l'exécution du code...
  • Enfin, mais ce n'est pas le moins important à mon sens, le code ça s'indente, de façon à mettre un ordre visuel dans le code écrit qui permet de le lire plus vite en comprenant ce qu'on lit et éventuellement en détectant certaines erreurs dès le premier regard. Cela n'empêche pas VBA d'exécuter s'il le peut, mais par contre celui qui travaille dessus verra la différence... et je doix avouer que passé une certaine heure dans la journée, dès que le nombre de lignes dépasse la dizaine, si le code n'est pas indenté, je ne fais plus l'effort de le lire !

Sous réserve de la façon dont il convient de traiter A8, voici une proposition tenant compte de ces remarques.

Private Sub CommandButton3_Click()
    Dim i As Integer
    i = 3
    With Worksheets("Feuil2")
        Do While .Cells(i, 1) <> ""
            i = i + 5
        Loop
        .Cells(i, 1) = CDate(TextBox16.Value)
    End With
    TextBox1.SetFocus
End Sub

NB- La mise sous bloc With te permet de qualifier toutes les expressions devant référer à la feuille sans allonger la procédure, et en la rendant plus rapide, du fait que VBA met la référence à l'objet en mémoire pour y accéder directement.

Cordialement.

Bonjour et merci pour vos réponses,

Désolé si ma qualité de rédaction n'est vraiment pas terrible mais je suis débutant dans le domaine

Je vais donc prendre en considération vos conseils pour m'appliquer par la suite !

J'ai effectivement oublié de le préciser, je souhaitais que la date s'incrémente au delà de la cellule A8

Merci en tout cas !

Rechercher des sujets similaires à "increment date"