XL 2010 Remplissage du TextBoxNuméroCréationArticlesMenus

BUDGETS

XLDnaute Impliqué
Bonjour à toutes et à tous,

Soit la feuille BD articles menus comprenant un tableau dont le nom est TabArticlesMenus et comprenant différentes colonnes dont Code catégorie articles menus, Nom catégorie articles menus, Code article menu, Nom article menus et Numéro création articles menus.
Supposons que ce tableau soit vide. Je crée un premier article (Code catégorie articles menus : CCAM01, Nom catégorie articles menus : DMR, code article menus : DMR01, Nom article menus : Pomme). Numéro création articles menus : deux possibilités : la première taper le numéro moi-même; deuxième solution : demander au programme de le créer lui-même. Dans ce dernier cas, l'article n'existe pas, le numéro de création sera 1; l'article existe déjà : le numéro de création sera 2 ou 3 ou 4, selon le cas, etc. Pour chaque catégorie, il devra partir de 1 pour chaque article. DMR ET DS, n'auront qu'un seul article. DWE en aura 21. pour LMR : premier article : il aura le numéro 1, le 17ème article sera numéro 17. L'attribution du numéro de création sera indépendant d'une catégorie à l'autre.
D'avance merci pour votre aide.
 

BUDGETS

XLDnaute Impliqué
Comme pour l'UF01_CtgArt, voici mes commentaire pour l'UF02_ArtMenu. J'ai repris, quand cela était possible, tes explications (en espérant ne pas avoir fait d'erreurs) du premier formulaire. Quand je ne sais pas, j'ai demandé à quoi cela correspond, à expliquer des procédures, etc.

Option Explicit

'Déclaration des variables : dim LgArt& (identique à dim LgArt as long);Que représente LgArt& ?Que représente b ? Les variables de type booléan sont stockées sous la forme de nombres de 16 bits
'(2 octets), mais elles ne peuvent avoir pour valeur que True ou false
Dim LgArt&, b As Boolean

Private Sub cbCtgÀModif_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Si on appuie sur la touche Echap, on ferme le formulaire puis on quitte la procédure car ensuite il y a end sub
If KeyAscii = 27 Then Unload Me
End Sub

Private Sub cbCodJour_Change()

'Déclaration des variables : dim n% (identique à dim n% as Integer);n : met dans n le numéro d'index de la zone de liste déroulante cbCodJour (comboboxCodJour). Le signe
':, en VBA, est un séparateur d'instruction. Cela équivaut à :
'dim n%
'n=cbCodJour.ListIndex
Dim n%: n = cbCodJour.ListIndex
'Que signifie l'instruction ci-après ?
If n = -1 Then lbNomJour2 = "" Else lbNomJour2 = Range("LJO[NJ]").Item(n + 1)
End Sub

Private Sub cbCodCAM_Change()
'Déclaration des variables : dim n% (identique à dim n% as Integer);n : met dans n le numéro d'index de la zone de liste déroulante cbCodCam (comboboxCodCam)
Dim n%: n = cbCodCAM.ListIndex
'Que signifie l'instruction ci-après ? Si identique à l'instruction de la procédure cbCodJour_Change mias à part le nom des outils, inutile de répondre à cette question, ce qui se-
'sûr.
If n = -1 Then lbNomCAM2 = "" Else lbNomCAM2 = Range("LCO[NK]").Item(n + 1)
End Sub

Private Sub TriTArtMenu()
With ActiveSheet.ListObjects("TArtMenu")
With .Sort
.Header = xlYes 'la 1ère ligne du tableau est une ligne d'en-têtes (=> ne pas la trier !)
.MatchCase = False 'trier sans faire de différence entre les majuscules et les minuscules
With .SortFields
.Clear 'supprimer tous les critères de tri
.Add Key:=Range("TArtMenu[CC]"), SortOn:=0, Order:=1 'Code catégorie (par valeur, croissant)
.Add Key:=Range("TArtMenu[CA]"), SortOn:=0, Order:=1 'Code article (par valeur, croissant)
End With
.Apply: [A1].Select 'fait le tri selon les infos ci-dessus, puis va en A1
End With
End With
End Sub

Private Sub cmdValider_Click()
'Déclaration des variables : dim lig& (identique à dim lig as long);Que représente b ? En VBA, un : est un séparateur d'instruction, ce qui équivaut à :
'Dim lig
'Application.ScreenUpdating = 0;Pourquoi 0
'FL02_BDA.Select : on sélectionne et on va aller dans la feuille BD articles (BDA)
Dim lig&: Application.ScreenUpdating = 0: FL02_BDA.Select
If b Then 'Si b alors lig = LgArt.
lig = LgArt
Else
'Si le cbCtgÀModif est vide, c'est que l'utilisateur n'a pas saisi de code à modifier : on place le focus sur le contrôle cbCtgÀmodifier puis on quitte le sub
If cbCtgÀModif = "" Then cbCtgÀModif.SetFocus: Exit Sub
If cbCodJour = "" Then cbCodJour.SetFocus: Exit Sub
If cbCodCAM = "" Then cbCodCAM.SetFocus: Exit Sub
'On active la feuille BD articles et plus spécialement le tableau TArtMenu
With ActiveSheet.ListObjects("TArtMenu")
'Instruction suivante à expliquer
.ListRows.Add: lig = .ListRows.Count + 2
End With
'Dans la feuille active (BD articles), le programme se place dans une ligne vide et, dans cette ligne vide va dans la deuxième colonne (Lig, 2), ici colonne B.
With Cells(lig, 2)
'Les renseignements saisis dans les deux formulaires (UF01_CtgArt et UF02_ArtMenu) vont être transférés dans la feuille BD articles, dans les colonnes correspondantes.
.Value = lbCodCtg2 'B : CC = Code catégorie
.Offset(, 1) = lbNomCtg2 'C : Nom catégorie
.Offset(, 3) = lbCodArt2 'E : CA = Code article
.Offset(, 4) = lbNomArt2 'F : Nom article
.Offset(, 9) = dpDateCréation 'K : Date création
.Offset(, 10) = lbNumCréation2 'L : N° création
End With
End If
With Cells(lig, 2)
.Offset(, 2) = cbCtgÀModif 'D : Catégorie à modifier
.Offset(, 5) = cbCodJour 'G : CJ = Code jours
.Offset(, 6) = lbNomJour2 'H : Nom jours
.Offset(, 7) = cbCodCAM 'I : CK = Code conditionnement
.Offset(, 8) = lbNomCAM2 'J : Nom conditionnement
End With
'Voir plus haut l'explication des deux points. Que représente FX ?
Call TriTArtMenu: FX.Select: Unload Me
End Sub

Private Sub cmdAnnuler_Click()
Unload Me 'Fermer le formulaire
End Sub

Private Sub cmdSuppr_Click()
If MsgBox("Souhaitez-vous supprimer l'article ?", vbYesNo) = vbNo Then Exit Sub
Application.ScreenUpdating = 0: FL02_BDA.Rows(LgArt).EntireRow.Delete: Unload Me
End Sub

Private Sub SearchCtgArt() 'À quoi sert cette procédure ?
Dim n&, i&: b = 0
With Range("TArtMenu")
n = .Rows.Count
For i = 1 To n
With .Cells(i, 1)
If .Value = CodCtg Then 'même Code catégorie
If .Offset(, 3) = CodArt Then 'même Code article
cbCtgÀModif = .Offset(, 2) 'Catégorie à modifier
cbCodJour = .Offset(, 5) 'CJ : Code jour
lbNomJour2 = .Offset(, 6) 'Nom jour
cbCodCAM = .Offset(, 7) 'CK : Code conditionnement
lbNomCAM2 = .Offset(, 8) 'Nom conditionnement
LgArt = i + 2: b = -1: Exit For
End If
End If
End With
Next i
End With
End Sub

Private Sub UserForm_Initialize() 'Procédure à expliquer
Dim DC As Date: Set FX = ActiveSheet
lbCodCtg2 = CodCtg: lbNomCtg2 = NomCtg
lbCodArt2 = CodArt: lbNomArt2 = NomArt: cbCodJour.List = Range("LJO[CJ]").Value
cbCodCAM.List = Range("LCO[CK]").Value: SearchCtgArt: cmdSuppr.Enabled = b
With FL02_BDA
If b Then
DC = .Cells(LgArt, 11): lbNumCréation2 = .Cells(LgArt, 12)
Else
DC = Date: lbNumCréation2 = Application.CountIf(.Columns(2), CodCtg) + 1
End If
End With
dpDateCréation = Format(DC, "d mmmm yyyy")
cbCtgÀModif.List = Array("Non", "Oui")
End Sub

