Mise à jour Combobox

Hello les développeurs petite question VBA

J'ai du code (il est long je ne l'ai pas mis pas il n'y en aura pas besoin je pense) qui fonctionne bien et dont le but est de créer des feuilles excel qui sont nommées automatiquement.

image

J'affiche cette fenêtre et côté gauche je viens choisir un mois et une année qui proviennent d'un array

quand je valide ma saisie ma feuille est créée puis nommée JANVIER 2021 par exemple par contre pour le moment le nom n'est stocké nulle part

sur la partie droite mon souhait est que quand j'ouvre la combobox j'ai une proposition dynamique (remise à jour) des onglets que j'ai créé juste avant et que ceux ci soient triés par numéros de mois et non par ordre alphabétique pour éviter d'avoir dans la liste:

AVRIL 2021
AOUT 2021

JANVIER 2021

MAI 2021 etc

Vous avez une idée?

Bonsoir,

Combien de feuille "hors planning" avez vous ? Quelles sont leur nom ?
Je suppose que vous ne voulez pas les voir dans la liste de la ComboBox ?

Avec le fichier en plus ce serait un plus

@ bientôt

LouReeD

Les feuilles sont créées avec la partie gauche et la partie droite servira à les envoyer ensuite (cette partie n'est pas encore codée)

Voici le fichier :-) soyez indulgents je ne suis pas un spécialiste du VBA

Merci beaucoup pour votre aide

15creation.zip (470.01 Ko)

Bon en fait j'ai trouvé "un vieux fichier" :

@ bientôt

LouReeD

On se rapproche de mon idée.

Dans mon fichier comme tu verras, je ne stocke pas la valeur saisie.

Je vois aussi que ta liste remise à jour le tri par numéro de mois n'est pas implémenté et c'est ce que je souhaite faire.

Je pense que ce sera plus compréhensible grâce à mon fichier :-)

Merci pour ton aide en tout cas

Très bonne journée

Micka

Bonjour

Bonjour à tous

Un essai à tester.

16classeur1-v1.xlsm (35.73 Ko)

Bye !

Magnifque gmb mille mercis, me reste juste à trier les onglets tout à droite par ordre calendaire, je sais pas si c'est possible

Nouvelle version qui classe les onglets.

24classeur1-v2.xlsm (38.23 Ko)

Bye !

Waouhhh exactement ce qu'il me faut

Un très grand merci pour votre aire à tous et un très bon WE

Bonjour gmb,

j'ai implémenté et adapté ton fichier à mon code et je reprends petit à petit car j'avais inversé mon code entre les userforms et les modules, bref je débute en VBA :-)

J'ai essayé de comprendre les boucles dico, dico2 mais je bloque sur un point, quand je créé des nouveaux mois le classement s'arrête au mois sans tenir compte de l'année et mon userform de destination ne s'incrémente qu'avec le numéro des années contrairement à ton programme de base qui lui fonctionne très bien.

Je pense que je dois ajouter une condition mais avec toutes les boucles je m'y perds un peu.

Dans mon fichier en PJ, quand les conditions sont réunies j'aimerais que l'onglet Mois_vierge soit recopier et que celui ci soit renommé avec le Nom et l'année et que ensuite chaque page créée soit visible dans la liste

Pouvez vous m'aider?

Merci d'avance, on est pas loin du but mais les boucles me perdent un peu :-)

6creation.zip (215.75 Ko)

Bonjour

Nouvelle version.

13creation-v1.zip (217.66 Ko)

Bye !

C'est juste magnifique gmb, merci beaucoup pour ton aide.

Je vais apprendre un peu plus encore sur le VBA grâce à toi

Très bonne journée

Micka

Je reviens sur le sujet, le fichier effectue bien le boulot en revanche la mise à jour de la liste des feuilles n'est visible que après en avoir créé une nouvelle sinon la liste du combobox 7 est vide à l'init.

Il suffit de déclarer tout ça à l'init du userform :-) mais plus facile à dire qu'à faire

Bonjour

Nouvelle version

12creation-v2.zip (208.99 Ko)

Bye !

Ca fonctionne exactement comme je le souhaite, quel talent.

Il me reste du pain sur la planche encore avec ce que je dois implémenter mais j'avance grâce à ton aide.

Merci bien pour ce coup de pouce, très bonne soirée

Micka

Bonsoir,

Je m'excuse de revenir après avoir laisser gmb prendre le relais
Ci dessous ma proposition pour quelques procédure du USF au sujet de la création de feuille :

Sub NouvelOnglet()
    ' vu que le test d'existance est fait lors de la saisie on peut créer la feuille en toute quiétude
    ActiveWorkbook.Sheets.Add after:=ActiveWorkbook.Sheets("CREATION")
    ' on lui donne le nom des deux combobox
    ActiveSheet.Name = ComboBox4 & " " & ComboBox5
    ' on lance le classement
    Call ClassOnglet
End Sub

Private Sub ClassOnglet()
    Dim I, J, NbFeuille As Integer
    'on récupère le nombre de feuille existante
    NbFeuille = ComboBox7.ListCount
    ' si c'est égale à 0 ou moins on quitte la procédure de classement
    If NbFeuille <= 0 Then Exit Sub
    ' on masque ce que l'on va faire
    Application.ScreenUpdating = False
    'On classe les onglets
    For I = 2 To NbFeuille + 1
        For J = I + 1 To NbFeuille + 1
            ' on compare ce qui ressemble à une date de l'onglet de gauche par rapport à celui de droite
            ' si la date est plus grande on déplace la feuille à droite de celle de droite
            If CDate(Worksheets(I).Name) > CDate(Worksheets(J).Name) Then Worksheets(J).Move Sheets(I)
        Next J
    Next I
    ' on efface les données de la combobox 7
    ComboBox7.Clear
    ' et on ré inscrit ces dernières en apportant les modifications
    For I = 2 To NbFeuille + 1
        ComboBox7.AddItem Sheets(I).Name
    Next I
    Sheets("CREATION").Activate
