Macro VBA : passer à la ligne suivante si remplie

Bonjour le forum,

Je me suis lancé dans un projet d'automatisation d'un fichier que nous utilisons dans le cadre d'un suivi de l'activité.

Sur les conseils de certains membres émérites de ce forum, j'ai commencé à suivre les "cours VBA" disponibles sur Excel-Pratique.

Mon objectif est d'automatiser l'insertion des données via un userform comportant différents champs et en introduisant des contrôles (ex: si valeur non numérique, alors ne peut être validé).

Je suis pour l'instant à cette étape-ci : https://www.excel-pratique.com/fr/vba/controles.php

La macro que j'ai créé me permet d'introduire, via l'userform, la valeur que je souhaité, ce qui a pour effet d'envoyer mes données vers un tableau que j'appelle BDD.

Néanmoins, à chaque fois que je lance la macro, les données renseignées dans l'userform écrasent les précédentes, à savoir les valeurs se mettent systématiquement en A2...

Ma question est la suivante : comment dynamiser la macro pour qu'elle encore les données à la ligne suivante qui est vide? Ex: si A2 rempli, "verser" les données en A3.

Merci

Salut Pincho,

... en calculant la valeur de cette ligne vierge en partant d'une colonne de ton tableau qui DOIT être une colonne dont on sait avec CERTITUDE qu'elle représentera TOUJOURS la dernière ligne en cours dudit tableau!

Donc,...

iRow = Range("A" & Rows.count).End(xlUp).Row + 1