J'ai regardé caractères de type mais cela ne m'a vraiment pas aidé. Voir la capture d'écran dans le fichier joint.

Si j'ai bien compris le fonctionnement de ton programme, le code de la feuille Accueil est devenu inutile. Oui. Non
Bonjour SOAN,
Quand vas-tu revenir. J'ai un problème. D'avance merci.
 

soan

XLDnaute Barbatruc
Bonjour Christian,

Si j'ai bien compris le fonctionnement de ton programme, le code de la feuille Accueil est devenu inutile.

oui, tu peux supprimer tout le code VBA du module de la feuille Accueil.



J'ai regardé caractères de type mais cela ne m'a vraiment pas aidé. Voir la capture d'écran dans le fichier joint.

effectivement, ça n'est pas dans la liste de ta copie d'écran ; comme je ne le trouve plus dans l'aide VBA, j'ai fait une recherche sur le net, et voilà :​

Image.jpg






commentaires pour UF02_ArtMenu

LgArt est mon abréviation de LigneArticle ; c'est donc le n° de ligne pour un article

b est une variable booléenne qui est True (idem que -1) ou False (idem que 0)

même si tu ne comprends pas bien à quoi vont servir ces 2 variables, ne t'en inquiètes pas : j'en parlerai plus bas, quand le bon moment sera venu. :) mais note quand même que ce ne sont pas des variables locales à une procédure (sub) ; ce sont des variables globales, de niveau module, qui sont donc accessibles par toutes les subs de ce module ➯ si j'ai déclaré ces variables en global, ça signifie qu'au moins deux subs auront besoin de connaître la valeur de ces variables globales même si l'exécution de l'une d'elles s'est terminée ; il y a même une autre façon de le dire : la valeur de ces variables globales doit être connue entre 2 appels de procédures (entre 2 subs ; rappel : sub est l'abréviation de « subroutine » ; en français : « procédure »).


oh la ! attention ! tu as écrit : « dim n% (identique à dim n% as Integer) »

non, c'est pas les deux en même temps ! donc pas à la fois % et Integer !
tu dois l'écrire comme ceci : « dim n% (identique à dim n as Integer) »

d'ailleurs, si tu fais l'essai de mettre les 2 en même temps, la compilation bloque dessus ! et même si la compilation ne bloquait pas, ça ne servirait à rien des mettre les deux puisque l'un ou l'autre suffit !​



If n = -1 Then lbNomJour2 = "" Else lbNomJour2 = Range("LJO[NJ]").Item(n + 1)

si n = -1, ça signifie qu'y'a aucun item sélectionné dans la liste déroulante du Code jour ; et dans ce cas, on efface Nom jour (la 1ère case verte) ; sinon, c'est que l'utilisateur a sélectionné un item de la liste déroulante Code jour, donc on affiche le Nom jour correspondant dans la 1ère case verte.



sub cmdValider_Click()

rappel TRÈS important : AVANT d'exécuter cette sub, une recherche de l'article a forcément été effectuée par la sub SearchCtgArt() ; suite à cette recherche : a) b = 0 (False) ➯ article non trouvé ou b = -1 (True)article trouvé ; b) si l'article a été trouvé, LgArt contient le de ligne de l'article trouvé, ce étant un n° de ligne de la feuille de calcul, et non pas un n° de ligne du tableau structuré ; exemple : dans le tableau, LMR est sur la ligne n° 5 de TArtMenu ; mais si c'est cet article qui a été cherché et trouvé, lig sera 7 et pas 5, car LMR est sur la ligne n° 7 de la feuille de calcul ; j'ai simplifié un peu, car en fait, la recherche ne se fait pas uniquement sur le Code catégorie mais aussi sur le Code article ; donc pour que l'article mentionné soit trouvé, c'est à la fois pour LMR et LMR05.

Dim lig& : attention : lig sera le n° de la ligne où on va écrire les infos de l'article sur la feuille "BD articles" ; pour un article qui a été trouvé par la recherche (même Code catégorie et même Code article), lig sera le de ligne de cet article trouvé ; par contre, si l'article n'a pas été trouvé par la recherche, c'est où on va ajouter une ligne au tableau structuré TArtMenu (juste sous la dernière ligne déjà utilisée du tableau), et lig sera le de cette ligne ajoutée ➯ cette sub fait la Modif ou l'Ajout d'un article.

Application.ScreenUpdating = 0 : idem que Application.ScreenUpdating = False = désactivation de la mise à jour de l'écran ➯ exécution plus rapide​

FL02_BDA.Select : on sélectionne la feuille "BD articles"



VB:
  If b Then
    lig = LgArt
  Else
    '...
  End If
pour l'instant, ne t'occupe pas de la partie Else ; regarde seulement la partie en haut :
If b Then : idem que If b = True Then
donc si l'article a été trouvé par la recherche : lig = LgArt
➯ c'est sur la ligne de l'article qu'on va écrire ➯ c'est ça
qui va réaliser l'opération de modification d'un article.​



VB:
  If b Then
    '...
  Else
    If cbCtgÀModif = "" Then cbCtgÀModif.SetFocus: Exit Sub
    If cbCodJour = "" Then cbCodJour.SetFocus: Exit Sub
    If cbCodCAM = "" Then cbCodCAM.SetFocus: Exit Sub
    With ActiveSheet.ListObjects("TArtMenu")
      .ListRows.Add: lig = .ListRows.Count + 2
    End With
    With Cells(lig, 2)
      .Value = lbCodCtg2              'B : CC = Code catégorie
      .Offset(, 1) = lbNomCtg2        'C : Nom catégorie
      .Offset(, 3) = lbCodArt2        'E : CA = Code article
      .Offset(, 4) = lbNomArt2        'F : Nom article
      .Offset(, 9) = dpDateCréation   'K : Date création
      .Offset(, 10) = lbNumCréation2  'L : N° création
    End With
  End If
maint'nant, on va s'occuper uniquement de la partie du Else, qui correspond à If b = False, donc : si l'article n'a pas été trouvé par la recherche ➯ si c'est un nouvel article ➯ c'est ça qui va réaliser l'opération d'Ajout d'un article.



VB:
    If cbCtgÀModif = "" Then cbCtgÀModif.SetFocus: Exit Sub
    If cbCodJour = "" Then cbCodJour.SetFocus: Exit Sub
    If cbCodCAM = "" Then cbCodCAM.SetFocus: Exit Sub

