Détermination de ligne pour insertion

Bonjour le forum,

J'aurais besoin d'un oeil expert pour finaliser mon USF.

J'ai un souci sur mon USF lors de la validation du formulaire, j'ai toujours un bug sur la détermination de ma ligne non vide pour l'insertion des données sur ma feuille ...

Private Sub ValiderButton_Click()
    'création variable pour intégration en fin de bdd
    Dim no_ligne As Integer, rg As Range
    Set rg = Range("bdd_bon_materiel")

  'n°ligne de la dernière cellule non vide
    no_ligne = rg.End(xlDown).Row + 1

    'Insertion des valeurs dans la feuille Bon Materiel
    rg.Cells(no_ligne, 1) = "Agent"
    rg.Cells(no_ligne, 2) = ComboBox_depart_article.Value
    rg.Cells(no_ligne, 3) = ComboBox_depart_noGeniclime.Value
    rg.Cells(no_ligne, 4) = ComboBox_depart_agent.Value
    rg.Cells(no_ligne, 5) = LabelDate.Caption
    rg.Cells(no_ligne, 6) = TextBox_observation.Value

    Unload Me

End Sub

Merci d'avance à la personne qui pourra m'aider

9test.xlsm (53.90 Ko)

Bonjour,

Bonne année,

Remplacer :

no_ligne = rg.End(xlDown).Row + 1

par :

no_ligne = rg.End(xlUp).Row + 1

Merci Pijaku,

C'était plutôt une erreur dans la déclaration de ma variable no_ligne (numéro de ligne à reviser pour ma part )

C'était plutôt une erreur dans la déclaration de ma variable no_ligne

Non.

Tu as déclaré, dans ton gestionnaire de noms, le Range "bdd_bon_materiel" pour toute la plage A2:F1048576.

Donc l'écriture : rg.End(xlDown).Row "part" de la dernière cellule de ton Range, ligne 1048576 et "descend" (comme il ne peut réellement descendre, il reste sur cette ligne).

Ton résultat est donc no_ligne = 1048576.

Si, au lieu de "descendre", tu lui dit de "remonter" (rg.End(xlUp).Row), il va te trouver ta dernière ligne.

Pour pallier à tout cela, j'ai pris l'habitude d'utiliser une fonction ad hoc :

    Public Function derlig_reelle(plage As Range) As Long
       If WorksheetFunction.CountA(plage) = 0 Then derlig_reelle = plage.Cells(1, 1).Row: Exit Function
       derlig_reelle = plage.Find("*", , , , , xlPrevious).Row
    End Function

Fonction que tu peux appeler dans ton code comme ceci (par exemple) :

Dim DL As Long
With Worksheets("Feuil1")
   DL = derlig_reelle(.Cells)
   'ou :
   'DL = derlig_reelle(.Columns(1)) 

De toutes manières, la meilleure solution consiste à utiliser les outils actuels et, donc, les tableaux structurés.

Cela évite :

> de gérer de grandes plages inutilement,

> de rendre son code caduque lors de déplacement de tableaux...

Rechercher des sujets similaires à "determination ligne insertion"