TbDateMenu_MouseDown et cbLégumes

Bonjour à toutes et à tous,

À ce stade du programme, est-il normal que le tbDateMenu et le cbLégumes ne se remplissent pas ? D'avance merci pour vos réponses.

5comptabilitev2.xlsm (226.55 Ko)

Date menu : résolu j'avais mis = zéro au lieu de >zéro

Bonjour à tous,

Petit retour sur le code.

Dim Suppr As Boolean
Dim Message As Boolean
Dim Article As String
Dim I As Long

Ces variables sont initialisées mais pas utilisées.
Au niveau du module préférez Private en lieux et place de Dim.

tbDateCréationMenu = Format(Date, "dddddd")
End Sub

Pour une meilleure compréhension utilisez le format Long date.

tbDateCréationMenu = Format(Date, "Long date")
End Sub

Dans ces lignes :

    If Cpt > 0 Then
        ReDim Preserve Résult(1 To Cpt)
        Select Case NatureMenuAllégéeSel
            Case Is = "LMMR"
                cbLégumes.List = Résult

        End Select
    End If

Que voulez-vous faire avec le Redim Preserve Résult(1 To Cpt) ?

Bonjour Jean-Paul,

J'ai repris les instructions d'Arturo83 mais je ne comprends pas tout, par exemple ici le redim. Qu'apporte Private au lieu de Dim ?

5comptabilitev2.xlsm (245.71 Ko)

Re,

Si vous ne savez pas prenez l'habitude de regarder la documentation de Crosoft.

Bon j'ai survolé le code sans approfondir, d'où ma question sur le deuxième Redim Preserve. Donc en fait le tableau est dimensionné sur le nombres de lignes du tableau.

    ReDim Résult(1 To Tbl.Rows.Count)

Puis si la condition est remplie alors on écrit sur les premières lignes du tableaux, grâce au compteur Cpt.

        If Left(Tbl.Cells(I, 4).Value, Nb_NatureMenuAllégéeSel) = NatureMenuAllégéeSel Then
            Cpt = Cpt + 1
            Résult(Cpt) = Tbl.Cells(I, 3).Value
        End If

Enfin on fait un Redim Preserve sur le tableau en fonction de Cpt. Ceci évite d'avoir des entrées vides dans le tableau si Cpt est inférieur au nombre de lignes du tableau.

Bon pour ma part j'aurais redimensionné le tableau au niveau de la condition mais bon, à chacun sa technique.

Du coup dans la procédure cbNatureMenuAllégée_Change la variable Lastrow ne sert à rien.

Qu'apporte Private au lieu de Dim ?

Elles ont la même fonction, c'est juste pour rendre le code plus clair et différencier les variables Modules de celles des procédures.

Vous personnellement, vous êtes pour la déclaration des variables soit en tête du programme pour certaines (et pourquoi à cet endroit ?) et à l'intérieur des procédures soit dans un module (ce je faisais mais on a crié haro sur le baudet).

La déclaration des variable et un chose très importante et il faut connaitre, non seulement leurs portées, mais aussi l'endroit le plus propice pour leurs déclarations.

Prenez le temps de lire la documentation de Crosoft.

En ce qui me concerne (Et cela n'engage que moi.) Je préfère déclarer les variables (A l'instar de Vb.Net et autres.) au plus près de leurs utilisations.

J'utilise avec parcimonie les variables de niveau Module, je leurs préfère soit des variables de niveau procédures, soit l'utilisation d'arguments pour les procédures et fonctions.

Encore une chose : Call MiseÀJourTitre Il n'est plus nécessaire et utile de mentionner le Call cela date de QuickBasic.

Petit exemple de simplification, DateMenu est déclaré au niveau module, mais vous ne vous en servez que dans la procédure tbDateMenu_MouseDown donc vous pouvez la déclarer au niveau procédure. Voici le code modifié :

Option Explicit
'COMPTABILITÉV2.xltm.

Private Sub cmdRetourFeuilleAccueilAnnuler_Click()
    Unload Me
End Sub

Sub MiseÀJourTitre()
'Va compléter l'Intitulé lbTitre avec le contenu choisi dans la Zone de liste modifiable cbNatureMenu et avec le contenu choisi dans la Zo _
ne de texte tbDateMenu.
    'Me.lbTitre = "Création" & " " & LCase(cbNatureMenuAllégée) & " " & "du " & LCase(tbDateMenu) & "."