d'abord, on fait 3 contrôles successifs ; c'est pour chacun de ces contrôles : cbCtgÀModif ; cbCodJour ; cbCodCAM (Catégorie à modifier ; Code jour ; Code CAM) ; si le champ est vide : on met le focus dessus (car l'utilisateur devra sélectionner un item de la liste déroulante) ; puis on quitte la sub (sans rien faire d'autre, donc sans écriture d'un article) ; en effet, quand on veut écrire un nouvel article, il faut au minimum ces 3 champs : Catégorie à modifier ; Code jour ; Code CAM.​



VB:
    With ActiveSheet.ListObjects("TArtMenu")
      .ListRows.Add: lig = .ListRows.Count + 2
    End With
ajout d'une ligne en fin du tableau structuré ; lig = nombre de lignes du tableau ... +2 car la 1ère ligne de données du tableau est la ligne 3 : y'a 2 lignes au-dessus !​



VB:
    With Cells(lig, 2)
      .Value = lbCodCtg2              'B : CC = Code catégorie
      .Offset(, 1) = lbNomCtg2        'C : Nom catégorie
      .Offset(, 3) = lbCodArt2        'E : CA = Code article
      .Offset(, 4) = lbNomArt2        'F : Nom article
      .Offset(, 9) = dpDateCréation   'K : Date création
      .Offset(, 10) = lbNumCréation2  'L : N° création
    End With
on écrit sur la feuille de calcul les données du formulaire (celles qui sont indiquées en commentaire) ; ne pas perdre de vue qu'on écrit ces données-là uniquement lors de l'ajout d'un nouvel article, et donc pas pour la modif d'un article.​



VB:
    .Offset(, 2) = cbCtgÀModif        'D : Catégorie à modifier
    .Offset(, 5) = cbCodJour          'G : CJ = Code jours
    .Offset(, 6) = lbNomJour2         'H : Nom jours
    .Offset(, 7) = cbCodCAM           'I : CK = Code conditionnement
    .Offset(, 8) = lbNomCAM2          'J : Nom conditionnement
on écrit sur la feuille de calcul les données du formulaire (celles qui sont indiquées en commentaire) ; ne pas perdre de vue qu'on écrit ces données-là lors de l'ajout d'un nouvel article, OU lors de la modif d'un article.​



VB:
  Call TriTArtMenu: FX.Select: Unload Me

appel de la sub TriTArtMenu() (qui était déjà bien commentée) ; sélection de la feuille FX (c'était la feuille active au moment de l'ouverture du UserForm ; voir l'initialisation du formulaire) ; fermeture du formulaire​



sub SearchCtgArt()

tu as demandé : « à quoi sert cette procédure ? »

à rechercher dans le tableau structuré "TArtMenu" l'article dont tu as saisi dans le formulaire "CtgArt" le Code catégorie et le Code article ; à la sortie de cette sub, ça sera comme je l'ai déjà décrit bien plus haut, dans le « rappel » de la sub cmdValider_Click() ; pour t'éviter de remonter très haut pour le relire, voici un simple copier / coller (un peu adapté) du paragraphe en question :

rappel TRÈS important : AVANT d'exécuter la sub cmdValider_Click(), une recherche de l'article est d'abord faite par la sub SearchCtgArt() ci-dessous ; suite à cette recherche : a) b = 0 (False) ➯ article non trouvé ou b = -1 (True)article trouvé ; b) si l'article a été trouvé, LgArt contient le de ligne de l'article trouvé, ce étant un n° de ligne de la feuille de calcul, et non pas un n° de ligne du tableau structuré ; exemple : dans le tableau, LMR est sur la ligne n° 5 de TArtMenu ; mais si c'est cet article qui a été cherché et trouvé, lig sera 7 et pas 5, car LMR est sur la ligne n° 7 de la feuille de calcul ; j'ai simplifié un peu, car en fait, la recherche ne se fait pas uniquement sur le Code catégorie mais aussi sur le Code article ; donc pour que l'article mentionné soit trouvé, c'est à la fois pour LMR et LMR05.

la sub est déjà bien commentée ➯ je précise juste qu'en début de sub, je mets b à 0 car c'est une variable globale, dont l'initialisation n'est pas faite automatiquement (comme c'est le cas pour les variables locales) ; comme b vaut 0, ça signifie que d'emblée, je pré-suppose que l'article est non trouvé ; on va faire la recherche dans la boucle For .. Next et c'est seulement si on trouve l'article (selon les 2 codes catégorie et article) qu'on mettra -1 dans b (idem que : b = True) et dans la variable LgArt le de ligne (par rapport à la feuille de calcul et non pas par rapport au tableau structuré ; d'où : i + 2).​

VB:
Private Sub SearchCtgArt()
  Dim n&, i&: b = 0
  With Range("TArtMenu")
    n = .Rows.Count
    For i = 1 To n
      With .Cells(i, 1)
        If .Value = CodCtg Then 'même Code catégorie
          If .Offset(, 3) = CodArt Then 'même Code article
            cbCtgÀModif = .Offset(, 2)  'Catégorie à modifier
            cbCodJour = .Offset(, 5)    'CJ : Code jour
            lbNomJour2 = .Offset(, 6)   'Nom jour
            cbCodCAM = .Offset(, 7)     'CK : Code conditionnement
            lbNomCAM2 = .Offset(, 8)    'Nom conditionnement
            LgArt = i + 2: b = -1: Exit For
          End If
        End If
      End With
    Next i
  End With
End Sub



sub UserForm_Initialize()

c'est cette sub qui est exécutée en premier, dès l'ouverture du formulaire.
VB:
Private Sub UserForm_Initialize()
  Dim DC As Date: Set FX = ActiveSheet
  lbCodCtg2 = CodCtg: lbNomCtg2 = NomCtg
  lbCodArt2 = CodArt: lbNomArt2 = NomArt: cbCodJour.List = Range("LJO[CJ]").Value
  cbCodCAM.List = Range("LCO[CK]").Value: SearchCtgArt: cmdSuppr.Enabled = b
  With FL02_BDA
    If b Then
      DC = .Cells(LgArt, 11): lbNumCréation2 = .Cells(LgArt, 12)
    Else
      DC = Date: lbNumCréation2 = Application.CountIf(.Columns(2), CodCtg) + 1
    End If
  End With
  dpDateCréation = Format(DC, "d mmmm yyyy")
  cbCtgÀModif.List = Array("Non", "Oui")
End Sub

Set FX = ActiveSheet : la variable FX (Feuille X) contient la référence de la feuille active ; ça permettra de retourner sur cette feuille à la fin de la sub cmdValider_Click() ; car ne pas oublier que le lancement de UF01_CtgArt (qui va ensuite lancer UF02_ArtMenu) peut se faire depuis n'importe quelle feuille via le raccourci clavier Ctrl e ; et pas seulement depuis le bouton "Article menu" de la feuille "Accueil" ; or Ctrl e est très pratique pour lancer UF01_CtgArt depuis la feuille "BD articles" ! (car on voit TArtMenu en arrière-plan) ; je recommande donc de laisser ce raccourci clavier, et de ne pas le supprimer !

ensuite, je mets dans les « cases » adéquates du formulaire les 4 données qui sont reprises de UF01_CtgArt ; le reste, c'est le remplissage de listes de type ComboBox, et mettre ce qu'il faut pour la Date de création et le N° de création.​

soan
 
Dernière édition:

soan

XLDnaute Barbatruc
@Christian

complément à mon post précédent

attention :
dans l'aide VBA sur les caractères de type, ils ont mit que @ est pour Décimal alors qu'en fait c'est pour le type Currency (Monétaire) ; donc je note ceci :

Const W@ = 37.5 : idem que : Const W As Currency = 37.5

Dim W@ : idem que : Dim W As Currency



rappel du type Currency (tiré de l'Aide VBA de Microsoft) :

Image.jpg

soan
 

BUDGETS

XLDnaute Impliqué
Bonjour Christian,



oui, tu peux supprimer tout le code VBA du module de la feuille Accueil.





effectivement, ça n'est pas dans la liste de ta copie d'écran ; comme je ne le trouve plus dans l'aide VBA, j'ai fait une recherche sur le net, et voilà :​

Regarde la pièce jointe 1110578





commentaires pour UF02_ArtMenu

LgArt est mon abréviation de LigneArticle ; c'est donc le n° de ligne pour un article

b est une variable booléenne qui est True (idem que -1) ou False (idem que 0)

même si tu ne comprends pas bien à quoi vont servir ces 2 variables, ne t'en inquiètes pas : j'en parlerai plus bas, quand le bon moment sera venu. :) mais note quand même que ce ne sont pas des variables locales à une procédure (sub) ; ce sont des variables globales, de niveau module, qui sont donc accessibles par toutes les subs de ce module ➯ si j'ai déclaré ces variables en global, ça signifie qu'au moins deux subs auront besoin de connaître la valeur de ces variables globales même si l'exécution de l'une d'elles s'est terminée ; il y a même une autre façon de le dire : la valeur de ces variables globales doit être connue entre 2 appels de procédures (entre 2 subs ; rappel : sub est l'abréviation de « subroutine » ; traduction française : « procédure »).


oh la ! attention ! tu as écrit : « dim n% (identique à dim n% as Integer) »

non, c'est pas les deux en même temps ! donc pas à la fois % et Integer !
tu dois l'écrire comme ceci : « dim n% (identique à dim n as Integer) »

d'ailleurs, si tu fais l'essai de mettre les 2 en même temps, la compilation bloque dessus ! et même si la compilation ne bloquait pas, ça ne servirait à rien des mettre les deux puisque l'un ou l'autre suffit !​



If n = -1 Then lbNomJour2 = "" Else lbNomJour2 = Range("LJO[NJ]").Item(n + 1)

si n = -1, ça signifie qu'y'a aucun item sélectionné dans la liste déroulante du Code jour ; et dans ce cas, on efface Nom jour (la 1ère case verte) ; sinon, c'est que l'utilisateur a sélectionné un item de la liste déroulante Code jour, donc on affiche le Nom jour correspondant dans la 1ère case verte.



sub cmdValider_Click()

rappel TRÈS important : AVANT d'exécuter cette sub, une recherche de l'article a forcément été effectuée par la sub SearchCtgArt() ; suite à cette recherche : a) b = 0 (False) ➯ article non trouvé ou b = -1 (True)article trouvé ; b) si l'article a été trouvé, LgArt contient le de ligne de l'article trouvé, ce étant un n° de ligne de la feuille de calcul, et non pas un n° de ligne du tableau structuré ; exemple : dans le tableau, LMR est sur la ligne n° 5 de TArtMenu ; mais si c'est cet article qui a été cherché et trouvé, lig sera 7 et pas 5, car LMR est sur la ligne n° 7 de la feuille de calcul ; j'ai simplifié un peu, car en fait, la recherche ne se fait pas uniquement sur le Code catégorie mais aussi sur le Code article ; donc pour que l'article mentionné soit trouvé, c'est à la fois pour LMR et LMR05.

Dim lig& : attention : lig sera le n° de la ligne où on va écrire les infos de l'article sur la feuille "BD articles" ; pour un article qui a été trouvé par la recherche (même Code catégorie et même Code article), lig sera le de ligne de cet article trouvé ; par contre, si l'article n'a pas été trouvé par la recherche, c'est où on va ajouter une ligne au tableau structuré TArtMenu (juste sous la dernière ligne déjà utilisée du tableau), et lig sera le de cette ligne ajoutée ➯ cette sub fait la Modif ou l'Ajout d'un article.

Application.ScreenUpdating = 0 : idem que Application.ScreenUpdating =False = désactivation de la mise à jour de l'écran ➯ exécution plus rapide​

FL02_BDA.Select : on sélectionne la feuille "BD articles"



VB:
  If b Then
    lig = LgArt
  Else
    '...
  End If
pour l'instant, ne t'occupe pas de la partie Else ; regarde seulement la partie en haut :
If b Then : idem que If b = True Then
donc si l'article a été trouvé par la recherche : lig = LgArt
➯ c'est sur la ligne de l'article qu'on va écrire ➯ c'est ça
qui va réaliser l'opération de modification d'un article.​



VB:
  If b Then
    '...
  Else
    If cbCtgÀModif = "" Then cbCtgÀModif.SetFocus: Exit Sub
    If cbCodJour = "" Then cbCodJour.SetFocus: Exit Sub
    If cbCodCAM = "" Then cbCodCAM.SetFocus: Exit Sub
    With ActiveSheet.ListObjects("TArtMenu")
      .ListRows.Add: lig = .ListRows.Count + 2
    End With
    With Cells(lig, 2)
      .Value = lbCodCtg2              'B : CC = Code catégorie
      .Offset(, 1) = lbNomCtg2        'C : Nom catégorie
      .Offset(, 3) = lbCodArt2        'E : CA = Code article
      .Offset(, 4) = lbNomArt2        'F : Nom article
      .Offset(, 9) = dpDateCréation   'K : Date création
      .Offset(, 10) = lbNumCréation2  'L : N° création
    End With
  End If
maint'nant, on va s'occuper uniquement de la partie du Else, qui correspond à If b = False, donc : si l'article n'a pas été trouvé par la recherche ➯ si c'est un nouvel article ➯ c'est ça qui va réaliser l'opération d'Ajout d'un article.



VB:
    If cbCtgÀModif = "" Then cbCtgÀModif.SetFocus: Exit Sub
    If cbCodJour = "" Then cbCodJour.SetFocus: Exit Sub
    If cbCodCAM = "" Then cbCodCAM.SetFocus: Exit Sub

d'abord, on fait 3 contrôles successifs ; c'est pour chacun de ces contrôles : cbCtgÀModif ; cbCodJour ; cbCodCAM (Catégorie à modifier ; Code jour ; Code CAM) ; si le champ est vide : on met le focus dessus (car l'utilisateur devra sélectionner un item de la liste déroulante) ; puis on quitte la sub (sans rien faire d'autre, donc sans écriture d'un article) ; en effet, quand on veut écrire un nouvel article, il faut au minimum ces 3 champs : Catégorie à modifier ; Code jour ; Code CAM.​



VB:
    With ActiveSheet.ListObjects("TArtMenu")
      .ListRows.Add: lig = .ListRows.Count + 2
    End With
ajout d'une ligne en fin du tableau structuré ; lig = nombre de lignes du tableau ... +2 car la 1ère ligne de données du tableau est la ligne 3 : y'a 2 lignes au-dessus !​



VB:
    With Cells(lig, 2)
      .Value = lbCodCtg2              'B : CC = Code catégorie
      .Offset(, 1) = lbNomCtg2        'C : Nom catégorie
      .Offset(, 3) = lbCodArt2        'E : CA = Code article
      .Offset(, 4) = lbNomArt2        'F : Nom article
      .Offset(, 9) = dpDateCréation   'K : Date création
      .Offset(, 10) = lbNumCréation2  'L : N° création
    End With
on écrit sur la feuille de calcul les données du formulaire (celles qui sont indiquées en commentaire) ; ne pas perdre de vue qu'on écrit ces données-là uniquement lors de l'ajout d'un nouvel article, et donc pas pour la modif d'un article.​



VB:
    .Offset(, 2) = cbCtgÀModif        'D : Catégorie à modifier
    .Offset(, 5) = cbCodJour          'G : CJ = Code jours
    .Offset(, 6) = lbNomJour2         'H : Nom jours
    .Offset(, 7) = cbCodCAM           'I : CK = Code conditionnement
    .Offset(, 8) = lbNomCAM2          'J : Nom conditionnement
on écrit sur la feuille de calcul les données du formulaire (celles qui sont indiquées en commentaire) ; ne pas perdre de vue qu'on écrit ces données-là lors de l'ajout d'un nouvel article, OU lors de la modif d'un article.​



VB:
  Call TriTArtMenu: FX.Select: Unload Me

appel de la sub TriTArtMenu() (qui était déjà bien commentée) ; sélection de la feuille FX (c'était la feuille active au moment de l'ouverture du UserForm ; voir l'initialisation du formulaire) ; fermeture du formulaire​



sub SearchCtgArt()

tu as demandé : « à quoi sert cette procédure ? »

à rechercher dans le tableau structuré "TArtMenu" l'article dont tu as saisi dans le formulaire "CtgArt" le Code catégorie et le Code article ; à la sortie de cette sub, ça sera comme je l'ai déjà décrit bien plus haut, dans le « rappel » de la sub cmdValider_Click() ; pour t'éviter de remonter très haut pour le relire, voici un simple copier / coller (un peu adapté) du paragraphe en question :

rappel TRÈS important : AVANT d'exécuter la sub cmdValider_Click(), une recherche de l'article est d'abord faite par la sub SearchCtgArt() ci-dessous ; suite à cette recherche : a) b = 0 (False) ➯ article non trouvé ou b = -1 (True)article trouvé ; b) si l'article a été trouvé, LgArt contient le de ligne de l'article trouvé, ce étant un n° de ligne de la feuille de calcul, et non pas un n° de ligne du tableau structuré ; exemple : dans le tableau, LMR est sur la ligne n° 5 de TArtMenu ; mais si c'est cet article qui a été cherché et trouvé, lig sera 7 et pas 5, car LMR est sur la ligne n° 7 de la feuille de calcul ; j'ai simplifié un peu, car en fait, la recherche ne se fait pas uniquement sur le Code catégorie mais aussi sur le Code article ; donc pour que l'article mentionné soit trouvé, c'est à la fois pour LMR et LMR05.

la sub est déjà bien commentée ➯ je précise juste qu'en début de sub, je mets b à 0 car c'est une variable globale, dont l'initialisation n'est pas faite automatiquement (comme c'est le cas pour les variables locales) ; comme b vaut 0, ça signifie que d'emblée, je pré-suppose que l'article est non trouvé ; on va faire la recherche dans la boucle For .. Next et c'est seulement si on trouve l'article (selon les 2 codes Catégorie et Nom) qu'on mettra -1 dans b (idem que : b = True) et dans la variable LgArt le de ligne (par rapport à la feuille de calcul et non pas par rapport au tableau structuré ; d'où : i + 2).​

VB:
Private Sub SearchCtgArt()
  Dim n&, i&: b = 0
  With Range("TArtMenu")
    n = .Rows.Count
    For i = 1 To n
      With .Cells(i, 1)
        If .Value = CodCtg Then 'même Code catégorie
          If .Offset(, 3) = CodArt Then 'même Code article
            cbCtgÀModif = .Offset(, 2)  'Catégorie à modifier
            cbCodJour = .Offset(, 5)    'CJ : Code jour
            lbNomJour2 = .Offset(, 6)   'Nom jour
            cbCodCAM = .Offset(, 7)     'CK : Code conditionnement
            lbNomCAM2 = .Offset(, 8)    'Nom conditionnement
            LgArt = i + 2: b = -1: Exit For
          End If
        End If
      End With
    Next i
  End With
End Sub



sub UserForm_Initialize()

c'est cette sub qui est exécutée en premier, dès l'ouverture du formulaire.
VB:
Private Sub UserForm_Initialize()
  Dim DC As Date: Set FX = ActiveSheet
  lbCodCtg2 = CodCtg: lbNomCtg2 = NomCtg
  lbCodArt2 = CodArt: lbNomArt2 = NomArt: cbCodJour.List = Range("LJO[CJ]").Value
  cbCodCAM.List = Range("LCO[CK]").Value: SearchCtgArt: cmdSuppr.Enabled = b
  With FL02_BDA
    If b Then
      DC = .Cells(LgArt, 11): lbNumCréation2 = .Cells(LgArt, 12)
    Else
      DC = Date: lbNumCréation2 = Application.CountIf(.Columns(2), CodCtg) + 1
    End If
  End With
  dpDateCréation = Format(DC, "d mmmm yyyy")
  cbCtgÀModif.List = Array("Non", "Oui")
End Sub

Set FX = ActiveSheet : la variable FX (Feuille X) contient la référence de la feuille active ; ça permettra de retourner sur cette feuille à la fin de la sub cmdValider_Click() ; car ne pas oublier que le lancement de UF01_CtgArt (qui va ensuite lancer UF02_ArtMenu) peut se faire depuis n'importe quelle feuille via le raccourci clavier Ctrl e ; et pas seulement depuis le bouton "Article menu" de la feuille "Accueil" ; or Ctrl e est très pratique pour lancer UF01_CtgArt depuis la feuille "BD articles" ! (car on voit TArtMenu en arrière-plan) ; je recommande donc de laisser ce raccourci clavier, et de ne pas le supprimer !

ensuite, je mets dans les « cases » adéquates du formulaire les 4 données qui sont reprises de UF01_CtgArt ; le reste, c'est le remplissage de listes de type ComboBox, et mettre ce qu'il faut pour la Date de création et le N° de création.​

soan
Bonjour SOAN,

Merci pour ton message. Tes commentaires sont-ils terminés ? Si non, j'attends ton prochain message. Si oui, alors, il se peut que j'ai encore des questions à te poser. J'ai imprimé tes deux derniers messages, ce sera plus facile pour moi de m'y reporter. J'ai ouvert une chemise Dossier SOAN dans laquelle il y a des sous chemises nommées du nom des modules, de userformes, etc. Là, tu as répondu par l'intermédiaire du site car j'ai la mention Joindre un fichier.
Sans vouloir te vexer, te contrarier, loin de moi cette idée-là, sois en sûr, je voudrais savoir si tu accepterais de lire les commentaires d'un programme par formulaires dont tu n'es pas l'auteur et, éventuellement de les modifier et ou de les remplacer ou de les réécrire ? D'avance merci.
 

soan

XLDnaute Barbatruc
Bonjour Christian,

Tes commentaires sont-ils terminés ? Si non, j'attends ton prochain message. Si oui, alors, il se peut que j'ai encore des questions à te poser. J'ai imprimé tes deux derniers messages, ce sera plus facile pour moi de m'y reporter.​

oui, mes commentaires sont terminés ; et oui, si tu auras d'autres questions, j'y répondrai ... si je connais la réponse. 😜 c'est une très bonne idée d'imprimer mes messages, pour pouvoir t'y reporter quand tu travailles sur Excel.​



j'continuerai à t'aider, si j'en ai le temps ; au cas où ça sera kek'chose que j'sais pas faire, t'inquiètes pas : y'aura sûrement un autre contributeur qui pourra t'apporter la bonne réponse !​



« Là, tu as répondu par l'intermédiaire du site car j'ai la mention Joindre un fichier. »

exact, c'est bien ça ! 👍 🙂



Sans vouloir te vexer, te contrarier, loin de moi cette idée-là, sois en sûr, je voudrais savoir si tu accepterais de lire les commentaires d'un programme par formulaires dont tu n'es pas l'auteur et, éventuellement de les modifier et ou de les remplacer ou de les réécrire ?​

non, tu ne me vexe pas, mais désolé : je suis vraiment trop débordé en ce moment ! (j'ai un gros retard sur d'autres exos à rattraper + des affaires persos à régler)

soan
 
Dernière édition:

BUDGETS

XLDnaute Impliqué
Bonjour Christian,

citation de ton post #79 :



citation de ton post #66 :



oui, mes commentaires sont terminés. :) et oui, si tu auras d'autres questions, j'y répondrai ... si je connais la réponse. 😜 c'est une très bonne idée d'imprimer mes messages, pour pouvoir t'y reporter quand tu travailles sur Excel ; une suggestion : a) offre à ton ordinateur de la salle à manger un écran neuf plus large (à condition que ton pot de chambre pc de chambre n'en soit pas jaloux, sinon il risque de se mettre en grève, et de te réclamer des dommages et intérêts + autres indemnités) ; b) l'ancien écran plus petit de la salle à manger, sers-t-en comme 2ème écran (sur un des deux pc) pour surfer sur XLD et lire mes posts : ça te permettra d'éviter un gaspillage énorme de papier à cause de mes posts super longs ... mais c'est quand même bien obligé quand il faut faire un commentaire de tout un long code VBA réparti en plusieurs modules ! ainsi que lorsque je dois répondre à de nombreuses questions (les tiennes, ou celles d'autres membres du forum).

remarque : pour ce qui est d'avoir 2 écrans sur un même pc, je ne l'ai jamais essayé, donc je ne pourrai pas t'aider là-dessus ; mais j'avais lu un post d'un membre qui faisait ça ; l'ennui, c'est que j'me rappelle plus qui c'était ; peut-être David Aubert, quand il doit suivre d'un seul coup tout ce qui se passe sur ces 6 écrans ? 😜 écran n° 1 : pour modifier sa ressource "Euro 2021 Football" ; écran n° 2 : pour jouer à FIFA 21 et marquer un tir au but contre Aubert Junior (au grand dam de sa progéniture, qui lui a promis de ne pas bouder s'il perdait, et qui acceptera de faire la vaisselle tous les jours, jusqu'à-ce-que son père aie environ l'âge de Mathusalem) ; écran n° 3 (de sa super télé 4K Ultra HD) : pour regarder la Coupe du monde Euro 2021 ; écran n° 4 : pour suivre tout ce qui se passe sur le site XLD (surtout quand y'a des lumières clignotantes qui s'allument un peu partout, et malgré les sirènes hurlantes qui se sont mises à déchirer l'air de leurs vibrations sonores) ; écran n° 5 : pour papoter avec notre cher super modo Barbatruc et Membre du Staff Yeahou (surtout quand il se plaint que je lui envoie des posts trop courts ! ou trop longs, c'est selon son humeur du moment) ; écran n° 6 : pour suivre la vidéoconférence organisée par Jeff Sutton, le patron des installations de la Tour de contrôle de MIA (Miami International Airport), qui l'a prévenu qu'un Concorde (bientôt à court de carburant) est en difficulté pour se poser sur sa piste d'atterrissage et risque de se crasher ... oui, personne ne se doute que notre cher Administrateur du site XLD est aussi polyvalent ! (j'en suis moi-même littéralement époustouflé ! 😜) ; si un jour David se réincarnera dans un animal, je pense que ce sera dans une pieuvre, avec plein de tentacules, et au bout de chacun d'eux, au bout des petites ventouses, il y aura un téléphone pour continuer à papoter avec nous (tiens, quelque part, j'ai presque failli le confondre avec Donald Trump, l'ancien président des USA qui est hyper accro aux tweets !) ; à part ça, je crois que ces autres membres utilisent seulement 2 écrans (car ils ne sont pas aussi polyvalents que le Chef, loin s'en faut ! mais peut-être que ça viendra plus tard ?) : job75 ; patricktoulon ; BrunoM45 ; mapomme ; sylvanu (salut à tous)





ah ? tu as mis des sous de côté pour moi ? comme c'est gentil tout plein ! 🤑 🤑 🤑



aïe ! zut ! j'viens d'voir la suite de la phrase, qui était sur la ligne d'après ! 😭 bon ben tant pis, hein ? j'me disais bien aussi ! c'était trop beau pour être vrai ! 😢 mébon, c'est pas grave : t'inquiètes pas, j'continuerai quand même à t'aider, si j'en ai le temps ! 🙂 et au cas où ça sera kek'chose que j'sais pas faire, t'inquiètes pas non plus : y'aura sûrement un autre contributeur que moi qui pourra t'apporter la bonne réponse !​





exact, c'est bien ça ! 👍 🙂





non, tu ne me vexe pas, mais désolé : je suis vraiment trop débordé en ce moment ! (j'ai un gros retard sur d'autres exos à rattraper + des affaires persos à régler)

soan
Bonjour SOAN,

Je n'ai rien compris en ce qui concerne les deux écrans. Je n'ai rien demandé à ce sujet-là, d'ailleurs cela ne m'intéresse pas. Pour les commentaires, cela n'est pas urgent : je vais refaire le programme avec mes commentaires et quand il sera prêt, je te contacterai (fin juillet 2021, début août 2021). Pour ce qui est de l'écran de mon ordinateur de salle à manger, je ne peux pas le modifier, il est au maximum de sa capacité.
 

soan

XLDnaute Barbatruc
@Christian

Pour ce qui est de l'écran de mon ordinateur de salle à manger, je ne peux pas le modifier, il est au maximum de sa capacité.

je n'ai rien compris : c'est les capacités du PC qui peuvent arriver à saturation, pas celles de l'écran ! et je n'ai jamais proposé de modifier ton écran de la salle à manger ! j'ai seulement proposé de t'en servir comme 2ème écran après en avoir acheté un autre plus large !​



Je n'ai rien compris en ce qui concerne les deux écrans. Je n'ai rien demandé à ce sujet-là, d'ailleurs cela ne m'intéresse pas.

ok, donc j'ai retiré de mon post #80 tout ce qui concernait les écrans ; j'ai aussi fait d'autres modifs de ce post : il est beaucoup abrégé, maintenant ; juste pour info, je voulais simplement dire ceci : même si je ne sais pas comment le faire, tu peux utiliser 2 écrans sur un même PC ; moi j'en n'ai pas l'utilité, mais toi si ; car si tu mets un écran neuf et plus large pour ton pc de la salle à manger (que tu utiliseras par exemple pour Excel), alors l'ancien écran, au lieu de le « jeter », tu pourras t'en servir comme 2ème écran pour voir les posts sur XLD : imagine : écran de gauche : fichier Excel "MENUS7.xlsm" ; écran de droite : "Forum Excel" du site XLD ; avec une touche du clavier, tu pourras « passer d'un écran à l'autre », pour faire des manips sur Excel OU faire des choses sur le site XLD ; selon tes préférences, tu pourras même choisir pour quel pc mettre ton 2ème écran : soit à la salle à manger, soit dans ta chambre ; peut-être alors que tu seras intéressé ? si oui, tu devras demander l'aide d'un autre contributeur car moi, je ne t'en parlerai pas plus. :)



quand il sera prêt, je te contacterai (fin juillet 2021, début août 2021).

je ne peux jamais prévoir d'avance si je serai disponible ou non ; donc quand ça sera prêt, je te propose de poster ta demande sur "Forum Excel" ; si je serai disponible, et si j'aurai une réponse valable à te proposer, alors je te répondrai ; sinon, je suis sûr qu'un autre contributeur pourra t'aider. 🍀

soan
 
Dernière édition:

BUDGETS

XLDnaute Impliqué
@Christian



je n'ai rien compris : c'est les capacités du PC qui peuvent arriver à saturation, pas celles de l'écran ! et je n'ai jamais proposé de modifier ton écran de la salle à manger ! j'ai seulement proposé de t'en servir comme 2ème écran après en avoir acheté un autre plus large !​





ok, donc j'ai retiré de mon post #80 tout ce qui concernait les écrans ; j'ai aussi fait d'autres modifs de ce post : il est beaucoup abrégé, maintenant ; juste pour info, je voulais simplement dire ceci : même si je ne sais pas comment le faire, tu peux utiliser 2 écrans sur un même PC ; moi j'en n'ai pas l'utilité, mais toi si ; car si tu mets un écran neuf et plus large pour ton pc de la salle à manger (que tu utiliseras par exemple pour Excel), alors l'ancien écran, au lieu de le « jeter », tu pourras t'en servir comme 2ème écran pour voir les posts sur XLD : imagine : écran de gauche : fichier Excel "MENUS7.xlsm" ; écran de droite : "Forum Excel" du site XLD ; avec une touche du clavier, tu pourras « passer d'un écran à l'autre », pour faire des manips sur Excel OU faire des choses sur le site XLD ; selon tes préférences, tu pourras même choisir pour quel pc mettre ton 2ème écran : soit à la salle à manger, soit dans ta chambre ; peut-être alors que tu seras intéressé ? si oui, tu devras demander l'aide d'un autre contributeur car moi, je ne t'en parlerai pas plus. :)





je ne peux jamais prévoir d'avance si je serai disponible ou non ; donc quand ça sera prêt, je te propose de poster ta demande sur "Forum Excel" ; si je serai disponible, et si j'aurai une réponse valable à te proposer, alors je te répondrai ; sinon, je suis sûr qu'un autre contributeur pourra t'aider. 🍀

soan
Une question : d'après mes déductions, comme le nom de chaque tableau commence par L (pour liste), j'en conclus que le nom défini est alors automatiquement créé avec le nom du tableau. Dans le cas contraire, comment le créer ou comment est-il créé avec les bonnes informations d'ailleurs?
 
Dernière édition:

soan

XLDnaute Barbatruc
Bonjour Christian,

le nom défini est automatiquement créé avec le nom du tableau.

exact : c'est Tableau1, puis Tableau2, puis Tableau3, etc...



le nom de chaque tableau commence par L (pour liste)

c'est VRAI pour le fichier "MENUS7.xlsm", car les noms qui ont été choisis en remplacement pour tous les tableaux structurés des 3 feuilles de listes commencent tous par L ; mais c'était seulement une « commodité de repérage », pour que tu te rappelles plus facilement qu'il s'agit de Listes ; et ce n'est absolument pas une obligation ! si tu veux mettre par exemple P ou Z en initiale d'un nom, libre à toi ! :)
soan
 
Dernière édition:

BUDGETS

XLDnaute Impliqué
Bonjour Christian,



exact : c'est Tableau1, puis Tableau2, puis Tableau3, etc...

(non, le nom du 4ème tableau n'est pas « etc... », c'est : « Tableau4 »)

c'est préférable de ne pas laisser ce nom « choisi » automatiquement par défaut par Excel : c'est mieux de mettre à la place un nom plus explicite (comme tu sais déjà le faire) ; tu peux choisir le nom comme tu veux (sauf que quelques caractères seront peut-être interdits), et c'est pas obligé que la 1ère lettre du nom soit L ou T.

attention : il faut aussi éviter le piège de donner le même nom à plus d'un tableau structuré, sinon tu auras le message d'erreur « Nom ambigü » ! c'est dommage, hein ? Krosoft a oublié de faire en sorte qu'Excel puisse distinguer les sosies et les clones... 😭 mais ça sera fait dans une version ultérieure : Excel 3999 comportera un détecteur biologique d'ADN ultra-sophistiqué, qui lui permettra de ne plus risquer de confondre les quadruplés les plus célèbres de l'Ouest américain : je parle des 4 frères Dalton.





c'est à la fois VRAI et FAUX :

c'est FAUX, car comme indiqué ci-dessus, le nom mis automatiquement par défaut est Tableau1 (pour le 1er tableau structuré du classeur) ; or l'initiale est T, ce n'est pas L.

c'est VRAI pour le fichier "MENUS7.xlsm", car les noms qui ont été choisis en remplacement pour tous les tableaux structurés des 3 feuilles de listes commencent tous par L ; mais c'était seulement une « commodité de repérage », pour que tu te rappelles plus facilement qu'il s'agit de Listes ; et ce n'est absolument pas une obligation ! si tu veux mettre par exemple P ou Z en initiale d'un nom, libre à toi ! :) remarque : perso, je mets le L pour une Liste uniquement s'il y a un risque d'ambiguïté avec un autre nom ; sinon, s'il n'y a pas ce risque, je mets directement le nom de la Liste, et dans ce cas, l'initiale sera un L seulement si le nom de la liste hors commodité mentionnée plus haut commence par un L ; donc ce L nest pas l'initiale L de Liste.


exemple concret, pour le fichier "MENUS7.xlsm", feuille "LT01" :

* tableau structuré en D1:E22 : c'est le tableau des Desserts du Week-end ; donc pour cette Liste, on peut choisir le nom explicite DW ; mais vu ton classeur style "Usine à gaz", pour éviter un risque d'ambiguïté, j'ai préféré choisir le nom LDW, l'initiale L étant pour Liste ; mais c'est pas obligé ! si tu choisis par exemple l'initiale G, ça fera GDW, l'initiale G étant pour ... ? à toi de choisir : ça peut être le G de Gaston Lagaffe ! 😁 ben oui, désormais, c'est lui le cuistot qui va préparer tes repas ! sa spécialité : les crêpes flambées qui s'envolent comme des fusées ! 😂

* tableau structuré en G1:H18 : c'est le tableau des Légumes Midi Retraite ; donc pour cette Liste, on peut choisir le nom explicite LMR ; mais vu ton classeur style Gaston Lagaffe, pour éviter un risque d'ambiguïté, j'ai préféré choisir le nom LLMR, l'initiale L étant pour Liste ; et pas pour Légumes, car pour eux c'est le 2ème L ; et c'est pas obligé de choisir LLMR : tu peux mettre par exemple PLMR, le P n'étant pas pour Poireaux mais pour Prunelle ; non, je ne te parle pas de la prunelle de tes jolis yeux, mais de Prunelle, le meilleur ami de Gaston ; surtout quand il dit « RRROGNTUDJUÛÛ » ; oui, tu peux aussi donner ce nom-là à une de tes Listes, même s'il commence par un R, mais c'est tout de même mieux d'appeler un Modérateur : salut Yeahou, s'il-te-plaît, tu veux bien censurer le juron que j'ai mis dans ce paragraphe ? à ma décharge, M. le Juge, je précise quand même que c'est le juron de Prunelle, pas le mien ; comment ? tu demandes qui est le membre Prunelle ? ben, euh... c'est-à-dire... si tu relis tout ce paragraphe, tu te rendras compte que Prunelle et Gaston sont vraiment très copains ensemble ! 😜 à tous les lecteurs de ce post qui sont horrifiés par le juron de Prunelle : c'est inutile de cliquer sur le bouton « Signaler » pour appeler un Modérateur : je viens de le faire à l'instant ! promis, juré, craché, Prunelle ne recommencera plus ... jusqu'à la prochaine gaffe de notre ami Gaston. :rolleyes: nota bene : au début de ce paragraphe, quand j'ai parlé d'un classeur style "Gaston Lagaffe", je voulais bien évidemment parler d'un classeur style "Usine à gaz" : il semblerait que c'est tout à fait synonyme ; mais s'il faut appeler les pompiers et le SAMU quand Gaston Lagaffe fait sauter de simples crêpes flambées, je n'ose pas imaginer qui il faut appeler s'il fait sauter ton usine à gaz ! peut-être Lionel ? (salut Lionel)

bon, voici un petit cadeau pour Yeahou, pour m'excuser de l'avoir dérangé dans son travail :

Regarde la pièce jointe 1110783

oui, je crois que tu peux aussi censurer cette image ! 😁 😜

@Prunelle : tu m'avais pourtant promis que tu ne recommencerais plus !
alors dis-moi, qu'est-ce qu'IL a encore fait comme gaffe, CELUI-LÀ ?

NB : « IL » et « CELUI-LÀ », c'est Gaston Lagaffe, hein ? pas Yeahou ! 🙂

tu remarqueras, Yeahou, que conformément à ce que tu m'as dit en MP, j'ai évité de mettre
une image trop grande... SURTOUT dans ce cas bien particulier ! :rolleyes:

j'espère que ta décision de Juge sera juste, et que tu ne vas pas me bannir du site XLD
de façon inique à cause du juron de Prunelle ! ça reviendrait à m'imputer à moi soan
la faute que Prunelle a commise ! 😭 de plus, je me dégage de toute responsabilité
vis-à-vis des actes que peut commettre sur le site XLD notre ami Gaston Lagaffe !

petite question subsidiaire : euh... tu crois que David serait d'accord pour prendre
comme 2ème super modo Gaston Lagaffe ? seulement si le Chef de la compta
M. Boulier est d'accord ? 🤪 ok, no problem ! 😜

Franquin (c'est mon 2ème pseudo)
Bonjour SOAN,

et pour les noms définis : ma déduction, mon intuition sont-elles exactes ?
 

soan

XLDnaute Barbatruc
@Christian

pour les noms définis : ma déduction, mon intuition sont-elles exactes ?

je crois bien que tu parles de ceci :

d'après mes déductions, le nom défini est alors automatiquement créé avec le nom du tableau.​

si c'est bien ça, je t'y ai déjà répondu dans mon post #84 :

exact : c'est Tableau1, puis Tableau2, puis Tableau3, etc...

donc OUI, ta déduction, ton intuition, sont EXACTES. :)

soan
 
Dernière édition:

BUDGETS

XLDnaute Impliqué
@Christian



je crois bien que tu parles de ceci :



si c'est bien ça, je t'y ai déjà répondu dans mon post #84 :



donc OUI, ta déduction, ton intuition, sont EXACTES.:)

soan
Bonjour SOAN,

J'ai refait mon fichier à partir du tien (Menus7.xlsm). Pour l'instant, les procédures des UserForms UF01 et UF02 ne sont pas encore codifiées. Pour l'instant, merci de me signaler les éventuelles erreurs dans chacune des feuilles, tant dans la présentation que dans les commentaires (feuilles Accueil, LT01, LT02, LT02, BD articles). La fin des commentaires varie d'un tableau à l'autre, d'une feuille à l'autre. Pour BD articles, colonne CA, ne me signale pas d'erreur : j'ai fait cela afin de savoir où mes commentaires devaient débuter. Par la suite, le contenu actuel de cette colonne sera effacé, supprimé.
 

Pièces jointes

  • MENUS.xlsm
    56.6 KB · Affichages: 6

soan

XLDnaute Barbatruc
Bonsoir Christian,

J'ai refait mon fichier à partir du tien (Menus7.xlsm).

oui, c'est très bien : c'est à la fois un bon entraînement et un bon exercice ! 👍 🙂

cependant, le rôle d'un contributeur est seulement de t'aider ponctuellement quand tu rencontres un problème sur ton projet ; ce n'est pas de faire toute une application, ni pour vérifier chacune des étapes de ta progression, que ce soit pour le fichier de ta demande initiale, ou pour un nouveau fichier que tu veux refaire à partir du premier.

c'est pourquoi je n'ai pas téléchargé ton fichier ; si tu rencontre un problème (erreur de compilation ou erreur d'exécution), tu dois normalement arriver à le résoudre par toi-même à l'aide du 1er fichier, donc à partir de "MENUS7.xlsm" ; pour cela, tu dois trouver quelles sont les différences qui font que ça marche dans mon fichier, et pas dans le tien ; par exemple, c'est peut-être un nom défini que tu as oublié de mettre ? (comme c'était déjà arrivé pour le dernier bouton du menu de la feuille "Accueil") ; par contre, si tu rencontres un nouveau problème qu'on n'avait pas encore vu auparavant, je veux bien t'aider, dans les conditions habituelles : si j'ai une réponse valable à proposer, et si je suis disponible ; or actuellement, je suis encore débordé, donc je laisse le soin à un autre contributeur de t'aider.​

malgré ce que je viens d'écrire, j'ajoute ci-dessous une 2ème partie.



À propos des commentaires d'un code VBA

1) c'est mieux d'éviter de mettre un commentaire sur chaque ligne, car : « trop d'infos tue l'info ! »

par exemple, pour Dim lig& je ne mets aucun commentaire, car : a) je sais très bien que Dim est pour déclarer des variables ; description du mot-clé « Dim » dans l'aide VBA : « Déclare des variables et attribue de l'espace de stockage. » ; dans VBA, met ton curseur sur Dim (ou un autre mot-clé) et appuie sur la touche F1 : ça affichera l'Aide VBA de ce mot-clé, s'il existe ; si ce n'est pas un mot-clé VBA, ça affiche une fenêtre avec le texte : « Mot clé introuvable » ; b) le nom de ma variable lig est celui que j'utilise habituellement pour ligne (donc pour un de ligne) ; si j'ai besoin de 2 variables pour 2 numéros de ligne, j'utilise lg1 et lg2 (tu vois, je préfère mettre des noms courts et pas des noms à rallonge ! 😜) ; je ne mets pas non plus de commentaire pour le caractère de type « & », car je sais très bien que c'est idem que « As Long »

2) normalement, le but d'un commentaire n'est pas de dire ce que fait le mot-clé VBA ; par exemple, pour cette instruction :
Cells(lig, 2) = lbCodCtg2 'B : CC = Code catégorie

