UF et tableau structuré

Bonjour à tous,

Je tiens a remercier ce forum et tous les intervenants, qui m'on permis de bien me depatouiller avec excel et VBA.

Je ne suis ni information ni developpeur, pas grand chose, je m'interesse juste a la programation en general.

J'aimerai un peu d'explication pour la suite d'un de mes projet.

reprendre une table de données sous excel et la rendre plus convivial sécuritaire et rapide.

je vous joint le fichier avec des exemples

3 onglets

Incubation

Qui regroupe chaque production ainsi que toutes les analyses a faire pour liberer le produits.

Base Articles

qui répertorie chaque produit avec les analyses a faire dessus

VBA

qui me sert de base de données penses bêtes et sources pour les combo box

j'ai créer des UF pour ajouter modifier les bases

je suis passé sur des tableau structuré mais je me retrouve un peu bloqué quand a la manière de procéder pour ajouter un ligne a mon tableau structuré ou pour modifier une ligne deja existante...

avant je remplissez mon tableau avec une boucle mais la je suis un peu perdu ca fait longtemps que je n'avais pas remis la tete dedans

on me demande de le finir rapidement... lol

j'ai des projets avec cette base d’autorisation ou non d’écriture ou de visualisation ... regarder dans l'onglet VBA hihihi mais la ça va être un autre niveau je pense

je n'arrive pas a envoyer mon fichier il est trop gros, je le joint rapidement

je remercie déjà toutes personnes qui pourra se pencher sur ma question...

au plaisir de vous lire

Je pense que la réponse doit être dans le forum, mais malheureusement je n'ai encore pas trouvé...

Bonjour

Un Tableau structuré est proche d'une table de BD donc effectivement on ne gère pas comme une plage de données

exemple VarDerL = DE.Range("D65536").End(xlUp).Row + 1 est totalement inutile (en plus 65536 est hérité des vieilles versions.

As-tu une contrainte car je vois que le code le gère...)

On connait la taille du tableau avec

ListObjects("T_Incub").Range.Rows.Count (avec en-tête)

ListObjects("T_Incub").ListRows.Count (hors en-tête)

Il est inutile d'écrire les formules sur toutes les lignes : elles se propagent automatiquement donc même avec un tableau initialement vide, (une ligne de titre et une ligne de données vide) si la première ligne de données contient les bonnes formules, formats (dont validation, MFC) tout se propagera sur les nouvelles lignes

On ajoute une ligne avec .ListRows.Add (Dans un with DE.ListObjects("T_Incub"))

On peut gérer cela avec ce type de code

Set Ligne = .ListRows.Add
    With Ligne.Range.Cells(1, 1)
        .Offset(0, 0) = ...
        .Offset(0, 1) = ...
        .Offset(0, 2) = ...
    End With

