XL 2019 Je ne trouve pas l'erreur dans mon formulaire

godumathis

XLDnaute Nouveau
Bonjour,

Je digitalise actuellement des fiches pour mon entreprise, c'est pourquoi j'en suis venu à la création de formulaires sur VBA. Je ne maîtrise pas ce type de code (Aucun même pour être honnête). Avec le nombre de tutos disponibles sur youtube et internet j'ai pu créer le excel avec les deux formulaire que vous pouvez voir en pièce jointe.

Cependant je rencontre toujours un problème. Lorsque j'appuie sur valider, je souhaite que les informations s'intègrent ligne par ligne les unes en dessous des autres sans avoir à pré-remplir mon tableau (Le document doit être vierge et donné à différents service).

VB:
Range("A65535").End(xlUp).Row 1 'ici le row1 ne fonctionne pas'

VB:
            Range("A1").Select
            Selection.End(xlDown).Select 'On cherche la prochaine ligne vide de la source
            Selection.Offset(1, 0).Select 'On se décale d'une ligne vers le bas
Ce code devrait pour moi fonctionner mais les informations ne vont pas au bon endroit (Le formulaire recomplète toujours la même ligne)

Cela fait maintenant trois jours que je cherche et teste toutes les formules possibles pour réaliser cela mais je ne trouve pas mon erreur.

Si quelqu'un pourrait m'éclaircir sur le problème qu'il y a dans mon code

Je vous remercie par avance
 

Pièces jointes

  • Suivi de chantier.xlsm
    43.5 KB · Affichages: 27
Solution
Re, salut Bernard, sylvanu,

Je mets ce message plus bas pour laisser Dranreb s'exprimer :)

Vous n'utilisez pas la variable lig mais bon, on peut s'en passer :
VB:
Private Sub btnenregistrer_Click()

    With Sheets("Suivi de chantier").ListObjects(1).Range
        .Parent.Visible = xlSheetVisible 'sécurité si la feuille est masquée
        Application.Goto .Columns(1).EntireColumn.Find("", .Cells(1), xlValues) '1ère cellule vide
    End With
      
    ActiveCell = txtfolio

    ActiveCell.Offset(0, 1) = txtca
    ActiveCell.Offset(0, 2) = txtsyst
    ActiveCell.Offset(0, 3) = txtn
    ActiveCell.Offset(0, 4) = txtbig
    ActiveCell.Offset(0, 5) = txtdesignation
    ActiveCell.Offset(0, 6) = txtot
    ActiveCell.Offset(0, 7) = txtos...

Dranreb

XLDnaute Barbatruc
Bonjour.
Moi je l'aurais écrite comme ça :
VB:
Private Sub btnenregistrer_Click()
   Dim T(1 To 1, 1 To 44), P As Byte
   T(1, 1) = txtn.Text
   If IsDate(txtdate.Text) Then T(1, 2) = CDate(txtdate.Text)
   For P = 1 To 15
      T(1, 2 * P + 1) = Me("txtnp" & P).Text
      T(1, 2 * P + 2) = Me("txts" & P).Text
      Next P
   ActiveSheet.ListObjects(1).ListRows.Add.Range.Value = T
   Call btneffacer_Click 'On vide le formulaire pour une prochaine saisie
   MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"
   End Sub
 

godumathis

XLDnaute Nouveau
Bonjour godumathis, bienvenue sur XLD,

Pas vu de bouton valider dans les UserForms...

Le numéro de la 1ère ligne vide sera donné par la variable lig :
VB:
Dim lig As Long
'---
lig = Range("A" & Rows.Count).End(xlUp).Row + 1

A+
Bonjour job75,

J'avais en effet utilisé cette formule avant cependant elle renvoie toutes mes informations à la ligne mauvaise ligne et me décale en plus de ça les informations de colonne et oublie même de retranscrire certaines informations...
VB:
Private Sub btnenregistrer_Click()

    Sheets("Suivi de chantier").Activate
    Dim lig As Long
    lig = Range("A" & Rows.Count).End(xlUp).Row + 1

    ActiveCell = txtfolio.Value
   
    ActiveCell.Offset(0, 1).Value = txtca
    ActiveCell.Offset(0, 2).Value = txtsyst
    ActiveCell.Offset(0, 3).Value = txtn
    ActiveCell.Offset(0, 4).Value = txtbig
    ActiveCell.Offset(0, 5).Value = txtdesignation
    ActiveCell.Offset(0, 6).Value = txtot
    ActiveCell.Offset(0, 7).Value = txtos
    ActiveCell.Offset(0, 8).Value = txtoi
    ActiveCell.Offset(0, 9).Value = txtrecule

    MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"

End Sub
 

godumathis

XLDnaute Nouveau
Bonjour.
Moi je l'aurais écrite comme ça :
VB:
Private Sub btnenregistrer_Click()
   Dim T(1 To 1, 1 To 44), P As Byte
   T(1, 1) = txtn.Text
   If IsDate(txtdate.Text) Then T(1, 2) = CDate(txtdate.Text)
   For P = 1 To 15
      T(1, 2 * P + 1) = Me("txtnp" & P).Text
      T(1, 2 * P + 2) = Me("txts" & P).Text
      Next P
   ActiveSheet.ListObjects(1).ListRows.Add.Range.Value = T
   Call btneffacer_Click 'On vide le formulaire pour une prochaine saisie
   MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"
   End Sub
Bonjour Danreb,

J'ai du mal à comprendre comment fonctionne cette boucle donc je ne sais pas comment la modifier ou rajouter des informations si besoin..
 

Dranreb