le commentaire n'est pas : « je mets le Caption du label lbCodCtg2 dans la cellule de la feuille de calcul dont la ligne est lig et la colonne est 2 = colonne B » ; je mets simplement celui qui est ci-dessus, pour indiquer qu'il s'agit du Code catégorie.

3) je comprends bien que tous les débutants en VBA ont très facilement tendance à tout commenter largement, et même de trop ! mais plutôt que d'écrire pour chaque instruction Dim du code VBA : « 'déclaration des variables » ; je suggère très fortement d'écrire cela une seule fois dans un cahier à part qui servira de référence VBA, puis de s'y reporter chaque fois que ça s'avérera nécessaire ; très gros avantage : ce système permet d'éviter de mettre le même commentaire pour chaque Dim du code VBA ; aussi bien pour les modules du projet en cours que pour les modules des autres projets VBA.

4) quand plus tard tu auras bien compris et assimilé que Dim est pour déclarer des variables, et que tu le sauras par cœur, tu pourras même abréger ta référence VBA, car toi-même tu te diras : « pourquoi continuer à garder ça puisque maint'nant je le sais par cœur ? donc autant le supprimer ➯ j'aurai moins de notes à compulser pour mes futures consultations de ma référence VBA »

5) pour ta propre référence VBA, j'ai parlé d'un cahier pour que ce soit « plus parlant », mais plutôt qu'un cahier avec des feuilles de papier, ce sera mieux d'écrire tes notes dans un fichier Word, que tu peux appeler par exemple "Ma référence VBA.docx" ou plus simplement "Notes VBA.docx" ; même si tu n'as pas 2 écrans sur un même PC, grâce aux capacités multitâches de Windows, tu peux facilement basculer d'une fenêtre Word (où il y a ton fichier "Ma référence VBA" ou "Notes VBA"), à une fenêtre Excel (où il y a ton classeur Excel).​