End Sub

Private Sub UserForm_Activate()
    cbNatureMenuAllégée.List = Range("TabNatureMenuAllégée").Value
    tbDateCréationMenu = Format(Date, "dddddd")
End Sub

Private Sub cbNatureMenuAllégée_Change()

    tbCodeNatureMenuAllégée.Value = cbNatureMenuAllégée.Column(1)

    Dim NatureMenuAllégéeSel As String
    NatureMenuAllégéeSel = tbCodeNatureMenuAllégée

    Dim Nb_NatureMenuAllégéeSel As Variant
    Nb_NatureMenuAllégéeSel = Len(NatureMenuAllégéeSel)

    Dim Tbl As Range
    Set Tbl = Range("TabLégumesViandesDesserts")

    Dim Résult() As String
    ReDim Résult(1 To Tbl.Rows.Count)
    Dim Cpt As Long
    Cpt = 0

    Dim I As Long
    For I = 1 To Tbl.Rows.Count
        If Left(Tbl.Cells(I, 4).Value, Nb_NatureMenuAllégéeSel) = NatureMenuAllégéeSel Then
            Cpt = Cpt + 1
            Résult(Cpt) = Tbl.Cells(I, 3).Value
        End If
    Next I

    If Cpt > 0 Then
        ReDim Preserve Résult(1 To Cpt)
        Select Case NatureMenuAllégéeSel
            Case Is = "LMMR"
                cbLégumes.List = Résult

        End Select
    End If
    Call MiseÀJourTitre
End Sub

Private Sub tbDateMenu_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim DateMenu As Date
    DateMenu = Calendrier.Choix(tbDateMenu)
        If DateMenu > 0 Then tbDateMenu = Format(DateMenu, "dddddd")
    Call MiseÀJourTitre
End Sub

Et pour finir.

Apprenez à être plus strict, VBA est complaisant, mais il ne faut pas trop en abuser. Exemple :