XLDnaute Barbatruc
Elle verse les contenu des contrôles dans un petit tableau dynamique à 2 dimensions mais d'une seule ligne, lequel est ensuite affecté comme valeur de la plage couverte par une ligne ajoutée au tableau Excel. Me représente l'UserForm, et si un nom de contrôle est spécifié entre parenthèses derrière, il considère qu'on parle d'un membre de sa collection Controls.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Godumathis, Job, Dranreb,
Votre tableau 4 étant un tableau structuré, autant profité de ses avantages avec :
VB:
Private Sub btnenregistrer_Click()
    Dim N%
    Sheets("Suivi de chantier").Activate
    With [Tableau4]
        N = .Rows.Count + 1             ' Première ligne vide de Tableau4
        .ListObject.ListRows.Add        ' Ajouter une ligne au tableau structuré
        .Cells(N, "A") = txtfolio.Value ' Remplit le tableau avec les valeurs du Userform
        .Cells(N, "B") = txtca
        .Cells(N, "C") = txtsyst
        .Cells(N, "D") = txtn
        .Cells(N, "E") = txtbig
        .Cells(N, "F") = txtdesignation
        .Cells(N, "G") = txtot
        .Cells(N, "H") = txtos
        .Cells(N, "I") = txtoi
        .Cells(N, "J") = txtrecule
    End With
    MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"
End Sub
 

Pièces jointes

  • Suivi de chantier.xlsm
    35.5 KB · Affichages: 8

Dranreb

XLDnaute Barbatruc
Même lorsqu'il n'y a pas de boucle à faire, comme pour l'autre UserForm que celui pour lequel le demandeur se plaignait d'une erreur d'utilisation incorrecte de la propriété, je préfère toujours verser d'abord les valeurs des contrôles dans un tableau dynamique d'une ligne et l'affecter à la fin comme valeur de la plage couverte par une ligne ajoutée au tableau. C'est plus rapide car on n'a qu'un seul accès à un Range.
 

godumathis

XLDnaute Nouveau
Bonjour Godumathis, Job, Dranreb,
Votre tableau 4 étant un tableau structuré, autant profité de ses avantages avec :
VB:
Private Sub btnenregistrer_Click()
    Dim N%
    Sheets("Suivi de chantier").Activate
    With [Tableau4]
        N = .Rows.Count + 1             ' Première ligne vide de Tableau4
        .ListObject.ListRows.Add        ' Ajouter une ligne au tableau structuré
        .Cells(N, "A") = txtfolio.Value ' Remplit le tableau avec les valeurs du Userform
        .Cells(N, "B") = txtca
        .Cells(N, "C") = txtsyst
        .Cells(N, "D") = txtn
        .Cells(N, "E") = txtbig
        .Cells(N, "F") = txtdesignation
        .Cells(N, "G") = txtot
        .Cells(N, "H") = txtos
        .Cells(N, "I") = txtoi
        .Cells(N, "J") = txtrecule
    End With
    MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"
End Sub
Bonjour Sylvanu,

Ton code fonctionne sauf dans le cas ou le tableau est vide. Mon but et de donner le tableau vierge et j'ai remarqué que si la première ligne n'est pas remplie, le formulaire renvoie les information une ligne en dessous et laisse la première vide :
Imgtableau.PNG
 

godumathis

XLDnaute Nouveau
Elle verse les contenu des contrôles dans un petit tableau dynamique à 2 dimensions mais d'une seule ligne, lequel est ensuite affecté comme valeur de la plage couverte par une ligne ajoutée au tableau Excel. Me représente l'UserForm, et si un nom de contrôle est spécifié entre parenthèses derrière, il considère qu'on parle d'un membre de sa collection Controls.
Merci Dranreb pour tes explications, je vais me pencher dessus pour essayer de bien comprendre comment cela fonctionne.
 

Dranreb

XLDnaute Barbatruc
Raison de plus pour faire comme je le préconise. Pas besoin de connaitre la ligne ajoutée LOt.ListRrows.Add.Range.Value = Tableau marche même si le tableau est vide.
Édition: Je répondais là au message précédent.
 

godumathis

XLDnaute Nouveau
Raison de plus pour faire comme je le préconise. Pas besoin de connaitre la ligne ajoutée LOt.ListRrows.Add.Range.Value = Tableau marche même si le tableau est vide.
VB:
Private Sub btnenregistrer_Click()
   Dim T(1 To 1, 1 To 44), P As Byte
   T(1, 1) = txtn.Text
   If IsDate(txtdate.Text) Then T(1, 2) = CDate(txtdate.Text)
   For P = 1 To 15
      T(1, 2 * P + 1) = Me("txtnp" & P).Text
      T(1, 2 * P + 2) = Me("txts" & P).Text
      'Si je comprend bien, je rajoute à la suite toutes mes variables ici en suivant le même schéma?'
      Next P
   ActiveSheet.ListObjects(1).ListRows.Add.Range.Value = T
   Call btneffacer_Click 'On vide le formulaire pour une prochaine saisie
   MsgBox "Votre dossier a bien été enregistré", vbOKOnly + vbInformation, "CONFIRMATION"
   End Sub
 

godumathis

XLDnaute Nouveau
Vous parlez de quoi, là, de l'autre UserForm ?
Non, je suis toujours sur le premier userform dont vous m'avez partagé votre code. La ligne
VB:
T(1, 2 * P + 1) = Me("txtnp" & P).Text
contient seulement l'information de txtnp, je dois donc refaire la même chose pour toutes les txtnp suivante. Cela je dois le faire en suivant le même schéma de ligne que vous avez fait ? En les mettant à la suite ?
 

Discussions similaires