soan
 

BUDGETS

XLDnaute Impliqué
Bonsoir Christian,



oui, c'est très bien : c'est à la fois un bon entraînement et un bon exercice ! 👍 🙂

cependant, le rôle d'un contributeur est seulement de t'aider ponctuellement quand tu rencontres un problème sur ton projet ; ce n'est pas de faire toute une application, ni pour vérifier chacune des étapes de ta progression, que ce soit pour le fichier de ta demande initiale, ou pour un nouveau fichier que tu veux refaire à partir du premier.

c'est pourquoi je n'ai pas téléchargé ton fichier ; si tu rencontre un problème (erreur de compilation ou erreur d'exécution), tu dois normalement arriver à le résoudre par toi-même à l'aide du 1er fichier, donc à partir de "MENUS7.xlsm" ; pour cela, tu dois trouver quelles sont les différences qui font que ça marche dans mon fichier, et pas dans le tien ; par exemple, c'est peut-être un nom défini que tu as oublié de mettre ? (comme c'était déjà arrivé pour le dernier bouton du menu de la feuille "Accueil") ; par contre, si tu rencontres un nouveau problème qu'on n'avait pas encore vu auparavant, je veux bien t'aider, dans les conditions habituelles : si j'ai une réponse valable à proposer, et si je suis disponible ; or actuellement, je suis encore débordé, donc je laisse le soin à un autre contributeur de t'aider.​

