XL 2019 probleme Sheets("entreeor").ListObjects(1).ListRows.Add

jules56750

XLDnaute Nouveau
fichier marche et tout un coup me renvoi erreur Sheets("entreeor").ListObjects(1).ListRows.Add et m'oblige a relancer excel et apres marche bien pendant un certain temps. code vba 123
je ne comprends plus rien mais debutant en vba
merci pour votre aide
Private Sub CommandButton2_Click() 'Code du bouton enregistrer du userform6
Dim nombre_ligne As Integer
Dim ligne As Integer
Dim DL5 As Integer
Dim MonOR As String
Dim iLigne As Long
Dim DerLigne As Long
Application.ScreenUpdating = False

'On vérifie qu'il y a des choses dans la liste
If Me.ListBox1.ListCount > 0 Then
'demander une confirmation de la commande
If MsgBox("Voulez-vous enregistrer OR ?", vbYesNo) = vbYes Then
'*******************************************************************


If Not Me.cbx_vehicule > "" Then
MsgBox ("Saisir un véhicule")
Exit Sub
End If
'***************************************************************************

'******************************************************************************

Else
GoTo fin
End If
Else
MsgBox " pas de commande disponible"
GoTo fin
End If

'Le numéro d'OR est dans label_info
MonOR = label_info.Value

'Si on a un numéro OR c'est qu'on vient de modifier sinon il faut aller en chercher un nouveau

If MonOR > " " Then
'On supprime toutes les ligne de la feuille entreor avec ce numéro d'OR
Sheets("entreeor").Activate
'Nombre de ligne de la feuille entreeor
DerLigne = Range("C" & Rows.Count).End(xlUp).Row

iLigne = 3
Do
If iLigne > DerLigne Then Exit Do

If Range("C" & iLigne).Value = MonOR Then
Range("C" & iLigne).EntireRow.Delete
DerLigne = DerLigne - 1
Else
iLigne = iLigne + 1
End If
Loop
Else
'on récupère un numéro OR
MonOR = Sheets("Config").Range("E23")
'On ajouote un pour le prochain numéro OR
Sheets("Config").Range("D23") = Sheets("Config").Range("D23") + 1
End If

nombre_ligne = Me.ListBox1.ListCount - 1
For ligne = 0 To nombre_ligne 'On boucle sur chaque ligne de la liste
'on ajoute une ligne dans le tableau
Sheets("entreeor").ListObjects(1).ListRows.Add

'chercher le n° de la prochaine ligne libre dans notre tableau
DL5 = Sheets("entreeor").Range("C" & Rows.Count).End(xlUp).Row

' ajouter nos informations dans notre base de donnée
Sheets("entreeor").Range("C" & DL5) = MonOR
Sheets("entreeor").Range("Q" & DL5) = TextBox23.Value
Sheets("entreeor").Range("D" & DL5) = cbx_vehicule.Value
Sheets("entreeor").Range("E" & DL5) = immatriculation.Value
Sheets("entreeor").Range("F" & DL5) = chassis.Value
Sheets("entreeor").Range("G" & DL5) = Txtkilométrage.Value
Sheets("entreeor").Range("L" & DL5) = Cbxemployés.Value
Sheets("entreeor").Range("M" & DL5) = ComboBox3.Value
Sheets("entreeor").Range("N" & DL5) = travaux.Value
Sheets("entreeor").Range("K" & DL5) = Temps.Value
Sheets("entreeor").Range("I" & DL5) = (Me.ListBox1.List(ligne, 1)) 'désignation' bon
Sheets("entreeor").Range("H" & DL5) = CStr(Me.ListBox1.List(ligne, 0)) 'ref article
Sheets("entreeor").Range("J" & DL5) = (Me.ListBox1.List(ligne, 2)) 'Quantitée
Sheets("entreeor").Range("O" & DL5) = CCur(Me.ListBox1.List(ligne, 3)) 'Prix
Sheets("entreeor").Range("P" & DL5) = (Me.ListBox1.List(ligne, 4)) 'fournisseur
Sheets("entreeor").Range("B" & DL5) = CDate(Now())
Next ligne

'Range("Tabl_OR[N° Ordre]").Select
' ActiveWorkbook.Worksheets("entreeor").ListObjects("Tabl_OR").Sort.SortFields. _
' Clear
' ActiveWorkbook.Worksheets("entreeor").ListObjects("Tabl_OR").Sort.SortFields. _
' Add2 Key:=Range("Tabl_OR[N° Ordre]"), SortOn:=xlSortOnValues, Order:= _
' xlAscending, DataOption:=xlSortNormal
' With ActiveWorkbook.Worksheets("entreeor").ListObjects("Tabl_OR").Sort
' .Header = xlYes
' .MatchCase = False
' .Orientation = xlTopToBottom
' .SortMethod = xlPinYin
' .Apply
' End With


