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