malgré ce que je viens d'écrire, j'ajoute ci-dessous une 2ème partie.



À propos des commentaires d'un code VBA

1) c'est mieux d'éviter de mettre un commentaire sur chaque ligne, car : « trop d'infos tue l'info ! »

par exemple, pour Dim lig& je ne mets aucun commentaire, car : a) je sais très bien que Dim est pour déclarer des variables ; description du mot-clé « Dim » dans l'aide VBA : « Déclare des variables et attribue de l'espace de stockage. » ; dans VBA, met ton curseur sur Dim (ou un autre mot-clé) et appuie sur la touche F1 : ça affichera l'Aide VBA de ce mot-clé, s'il existe ; si ce n'est pas un mot-clé VBA, ça affiche une fenêtre avec le texte : « Mot clé introuvable » ; b) le nom de ma variable lig est celui que j'utilise habituellement pour ligne (donc pour un de ligne) ; si j'ai besoin de 2 variables pour 2 numéros de ligne, j'utilise lg1 et lg2 (tu vois, je préfère mettre des noms courts et pas des noms à rallonge ! 😜) ; je ne mets pas non plus de commentaire pour le caractère de type « & », car je sais très bien que c'est idem que « As Long »

2) normalement, le but d'un commentaire n'est pas de dire ce que fait le mot-clé VBA ; par exemple, pour cette instruction :
Cells(lig, 2) = lbCodCtg2 'B : CC = Code catégorie