fin:
Unload Me
Application.ScreenUpdating = True
ThisWorkbook.Save

UserForm1.Show
'Sheets("entreeor").Activate
End Sub
 
C

Compte Supprimé 979

Guest
BONJOUR Jules56750

1) Dans la vie, lorsque vous arrivez dans un endroit on commence par dire BONJOUR
c'est la même chose sur les forums :rolleyes:

2) Afin d'améliorer la lisibilité du fil, merci d'éditer votre 1er post et mettre votre code entre balises
1673341907560.png


Merci de faire le nécessaire SVP
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Jules,
Dans l'ordre :
1- Lorsqu’on rentre sur un fil, comme dans la vie de tous les jours, on est poli en disant « Bonjour ». LIEN
2- Utilisez les balises </> pour le code c'est plus lisible ( à droite de l'icone GIF )
3- Joignez un petit fichier test représentatif, car dans l'état c'est difficile de comprendre et d'analyser.
4- Essayez d'expliquer où est vraiment le problème, car "code vba 123" n'éclaire pas beaucoup.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

VB:
Private Sub CommandButton2_Click()
' Code du bouton "Enregistrer" du UserForm6
'
Dim nombre_ligne As Integer
Dim ligne As Integer
Dim DL5 As Integer
Dim MonOR As String
Dim iLigne As Long
Dim DerLigne As Long

    Application.ScreenUpdating = False

    ' On vérifie qu'il y a des choses dans la liste
    If Me.ListBox1.ListCount > 0 Then
        ' demander une confirmation de la commande
        If MsgBox("Voulez-vous enregistrer OR ?", vbYesNo) = vbYes Then
            If Not Me.cbx_vehicule > "" Then
                MsgBox ("Saisir un véhicule")
                Exit Sub
            End If
        Else
            GoTo fin
        End If
    Else
        MsgBox " pas de commande disponible"
        GoTo fin
    End If

    ' Le numéro d'OR est dans label_info
    MonOR = label_info.Value

    ' Si on a un numéro OR c'est qu'on vient de modifier sinon il faut aller en chercher un nouveau
    If MonOR > " " Then

        ' On supprime toutes les ligne de la feuille entreor avec ce numéro d'OR
        Sheets("entreeor").Activate
        ' Nombre de ligne de la feuille entreeor
        DerLigne = Range("C" & Rows.Count).End(xlUp).Row

        iLigne = 3
        Do
            If iLigne > DerLigne Then Exit Do
            If Range("C" & iLigne).Value = MonOR Then
                Range("C" & iLigne).EntireRow.Delete
                DerLigne = DerLigne - 1
            Else
                iLigne = iLigne + 1
            End If
        Loop

    Else

        ' on récupère un numéro OR
        MonOR = Sheets("Config").Range("E23")
        ' On ajouote un pour le prochain numéro OR
        Sheets("Config").Range("D23") = Sheets("Config").Range("D23") + 1

    End If

    nombre_ligne = Me.ListBox1.ListCount - 1
    For ligne = 0 To nombre_ligne ' On boucle sur chaque ligne de la liste
        ' on ajoute une ligne dans le tableau
        Sheets("entreeor").ListObjects(1).ListRows.Add

        ' chercher le n° de la prochaine ligne libre dans notre tableau
        DL5 = Sheets("entreeor").Range("C" & Rows.Count).End(xlUp).Row

        ' ajouter nos informations dans notre base de donnée
        Sheets("entreeor").Range("C" & DL5) = MonOR
        Sheets("entreeor").Range("Q" & DL5) = TextBox23.Value
        Sheets("entreeor").Range("D" & DL5) = cbx_vehicule.Value
        Sheets("entreeor").Range("E" & DL5) = immatriculation.Value
        Sheets("entreeor").Range("F" & DL5) = chassis.Value
        Sheets("entreeor").Range("G" & DL5) = Txtkilométrage.Value
        Sheets("entreeor").Range("L" & DL5) = Cbxemployés.Value
        Sheets("entreeor").Range("M" & DL5) = ComboBox3.Value
        Sheets("entreeor").Range("N" & DL5) = travaux.Value
        Sheets("entreeor").Range("K" & DL5) = Temps.Value
        Sheets("entreeor").Range("I" & DL5) = (Me.ListBox1.List(ligne, 1)) 'désignation' bon
        Sheets("entreeor").Range("H" & DL5) = CStr(Me.ListBox1.List(ligne, 0)) 'ref article
        Sheets("entreeor").Range("J" & DL5) = (Me.ListBox1.List(ligne, 2)) 'Quantitée
        Sheets("entreeor").Range("O" & DL5) = CCur(Me.ListBox1.List(ligne, 3)) 'Prix
        Sheets("entreeor").Range("P" & DL5) = (Me.ListBox1.List(ligne, 4)) 'fournisseur
        Sheets("entreeor").Range("B" & DL5) = CDate(Now())
    Next ligne