Sur votre formulaire cbNatureMenuAllégée est paramétré avec une colonne et renvoie la valeur de la colonne 1 (Jusque là c'est classique)

odppfnqwyj

Ensuite vous charger sa liste, et vous vous retrouvez avec deux colonnes, et vous utilisez la propriété Column pour renvoyer le résultat.

xdlit1gsrq

Je vous conseille si vous devez toujours récupérer la valeur de la colonne 1 de la définir par défaut à l'initialisation du formulaire :

Private Sub UserForm_Activate()
    With cbNatureMenuAllégée
        .ColumnCount = 2
        .BoundColumn = 2
        .ColumnWidths ";0pt)"
        .List = sh02.Range("TabNatureMenuAllégée").Value
    End With
    tbDateCréationMenu = Format(Date, "dddddd")
End Sub

Ensuite il ne vous reste plus qu'a lire la valeur de la propriété Value.

Bonjour Jean-Paul,

Cela sort des erreurs : .ColumnWidths ";0pt)" dans la procédure UserForm_Activate : utilisation incorrec

te de la propriété.

Bonjour,

Oui évidemment je suis aller trop vite en tapant le code, mais ce genre d'erreur devrait vous sauter aux yeux, non ?

Je le dis toujours et je le répète encore, faire du copier coller ne vous apporte rien de bon, le but et que vous tapiez l'intégralité du code, il n'y que comme cela que vous le retiendrez.

ColumnWidths attends une chaine de caractère qui représente les longueurs de chaque colonnes, si la longueur n'est pas définie alors c'est la longueur par défaut qui est prise en compte. La longueur est définie en points "10pt", ou "50pt;0pt" ou "0pt;10pt;70pt;0pt" regarder les lignes du dessus et vous trouverez une des deux erreurs.

Dans la mesure du possible, je n'utilise pas ou très peu le copier-coller car, je suis d'accord avec vous sur ce sujet, il vaut mieux que je tape le code pour apprendre. Là, j'ai essayé d'imprimer vos instructions mais impossible de lire l'impression alors que ma cartouche d'encre n'est pas encore vide, j'ai dû donc avoir recours au copier-coller. Je vais essayé de lire les lignes précédentes mais ce n'est pas dit que je vais comprendre et voir où sont les erreurs. Premier constat : pourquoi une parenthèse fermante alors qu'il n'y a pas de parenthèse ouvrante ? La parenthèse fermante supprimée, le problème persiste. Pourquoi des guillemets alors que les deux précédentes lignes ont le signe égal ? Les guillemets gardés mais avec le signe égal, une nouvelle erreur surgit dans la procédure Private Sub cbNatureMenuAllégée_Change

Voilà vous avez trouvé les deux erreurs.... Bien.

une nouvelle erreur surgit dans la procédure Private Sub cbNatureMenuAllégée_Change

Bon je vais prendre ma boule de cristal, et je vais regarder de ce pas...

Il faudrait aussi savoir ce que vous voulez faire dans cette procédure...

Procédure proposée par Arturo83 : elle permet de remplir les tbMoisMenu et tbJourFérié.

Private Sub tbDateMenu_Change()
Dim TabDate() As String, J As Long, JourSemaine As Long

'Si vérification date menu NOK, on ne fait rien et on quitte la procédure.
If VérifDateMenu = False Then Exit Sub

'Vérification jour férié. On Error Resume Next : Lorsqu'une erreur d'exécution survient, le contrôle est transmis à l'instruction qui suit immé _
diatement celle où l'erreur s'est produite, et l'exécution continue. Il est recommandé d'utiliser cette formulation plutôt que l'instruction On _
Error GoTo pour accéder à des objets.
On Error Resume Next

'Extraction de la date au format "Date". On relève tous les termes de la date qui sont séparés par un espace en les numérotant de zéro à 3.
TabDate = Split(tbDateMenu, " ")
'Zéro pour jour en lettres, un = jour en nombre, deux = mois en lettres, trois = année en nombre. On prend les premier, deuxième et troisiè _
mes termes que l'on colle dans tbMoisMenu.
DateMenu = Format(TabDate(1) & "/" & TabDate(2) & "/" & TabDate(3), "dd/mm/yyyy")
'Mois menu. On prend les deuxième et troisième termes que l'on colle dans tbMoisMenu.
tbMoisMenu = TabDate(2) & " " & TabDate(3)

'RéférenceSemestreViandesMidiWeekend.
If tbCodeNatureMenuAllégée.Value = "VMMWE" Then
'<= : inférieur ou égal à (ici à 6).
If Month(DateMenu) <= 6 Then
tbRéférenceSemestreViandesMidiWeekend.Value = "Premier semestre " & Year(DateMenu)
Else
tbRéférenceSemestreViandesMidiWeekend.Value = "Deuxième semestre " & Year(DateMenu)
End If
End If
'WorksheetFunction.match : Renvoie la position relative d'un élément dans une matrice (matrice : permet de créer des formules uniques _
permettant d’obtenir plusieurs résultats et qui agissent sur un groupe d’arguments répartis dans des lignes et des colonnes. Une plage ma _
tricielle partage une même formule tandis qu’une constante matricielle est un groupe de constantes qui sert d’argument.), qui correspond _
à une valeur spécifiée dans un ordre spécifié. Utilisez la fonction MATCH au lieu de l'une des fonctions LOOKUP lorsque vous avez besoin _
de la position d'un élément dans une plage au lieu de l'élément proprement dit. 'CLng : La fonction CLng convertit une expression en un _
type de données spécifique (les fractions sont arrondies).
J = WorksheetFunction.Match(CLng(DateMenu), Range("TabJoursFériés[Date jour férié]"), 0)
'On Error GoTo 0 : Invalide dans la procédure en cours tout gestionnaire d'erreurs validé.
On Error GoTo 0
If J <> 0 Then
tbJoursFériés.Value = Range("TabJoursFériés[Nom jour férié]").Item(J)
Else
tbJoursFériés.Value = ""
End If

'Effacement préalable.
Call EffacementContrôles

'Initialisations des listes codes articles selon code Légumes, Viandes, Deserts et date menu.
'Appel de la procédure PrédéfinitionsSpécifiques
'Call PrédéfinitionsSpécifiques
'Appel de la procédure RécupérationMenu (d'après BeGood).
Call RécupérationMenu
End Sub

Rechercher des sujets similaires à "tbdatemenu mousedown cblegumes"