le commentaire n'est pas : « je mets le Caption du label lbCodCtg2 dans la cellule de la feuille de calcul dont la ligne est lig et la colonne est 2 = colonne B » ; je mets simplement celui qui est ci-dessus, pour indiquer qu'il s'agit du Code catégorie.

3) je comprends bien que tous les débutants en VBA ont très facilement tendance à tout commenter largement, et même de trop ! mais plutôt que d'écrire pour chaque instruction Dim du code VBA : « 'déclaration des variables » ; je suggère très fortement d'écrire cela une seule fois dans un cahier à part qui servira de référence VBA, puis de s'y reporter chaque fois que ça s'avérera nécessaire ; très gros avantage : ce système permet d'éviter de mettre le même commentaire pour chaque Dim du code VBA ; aussi bien pour les modules du projet en cours que pour les modules des autres projets VBA.

4) quand plus tard tu auras bien compris et assimilé que Dim est pour déclarer des variables, et que tu le sauras par cœur, tu pourras même abréger ta référence VBA, car toi-même tu te diras : « pourquoi continuer à garder ça puisque maint'nant je le sais par cœur ? donc autant le supprimer ➯ j'aurai moins de notes à compulser pour mes futures consultations de ma référence VBA »

5) pour ta propre référence VBA, j'ai parlé d'un cahier pour que ce soit « plus parlant », mais plutôt qu'un cahier avec des feuilles de papier, ce sera mieux d'écrire tes notes dans un fichier Word, que tu peux appeler par exemple "Ma référence VBA.docx" ou plus simplement "Notes VBA.docx" ; même si tu n'as pas 2 écrans sur un même PC, grâce aux capacités multitâches de Windows, tu peux facilement basculer d'une fenêtre Word (où il y a ton fichier "Ma référence VBA" ou "Notes VBA"), à une fenêtre Excel (où il y a ton classeur Excel).​