'    Range("Tabl_OR[N° Ordre]").Select
    With ActiveWorkbook.Worksheets("entreeor").ListObjects("Tabl_OR").Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=Range("Tabl_OR[N° Ordre]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

fin:
    Unload Me
    Application.ScreenUpdating = True
    ThisWorkbook.Save

    UserForm1.Show
'    Sheets("entreeor").Activate

End Sub

Visiblement tu utilises un tableau structuré nommé Tabl_OR, mais tu sembles :
- supprimer des lignes de la feuille au lieu de supprimer des lignes dudit tableau,
- remplir des lignes de la feuille au lieu de remplir des lignes dudit tableau.

Peut-être devrais-tu gérer la suppression de lignes et l'ajout de données avec une méthode spécifique aux tableaux structurés ?


Et sinon, quelle est la valeur de Ligne quand ça plante ?
 

TooFatBoy

XLDnaute Barbatruc
ca plante sur
Sheets("entreeor").ListObjects(1).ListRows.Add
Oui, j'avais bien compris. Mais sais-tu quelle est la valeur de la variable Ligne à ce moment-là ?


quel est la méthode pour les tableaux structurés
C'est quelque chose que je ne maîtrise pas du tout... :( mais qui pourrait être un axe de réflexion.


As-tu réussi à diminuer la taille de ton fichier ?
Sans fichier, on ne peut pas faire grand chose. :(
 
Dernière édition:

Gégé-45550

XLDnaute Accro
merci de votre réponse
quel est la méthode pour les tableaux structurés
ca plante sur
Sheets("entreeor").ListObjects(1).ListRows.Add
Set c = Rng.Find(Me.ComboBox2.Value, LookIn:=xlValues)
bonjour jules56750,salut l'ami TooFatBoy, le fil
@jules56750, il existe plein de tutos sur les tableaux structurés, comme par exemple celui d'excel_pratique.
Personnellement, je préfère, pour un tableau nommé Tabl_Or, utiliser l'expression
VB:
Sheets("entreeor").ListObjects("Tabl_Or").ListRows.Add
plutôt que
Code:
Sheets("entreeor").ListObjects(1).ListRows.Add
ça limite les risques d'erreur.
cordialement,
 

Gégé-45550

XLDnaute Accro
merci de votre réponse
quel est la méthode pour les tableaux structurés
ca plante sur
Sheets("entreeor").ListObjects(1).ListRows.Add
Set c = Rng.Find(Me.ComboBox2.Value, LookIn:=xlValues)
Bonsoir,
Allez un petit coup de main sur les tableaux structurés :
Un tableau structuré peut s'envisager en 5 parties :
  • le .Range : c'est le tableau complet. Si l'on fait .Range.Address, on obtiendra l'adresse absolue du tableau dans la feuille, par exemple $D$4:$H$11
  • le .HeaderRowRange : c'est l'entête du tableau, qui contient le titre des colonnes. Si l'on fait .HeaderRowRange.Address de l'exemple précédent, on obtiendra $D$4:$H$4
  • le .DataBodyRange : c'est le corps du tableau, celui qui contient les données. Si l'on fait .DataBodyRange.Address dans l'exemple précédent, on obtiendra $D$5:$H11 si le tableau n'affiche pas de ligne Total, sinon ce sera $D5:$H$10.
  • le .TotalsRowRange : c'est la ligne Total du point précédent. Notez que vous pouvez choisir d'afficher ou non le HeaderRowRange (ligne d'entête) et/ou le TotalsRowRange (ligne Total), parmi d'autres options, dans le menu 'Création de tableau' d'Excel ou par code VBA.
  • les lignes .ListRows et les colonnes .ListColumns
Dans l'exemple ci-dessus, la deuxième ligne du .DataBodyRange (.DataBodyRange.Row(2)) est la ligne 6 de la feuille.
Pour finir, dans votre cas, la dernière ligne de données de votre tableau structuré s'obtient par :
VB:
DerLigne = ThisWorkbook.Worksheets(("entreeor").ListObjects("Tabl_Or").DataBodyRange.Rows.Count
Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 679
dernier inscrit
Yupanki