End Sub

Function TestF(Partie1 As String, Partie2 As String) As Boolean
    Dim Cel As Range
    ' on passe le test à VRAI par défaut
    TestF = True
    ' gestion des erreurs
    On Error GoTo YaErreur
    ' on attribue à Cel l'objet range de la feuille testée :
    ' si la feuille n'existe pas il y a une erreur sinon le test est VRAI
    Set Cel = Sheets(Partie1 & " " & Partie2).Range("A1")
    Exit Function
' il y a une erreur, c'est que la feuille n'existe pas
YaErreur:
    ' le test est FAUX
    TestF = False
End Function

Private Sub ComboBox4_Change()
    ' ici on test l'existance de la feuille au moment de la sélection des deux parties qui la compose
    ' si les deux combobox sont différenets de rien
    If ComboBox4.ListIndex <> -1 And ComboBox5.ListIndex <> -1 Then
        ' si le test d'existance est VRAI
        If TestF(ComboBox4, ComboBox5) = True Then
            ' alors on affiche le message d'avertissement
            MsgBox ("La feuille en cours de création existe déjà"), 16
            ' on efface la dernière donnée saisie
            ComboBox4.ListIndex = -1
        End If
    End If
End Sub

Private Sub ComboBox5_Change()
    ' ici on test l'existance de la feuille au moment de la sélection des deux parties qui la compose
    ' si les deux combobox sont différenets de rien
    If ComboBox4.ListIndex <> -1 And ComboBox5.ListIndex <> -1 Then
        ' si le test d'existance est VRAI
        If TestF(ComboBox4, ComboBox5) = True Then
            ' alors on affiche le message d'avertissement
            MsgBox ("La feuille en cours de création existe déjà"), 16
            ' on efface la dernière donnée saisie
            ComboBox5.ListIndex = -1
        End If
    End If
End Sub

Private Sub CommandButton2_Click()
    If ComboBox4.ListIndex = -1 Then ' vérifie si la saisie est vide (valeur -1 si combobox = vide)
        MsgBox ("Veuillez choisir un MOIS"), 16
        Exit Sub
    ElseIf ComboBox5.ListIndex = -1 Then   ' vérifie si la saisie est vide (valeur -1 si combobox = vide)
        MsgBox ("Veuillez sélectionner une ANNEE"), 16
        Exit Sub
    ElseIf ComboBox6.ListIndex = -1 Then   ' vérifie si la saisie est vide (valeur -1 si combobox = vide)
        MsgBox ("Veuillez sélectionner une EQUIPE DE GARDE"), 16
        Exit Sub
    ElseIf TextBox1 = "" Then   ' vérifie si la saisie est vide (valeur -1 si combobox = vide)
        MsgBox ("Veuillez sasir une DATE LIMITE DE RETOUR"), 16
        Exit Sub
    End If
    Call NouvelOnglet
End Sub

Il y a la Sub de "validation" avec les test de complétude d'information.
J'ai ajouté les deux Sub des ComboBox 4 et 5 en Change afin de tester dès la saisie si la feuille existe ou pas.
Une fonction TestF pour savoir si la feuille existe ou pas.
La Sub de "NouvelOnglet" afin de créer la nouvelle feuille à la suite de celle de CREATION.
Et pour finir la Sub de classement par date des onglets. J'ai pris le parti de les trier par "leur date" ce qui fait qu'une double boucle suffit.

Voilà, j'ai mis quelques commentaires pour les explications.

@ bientôt

LouReeD

Merci LouReed,

ne t'excuse pas c'est déjà énorme d'avoir pris le temps de me répondre.

Je vais tester ton code ce matin même et je te redis si ça matche

Un grand merci pour ton retour 😉

LouReed j'ai testé ton programme qui est très intéressant et je t'en remercie.

Plusieurs points de blocage ont été rencontrés si je peux me permettre:

_ lorsque j'accèdes à mon USF je n'ai pas la liste des feuilles déjà existantes dans mon ComboBox7, ceci aussi bien à l'init que lorsqu'une feuille est créée.

J'ai l'impression qu'on ne rentre jamais dans la sub "ClassOnglet" car à la fin on ne vient pas se placer sur la feuille "CREATION"

_ lorsque je créé une nouvelle feuille, et que par erreur je valide à nouveau (donc sans changer les valeurs de ComboBox4 et ComboBox5 on ne rentre pas dans la boucle et le compilateur renvoie une erreur car feuille déjà existante, le test devrait alors être placé dès lors qu'on appuie sur "valider"

Je te joins le fichier avec ton code implémenté, ce sera plus simple à comprendre je pense

5creation.zip (255.00 Ko)

Bonjour,

je n'ai pas dis qu'il fallait toucher au "initialize" du USF, du coup pas de création de liste !

Ensuite j'ai ajouté le fait de "vider" les ComboBox après la création comme cela pas de création successives !
Correction de la boucle de tri qui ne prenait pas en compte le fait de l'ajout d'une nouvelle feuille donc +2 au lieu de +1
Le fichier :

18creation-lrd-2.zip (263.31 Ko)

@ bientôt

LouReeD

LouReed ton programme fonctionne également très bien et je t'en remercie :-)

Rechercher des sujets similaires à "mise jour combobox"