soan
Bonsoir SOAN,

En faisant un fichier Word, serais-tu susceptible ou autorisé à le lire et à y apporter d'éventuelles modifications ? Dans une procédure, il y a une instruction A; quelques lignes après, il y a une instruction B identique à A, à cela près que le nom de l'objet, de l'outil a changé. Dans le fichier Word, quelle serait la bonne manière de commenter les instructions A et B ?
 

soan

XLDnaute Barbatruc
@Christian

j'ai vu que le fichier "MENUS.xlsm" de ton post #87 a été téléchargé à ce moment par 2 personnes, mais ce n'est pas moi ; je téléchargerai ce fichier uniquement si tu as un problème différent de ce qu'on a vu auparavant ET si tu décris CLAIREMENT quel est le problème ; et ça se passe ; exemple : ça concerne telle feuille, et telle(s) cellule(s), il faut intervenir sur la sub X() de Module1. (ou du module de la feuille X ; ou du module du UserForm X) ; d'autre part, si je connais la réponse, du fait que je suis débordé, je t'aiderai seulement si j'en trouve le temps, et que la réponse ne sera pas trop longue à faire ; je t'ai déjà beaucoup aidé jusqu'à présent, et pendant tout le temps que j'ai passé sur « ton dossier », j'ai mis « en attente » d'autres dossiers que j'avais en cours ; je ne peux pas t'aider toi uniquement, car je suis seulement un contributeur bénévole ; ce n'est pas comme si j'étais un genre de « précepteur », ou si j'étais « ton prof particulier » ; ce serait injuste envers les autres que je n'aide que toi, et je ne peux plus reporter les « dossiers » que j'ai « en attente » ; je dois continuer à avancer le « dossier » de chacun d'eux.

soan
 

Discussions similaires

Statistiques des forums

Discussions
291 730
Messages
1 917 538
Membres
179 713
dernier inscrit
Ranya
Haut Bas