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...

godumathis

XLDnaute Nouveau
Merci infiniment job75 !

Ton code fonctionne parfaitement comme je le souhaitais. Je ne doute pas du code de tes collègues qui doivent sans doute fonctionner, cependant le tiens est pour moi le plus simple à comprendre. Je n'ai pas encore utilisé de boucle et ne faisant que très occasionnellement du code, éviter ceci me va !
 

job75

XLDnaute Barbatruc
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
    ActiveCell.Offset(0, 8) = txtoi
    ActiveCell.Offset(0, 9) = txtrecule

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

End Sub
A+
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ton code fonctionne sauf dans le cas ou le tableau est vide.
Oups !
VB:
Private Sub btnenregistrer_Click()
    Dim N%
    Sheets("Suivi de chantier").Activate
    With [Tableau4]
        N = 1 + .Rows.Count               ' Première ligne vide de Tableau4
        If .Cells(1, "A") <> "" Then .ListObject.ListRows.Add Else N = N - 1   ' Ajouter une ligne au tableau structure
        .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
 

Dranreb

XLDnaute Barbatruc
Mais même si on tient à renseigner au coup par coup chaque cellule, pourquoi ne pas utiliser un minimum de renseignement donné par le ListRow ajouté, même si le tableau est vide, en faisant N = .ListObject.ListRows.Add.Range.Row ?
Ou bien faire toujours With [Tableau4].ListObject.ListRows.Add.Range
et utiliser ensuite 1 au lieu de N.
 

job75

XLDnaute Barbatruc
On peut traiter toutes les TextBoxes en même temps, sans boucle :
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.Resize(, 10) = Array(txtfolio, txtca, txtsyst, txtn, txtbig, txtdesignation, txtot, txtos, txtoi, txtrecule)

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

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510