où iRow (c'est le nom que je donne systématiquement à cette variable particulière! Tu donnes le nom que tu veux!) représente ici la dernière ligne pleine de la colonne A rencontrée en remontant la colonne (End(xlUp)) depuis le fond de la feuille (Rows.Count), valeur à laquelle on ajoute 1 pour accéder enfin à une ligne vierge.

CQFD!

A+

Parfait, merci beaucoup.

J'essaye cela dès que j'ai fini de peaufiner mon userform

EDIT : petit souci, cela marche mais à moitié (sans doute à cause de moi )

Ci-dessous ma macro. Or, ton bout de code, m'inscrit la valeur en A3, puis à chaque fois que j'utilise l'userform, ca va en A3... C'est probablement du au Range("A2")

Private Sub CommandButton1_Click()
If IsNumeric(TextBox1.Value) Then 'SI valeur numérique ...
        Range("A2") = TextBox1.Value 'Copie en A2
        iRow = Range("A" & Rows.Count).End(xlUp).Row + 1
        Unload Me 'Fermeture
    Else
        MsgBox "Valeur incorrecte"
    End If
End Sub

j'ai donc essayé :

Private Sub CommandButton1_Click()
If IsNumeric(TextBox1.Value) Then 'SI valeur numérique ...
        Range("iRow") = TextBox1.Value 'Copie de la valeur dans tableau
        iRow = Range("A" & Rows.Count).End(xlUp).Row + 1
        Unload Me 'Fermeture
    Else
        MsgBox "Valeur incorrecte"
    End If
End Sub

Mais j'obtiens une erreur.

Une idée?

Avant que la discussion se perdre dans l'immensité des topics de ce forum, quelqu'un aurait une petite idée?

Pincho a écrit :

Avant que la discussion se perdre dans l'immensité des topics de ce forum, quelqu'un aurait une petite idée?

Quelqu'un pour un coup de pouce?

J'ai la macro ci-dessous et je souhaiterais que les valeurs, à chaque fois que j'appelle la macro, se mettent une à la suite de l'autre. 1ère fois ca s'introduit en A2, puis si A2 plein, alors ca va en A3.

Private Sub CommandButton1_Click()
If IsNumeric(TextBox1.Value) Then 'SI valeur numérique ...
       Range("A2") = TextBox1.Value 'Copie en A2
        Unload Me 'Fermeture
   Else
        MsgBox "Valeur incorrecte"
    End If
End Sub

le bout de code donné par Curulis fonctionne très bien à l'exception que toutes les valeurs se mettent en A3, et les valeurs futures écrasent les précédentes. Je sais ou est l'erreur mais je ne sais pas le corriger : cela vient du fait que dans ma macro le range est défini en A2. Mais je n'arrive pas à comprendre ce que je dois faire.

       iRow = Range("A" & Rows.Count).End(xlUp).Row + 1

D'avance merci

Bonjour,

il faut être logique...

Calcule d'abord la ligne à utiliser pour t'en servir après.

eric

Bonjour,

Curulis t'a bien donné une solution adéquate !

Private Sub CommandButton1_Click()
    Dim iRow%
    With Worksheets("BDD")
        iRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
        If IsNumeric(TextBox1.Value) Then
            .Range("A" & iRow) = TextBox1.Value
            Unload Me
        Else
            MsgBox "Valeur incorrecte"
        End If
    End With
End Sub

J'avais essayé ceci :

Private Sub CommandButton1_Click()
If IsNumeric(TextBox1.Value) Then 'SI valeur numérique ...
       Range("iRow") = TextBox1.Value 'Copie de la valeur dans tableau
       iRow = Range("A" & Rows.Count).End(xlUp).Row + 1
        Unload Me 'Fermeture
   Else
        MsgBox "Valeur incorrecte"
    End If
End Sub

Mais je vois mieux où était mon erreur.

Merci beaucoup pour la solution

Bonne journée.

Remarque additionnelle :

Je considère qu'apprendre à qualifier ses expressions fait partie des fondamentaux indispensables de l'apprentissage VBA, qu'un débutant doit acquérir au niveau réflexe. Ce pourquoi tu constateras qu'il n'y a jamais dans le moindre bout de code que je fournis d'expression commençant par Range ou Cells ou... dépourvue d'attachement à l'objet auquel l'expression réfère, en l'occurrence à la feuille à laquelle appartient la plage : donc Worksheets("xxx").Range(... ou .Range(... [si dans un bloc With...]

NB- Ne pas le faire, c'est faire chercher par VBA l'élément actif auquel réfère l'expression et, outre courir le risque que l'élément actif ne soit plus le "bon" si les conditions ont changé entre deux exécutions d'une procédure, lui faire passer un temps à chercher que l'on peut économiser...

Cordialement.

Salut Pincho,

ne trouves-tu pas que ce serait plus logique de D'ABORD calculer la position PUIS d'y inscrire la valeur plutôt que l'inverse, comme tu le fais?

Allez, réfléchis deux secondes!

A+

Salut Curulis !

Tu as raison ! C'est d'ailleurs ce que j'ai proposé je crois !...

curulis57 a écrit :

Salut Pincho,

ne trouves-tu pas que ce serait plus logique de D'ABORD calculer la position PUIS d'y inscrire la valeur plutôt que l'inverse, comme tu le fais?

Allez, réfléchis deux secondes!

A+

Salut Curulis,

je pense que j'ai essayé des dizaines, si ce n'est plus de manières de corriger le code. J'ai essayé en mettant ton bout de code avant, au milieu, après, j'ai essaye en créant un Dim iRow (même si je ne comprend pas encore pas très bien la fonction), etc, etc.

Ni voyez juste pas un manque de volonté à cette demande, c'est juste qu'il y a des choses qui peuvent paraître évidentes à un habitué mais totalement dépourvues de sens pour un néophyte. J'essaye d'apprendre, et les moyens que j'ai ce sont ce que je trouve sur le net. J'ai suivi depuis l'introduction jusqu'à cette partie-ci les Cours VBA disponibles sur ce site mais j'ai du louper des fondamentaux à mon avis.

J'essaye d'apprendre au jour le jour avec mes maigres disponibilités, mais pas évident, ce n'est pas quelque chose que je m'attend à maitriser avant 2 ans de pratique. J'ai commencé ceci : https://openclassrooms.com/courses/analysez-des-donnees-avec-excel/le-vba-un-langage-oriente-objet

mais si vous avez d'autres sources d'apprentissage, je suis preneur.

J'ai un long chemin à parcourir

Des choses intéressantes dans ton lien (mi basique mi un peu moins...)

Mais il y a quelques inidcations qui me font bondir :

Je rappelle qu'il ne sera pas nécessaire de faire mention du classeur ou de la feuille de calculs active, puisque nous y sommes déjà (donc inutile de dire d'y aller ).

Je trouve cette phrase irresponsable !!!

L'utilisateur sait qu'il est sur la feuille active du classeur actif ! VBA non ! Si on ne le lui dit pas, il le cherche (et il trouvera certes !) Si on le lui dit, il ne cherche plus ! donc il trouve plus vite !!

Cette phrase aboutit donc à inciter à ne pas doter ses expressions de qualificateurs d'objets, soit à produire un code quelque peu approximatif et non optimisé !

De plus à commencer par les méthodes Select ou Activate, on incite aussi implicitement à passer par ces méthodes, inutiles dès lors que ce n'est pas la finalité de l'action, et qui n'ont pour effet alors que de ralentir l'exécution... Comme ce n'est pas après avoir donné de mauvaises habitudes à un débutant qu'on va facilement l'inciter à en change, je pense qu'il faut dès le départ : qualifier systématiquement, bannir toute sélection en cours d'action (si nécessaire on sélectionne ou active à la fin pour présenter le résultat à la vue de l'utilisateur, jamais avant).

Ce qu'il faut assimiler pour pouvoir commencer à écrire : se reconnaître dans les différents types de modules et leur utilisation, différents types de procédures et comment on les déclare, les variables (types de données et déclarations) et la portée des variables, le type de variables particulier que sont les tableaux (un minimum au moins car ce domaine est plutôt vaste...), les boucles et les instructions conditionnelles et autres. Paralllèlement, savoir se servir d'Excel et avoir un vue du modèle d'objet Excel suffisamment précise pour se repérer à tout moment... Apprendre à utiliser l'Aide et s'y référer en permanence pour s'y retrouver : en particulier pouvoir retrouver rapidement toutes les méthodes et propriétés de chaque objet qu'on utilise, retrouver la définition et la syntaxe d'une fonction VBA (et pouvoir trouver lorsqu'on pense à une fonction Excel, une fonction VBA équivalente si elle existe, plus pratique à utiliser dans le code)...

Cordialement.

Rechercher des sujets similaires à "macro vba passer ligne suivante remplie"