Pour modifier il faut rechercher la ligne avec un find (peut-être utile aussi pour éviter l'ajout d'un doublon dans la procédure d'ajout) et mettre à jour avec ce type de code

With DE.ListObjects("T_Incub").ListColumns("9").DataBodyRange
    Set Ligne = .Find("8162213")
    If Ligne Is Nothing Then MsgBox "Erreur code inexistant": Exit Sub
    With Ligne.Offset(0, -8)
        .Offset(0, 0) = ...
        .Offset(0, 1) = ...
        .Offset(0, 2) = ...
    End With
End With

A noter qu'il est préférable d'avoir des entêtes de tableau avec des noms plutôt que des numéros...

Merci pour ta reponse,

oui le code de VarDerL = DE.Range("D65536").End(xlUp).Row + 1

c'est l'ancienne version,

avant il y avais un UF juste pour rentrer la premiere partie du tableau en vert, les resultats etait rentré a la mains en esperant ne pas se trompé de ligne...

je ne sais pas trop par rapport au contraintes

j'ai mis des numero pour me reperer un peu car avant je remplisser le tableau avec une boucle chaque text avais le numero de la colonne pour que ce soit plus simple.

je vais essayer un peu ce que tu me propose, bien que je n'y connais pas vraiment grand chose

je vais essayer avec un tableau a deux ou trois colonnes au depart

en tout cas merci pour la piste

J'ai commencé a faire l'ajout du tableau Base Article.

voici mon code lors du clic sur le bouton Valider

je pense qu'il doit être très sale

Private Sub Bouton_Valider_Click()

Application.ScreenUpdating = False

Dim DE As Worksheet
Set DE = Sheets("Base Article")

With DE.ListObjects("T_BaseArticle")

If IsNumeric(TextBox_Ajoutcode_0) = True Then

DE.Unprotect "Motdepasse"

Set Ligne = .ListRows.Add

     With Ligne.Range.Cells(1, 1)
        .Offset(0, 0) = TextBox_Ajoutcode_0.Value
        .Offset(0, 1) = TextBox_Ajoutcode_1.Value
        .Offset(0, 2) = TextBox_Ajoutcode_2.Value
        .Offset(0, 3) = TextBox_Ajoutcode_3.Value
    End With
    Else
    MsgBox "Le code Article doit être de valeur numérique"

    End If

End With

Application.ScreenUpdating = True
DE.Protect "Motdepasse"

Exit Sub
End Sub

J'aimerai verifier que chaque case soit rempli, que le code article est bien une valeur numerique et qu'il ne soit pas deja present dans le tableau, et que les plan de prelevenment ainsi que le type de protocoles soit ceu uniquement present dans la combo

que je prerempli avec

Private Sub UserForm_Initialize()

TextBox_Ajoutcode_2.RowSource = ("T_Prelev")
TextBox_Ajoutcode_3.RowSource = ("T_Protocole")

End Sub

je me demande si je ne devrais pas utiliser des modules pour faire mes vérification, protection de feuille, ...

Bonjour

Créer une ou deux boucles de contrôle de saisie dès le début de la procédure Bouton_Valider_Click()

Principes

Dim CControle as Control, erreur as Boolean
erreur =false
'Contrôle de complétude
For each Ccontrole in Me.Controls 'nom des champs à adapter
Selet Case CControle
    Case champ1, Champ3, champ5
        If CControle.Value="" then erreur=true
    Case champx....
        If CControle..........then erreur=true
End Select
If erreur=True then 
  MsgBox "Merci de saisir...."
  Exit Sub
Endif
Next Ccontrole
'Contrôle des valeurs
For each Ccontrole in Me.Controls 'nom des champs à adapter
Selet Case CControle
    Case champ1
        If CControle....... then 
              MsgBox "La valeur  doit être....."
              CControle.SetFocus
              Exit Sub
        Endif
    Case champx....
        If CControle........then
              MsgBox "La valeur  doit être....."
              CControle.SetFocus
              Exit Sub
        Endif
End Select
Next Ccontrole

Nickel

voila ce que j'ai ecrit

Private Sub TextBox_Ajoutcode_0_Change()

'affiche label erreur si une valeur non numerique est rempli
If IsNumeric(TextBox_Ajoutcode_0.Value) Then 'SI valeur numérique ...
        Label_erreurcode.Visible = False 'Label masqué
    Else 'SINON ...
        Label_erreurcode.Visible = True 'Label visible
    End If

End Sub

Private Sub UserForm_Initialize()

TextBox_Ajoutcode_2.RowSource = ("T_Prelev")
TextBox_Ajoutcode_3.RowSource = ("T_Protocole")

End Sub

Private Sub Bouton_Valider_Click()
'test

Dim CControle As Control, erreur As Boolean
erreur = False
'Contrôle de complétude des champs vide
For Each CControle In Me.Controls 'nom des champs à adapter
Select Case CControle
    Case TextBox_Ajoutcode_0, TextBox_Ajoutcode_1, TextBox_Ajoutcode_2, TextBox_Ajoutcode_3
        If CControle.Value = "" Then erreur = True
    End Select
If erreur = True Then
  MsgBox "Merci de saisir tous les champs", vbExclamation, "Incomplet"

  Exit Sub
End If

Next CControle
'Contrçle valeur numerique du champ code article

For Each CControle In Me.Controls 'nom des champs à adapter
Select Case CControle
    Case TextBox_Ajoutcode_0
        If IsNumeric(CControle) = False Then
                MsgBox "Le Code Article doit être numerique", vbInformation, "Valeur incorrect"
            CControle.SetFocus
            Exit Sub
        End If
End Select
Next CControle
'Controle de la bonne valeur dans le plan de prelevement

For Each CControle In Me.Controls 'nom des champs à adapter
Select Case CControle
    Case TextBox_Ajoutcode_2
        If CControle = "T_Prelev[Plan de prélévement]" Then
                MsgBox "Le Code Article doit être numerique", vbInformation, "Valeur incorrect"
            CControle.SetFocus
            Exit Sub
        End If
End Select
Next CControle
Private Sub TextBox_Ajoutcode_0_Change()

et

Private Sub UserForm_Initialize()

Fonctionne correctement

La partie pour vérifier les champs vide =>OK

La partie pour vérifier la Valeur numérique => OK

J'aimerai maintenant que l'opérateur ne puisse pas mettre autre chose que ce qui se trouve dans le RowSource du label 2 et 3...

avez vous une idée

RE

Si tu n'as qu'un cas de contrôle (TextBox_Ajoutcode_0) les structures For each et le Select Case sont inutiles : utilise directement le if...

Pour les listes déroulantes : il suffit de régler le paramètre Style de la liste sur 2

Merci 78chris,

c'est vrai que ce n'est pas très utile une boucle sur un seul terme, je l'ai écris surtout pour m'habituer a la partie modif incub... lol

punaise je ne l'avais pas vu ce style,...

encore une question, la dernière,...

avant les suivante

si dans les structures For each et le Select Case k'ai une soixantaine de control sur textbox a vérifier en sachant que j'ai nommer mes textbox de facon incrementé, genre TB_modifIncub_1, TB_modifIncub_2,....TB_modifIncub_59, TB_modifIncub_60

est il possible de faire une boucle la dessus aussi ??

je ne sais pas si je suis assé clair

et si je veux faire une boucle pour remplir mon tableau ???

Merci 78chris,

c'est vrai que ce n'est pas très utile une boucle sur un seul terme, je l'ai écris surtout pour m'habituer a la partie modif incub... lol

punaise je ne l'avais pas vu ce style,...

encore une question, la dernière,...

avant les suivante

si dans les structures For each et le Select Case k'ai une soixantaine de control sur textbox a vérifier en sachant que j'ai nommer mes textbox de facon incrementé, genre TB_modifIncub_1, TB_modifIncub_2,....TB_modifIncub_59, TB_modifIncub_60

est il possible de faire une boucle la dessus aussi ??

je ne sais pas si je suis assé clair

et si je veux faire une boucle pour remplir mon tableau ???

Rechercher des sujets similaires à "tableau structure"