Microsoft 365 vba format date et N° automatique

974RE

XLDnaute Occasionnel
Bonsoir le forum,
Une fois de plus je fais appel à vous.
Je rencontre 2 problèmes que je n'arrive pas à résoudre:
1° Sur mes USF Visualiser et Modifier, mes textBox Heures ne s'affiche pas au format hh:mm bien que j'ai précisé ce format.
2° je n'arrive pas à l'ouverture de l'USF Devis à ce qu'il me donne automatiquement le N° Suivant qui devrait être 2021-002 puis au prochain devis 2021-003...
Auriez-vous la gentillesse de bien vouloir m'aider s'il vous plaît.
Je sais pouvoir compter sur votre aide.
Merci d'avance!
 

Pièces jointes

  • Essai CL1 Copie.xlsm
    182.4 KB · Affichages: 182
Solution
Bonjour 974RE, Yeahou, le fil,

tu as écrit : « Je crois que Soan à raison, aujourd'hui je coupe: plage, déjeuner les pieds dans l'eau, sieste et......je reprends! »

quoi ? t'as déjà fini d'faire trempette ? 😱 ben t'as pas nagé bien longtemps, dis donc ! tu pourras jamais rattraper Laure Manaudou si tu t'entraînes aussi peu ! 😁 😄 😂 bon, t'as d'la chance, regarde, elle t'attend :

Regarde la pièce jointe 1100325



tu as aussi écrit : « Je vais de ce pas décortiquer tes codes. » ; ben ça non plus ça t'a pas pris bien longtemps ! moi qui croyais qu'on t'reverrai plus avant un mois ou deux ! 😁 🤣 🤣 🤣 bon, c'est vrai qu'mes codes sont très faciles à comprendre, et en plus c'est comme les crêpes : c'est bien plus...​

974RE

XLDnaute Occasionnel
Bonsoir 974RE, soan, chti160, le forum

974RE, voila le fichier modifié, les listes des combobox se mettent à jour en fonction des filtres déja entrés.

Bonne soirée
Yeahou, Soan, ChTi160
Bonsoir,
J'ai encore besoin d'un coup de main.
J'ai modifié mon USF DevisModifié en lui donnant la même configuration que l'USF Facture.
L'idée d'avoir une ListBox qui récupère tous les devis avec le filtre je l'ai trouvé trop top. J'ai voulue avoir la même chose avec l'USF DevisModifié. Je n'arrive pas à lui dire de m'afficher le N° de la facture si je sélectionne dans le filtre devis avec Facture. et si il n'y a pas de facture il laisse la textBox N° facture vide.
J'ai également un soucis avec l'ajustement de la ListBox en fonction du contenu du choix effectué dans le filtre.
Comme vous pouvez le constater, j'ai retenu l'idée de ChT160 en reprenant le bouton "Initialiser". J'ai trouver cela très pratique.
J'ai aussi des difficultés à ce que la ComboBox désignation récupère les données de la Feuille A.DV.
Dernier point de difficulté: le bouton Archiver Devis ne fonctionne pas. Il devrait normalement supprimer la ligne concernée et la remplacer par la modification.
Si vous avez un petit moment....
Merci d'avance.
 

Pièces jointes

  • Essai CL8.2 - (7) .xlsm
    348 KB · Affichages: 4

ChTi160

XLDnaute Barbatruc
Re
j'ai constaté pleins d'anomalies Lol
les Dates la feuille "A.LD" n'avait que des 2019 .
et dans la Feuille "A.DV" y'a plein de N° de devis non conforme
enfin j'ai modifié et mis a ma sauce Lol
jean marie
Ps :
j'ai , hier soir , Oublié de poster ce message resté en attente Lol
 

Pièces jointes

  • Essai CL8.2 - Chti160-3 .xlsm
    331.8 KB · Affichages: 7

974RE

XLDnaute Occasionnel
Re
j'ai constaté pleins d'anomalies Lol
les Dates la feuille "A.LD" n'avait que des 2019 .
et dans la Feuille "A.DV" y'a plein de N° de devis non conforme
enfin j'ai modifié et mis a ma sauce Lol
jean marie
Ps :
j'ai , hier soir , Oublié de poster ce message resté en attente Lol
ChTi160, Yeahou, Soan,
Bonsoir,
ChTi160, merci d'avoir balayé le fichier et d'avoir apporter les rectifications. Les éléments de la feuille A.DV et A.LD ont juste été copier afin de permettre de vérifier le bon fonctionnement des Filtres de l'USF Facture.
Dans le dossier ci-joint, j'ai remis de l'ordre dans ces feuilles.
Avez-vous eu le temps de regarder mon USF DevisModifié qui ne fonctionne pas correctement? (Voir Fichier joint).
Merci beaucoup de l'attention que vous portez à mon projet.
 

Pièces jointes

  • Essai CL8.2 -(8) .xlsm
    375.7 KB · Affichages: 3

974RE

XLDnaute Occasionnel
Bonjour 974RE
Bonjour le Fil ,le Forum

moi j'en suis encore au Userform Facture Lol
mais que dois tu pouvoir faire a partir de ce Userform ?
explications et démarche !
merci
Bonne fin de journée
jean marie
L'USF DevisModifié permet de modifier le contenu d'un devis éditer et transmis au client. En effet, le client à réception du devis peut demander à modifier certaines données: Prise en charge, trajet, Fin de course, Désignation. Ces données changent le coût de l'opération. Le Devis Modifié est archivé et prend la place des données déjà sur les Feuille A.DV et A.LD et prend donc la place du Devis Initial. Le devis modifié est alors archivé en format PDF. Le libellé de ce nouveau PDF comporte la mention Devis Modifié avec le N° du Devis et la Date de la Modification.
Dans la Feuille A.DV il y a une colonne pour recevoir la date de modification qui est en fait la date du jour.
Sur l'USF Devis Modifié, Lorsque l'on affiche un devis facturé, il faudrait que le N° de la Facture apparait dans la texteBox 1 (Facture). Ici, pour les Devis ayant fait l'objet d'une facture: aucune possibilité d'y apporter aucune modification au devis. Par contre s'il n'y a pas de facture: choix du Devis à modifier, apporter les modifications, Valider, Archiver, archiver PDF.
Si mes explications ne sont pas suffisamment claires, n'hésite pas à me demander des précisions.
J'ai réussi à récupérer certaines données, mais la ComBox Désignation ne récupère pas les bonnes données et l'archivage (A.DV et A.LD ) ne fonctionne pas également.
Merci à toi.
 

974RE

XLDnaute Occasionnel
L'USF DevisModifié permet de modifier le contenu d'un devis éditer et transmis au client. En effet, le client à réception du devis peut demander à modifier certaines données: Prise en charge, trajet, Fin de course, Désignation. Ces données changent le coût de l'opération. Le Devis Modifié est archivé et prend la place des données déjà sur les Feuille A.DV et A.LD et prend donc la place du Devis Initial. Le devis modifié est alors archivé en format PDF. Le libellé de ce nouveau PDF comporte la mention Devis Modifié avec le N° du Devis et la Date de la Modification.
Dans la Feuille A.DV il y a une colonne pour recevoir la date de modification qui est en fait la date du jour.
Sur l'USF Devis Modifié, Lorsque l'on affiche un devis facturé, il faudrait que le N° de la Facture apparait dans la texteBox 1 (Facture). Ici, pour les Devis ayant fait l'objet d'une facture: aucune possibilité d'y apporter aucune modification au devis. Par contre s'il n'y a pas de facture: choix du Devis à modifier, apporter les modifications, Valider, Archiver, archiver PDF.
Si mes explications ne sont pas suffisamment claires, n'hésite pas à me demander des précisions.
J'ai réussi à récupérer certaines données, mais la ComBox Désignation ne récupère pas les bonnes données et l'archivage (A.DV et A.LD ) ne fonctionne pas également.
Merci à toi.
Soan, Yeahou, ChTi160
Je me permets de vous solliciter à nouveau puisque je n'ai pas réussi à résoudre mes deux problèmes de mon post 187. J'ai repris mon travail après deux mois d'arrêt et j'ai dû mettre de coté pendant quelques temps mon projet.
Je n'arrive pas à mettre en corrélation le Devis et la Facture dans mon USF "Modifier Devis". J'aurais aimé que si je sélectionne un devis qui a fait l'objet d'une facture que le N° de la Facture s'affiche dans la textBox 1 (Facture). J'ai également un problème de reclassement du devis modifié dans la feuille A.LD. Si je modifie un devis il l'ajoute sur une nouvelle ligne. Il faudrait qu'au moment de l'archivage, après les modifications le devis soit reclassé dans l'ordre des devis.
J'espère que vous trouverez un moment pour m'aider.
Merci à vous.
 

Pièces jointes

  • Essai CL9.xlsm
    355.6 KB · Affichages: 5

soan

XLDnaute Barbatruc
Inactif
Bonjour 974RE, le fil,

j'espère que tu as bien pu te reposer lors de tes 2 mois d'arrêt, et que maint'nant tu as bien récupéré. 🍀



tu as écrit : « Je n'arrive pas à mettre en corrélation le Devis et la Facture dans mon USF "Modifier Devis". J'aurais aimé que si je sélectionne un devis qui a fait l'objet d'une facture que le N° de la Facture s'affiche dans la textBox 1 (Facture). »

ton fichier en retour. :)

* dans le formulaire "Modifier Devis", choisis ⦿ Tous les devis

* sélectionne le 1er devis ➯ Facture : FACT2021-001

* note que ce champ est bien effacé lors de la sélection d'un autre devis,
car aucun autre devis n'a fait l'objet d'une facture.

* dans le formulaire "Facturation", fais les mêmes manips que ci-dessus,
tu pourras voir que ça fait la même chose.



dans le module "Modifier_Devis" :

VB:
Private Sub Rechercher_Change()
    If Me.Rechercher.ListIndex = -1 Then Exit Sub
    If Me.Rechercher.List(Me.Rechercher.ListIndex, 0) = "Aucune Facture" Then Exit Sub
  Dim cel As Range, ref$, lig&
  lig = Tab_Devis_Filtre_Final(Me.Rechercher.ListIndex + 1, 11)
  With Worksheets("A.DV").Cells(lig, 1)
'on remplit les champs avec les cellules de la feuille "A.DV"
    ref = .Value: NuméroDevis = ref: TextBox1 = ""
    Set cel = Worksheets("A.Fact").Columns(1).Find(ref, , -4163, 1, 1)
    If Not cel Is Nothing Then TextBox1 = cel.Offset(, 1)
   
    DateDevisInitial = .Offset(, 1): DateModif = .Offset(, 2): NOM = .Offset(, 3)
    ADRESSE = .Offset(, 4): Ville = .Offset(, 5): DateEvènement = .Offset(, 6)
    PriseEnCharge = .Offset(, 7): Trajet = .Offset(, 8): FinCourse = .Offset(, 9)
  End With
  
    With Worksheets("A.LD")
    Set cel = .Columns(1).Find(ref, , -4163, 1, 1)
    If cel Is Nothing Then Exit Sub
   
      Désignation.Height = Désignation.ListCount * Désignation.Font.Size * 1
      Désignation = cel.Offset(n, 1)  'Désignation
      Qté = cel.Offset(n, 2) 'Qté
      lblPU = Format(cel.Offset(n, 3), "#,##0 €") 'lblPU
      lblHT = Format(cel.Offset(n, 4), "#,##0 €") 'lblHT
     End With
 
        Me.Repaint
End Sub



dans le module "UF_Facture" :

VB:
Private Sub Rechercher_Click()
Dim DerLgn&, Lgn&, n&
If Me.Rechercher.ListIndex = -1 Then Exit Sub
    If Me.Rechercher.List(Me.Rechercher.ListIndex, 0) = "Aucun devis" Then Exit Sub
  Dim cel As Range, ref$, lig&
  lig = Tab_Devis_Filtre_Final(Me.Rechercher.ListIndex + 1, 11)
  With Worksheets("A.DV").Cells(lig, 1)
'on remplit les champs avec les cellules de la feuille "A.DV"
    ref = .Value: NuméroDevis = ref: TextBox1 = ""
    Set cel = Worksheets("A.Fact").Columns(1).Find(ref, , -4163, 1, 1)
    If Not cel Is Nothing Then TextBox1 = cel.Offset(, 1)

    DateDevisInitial = .Offset(, 1): DateModif = .Offset(, 2): NOM = .Offset(, 3)
    ADRESSE = .Offset(, 4): Ville = .Offset(, 5): DateEvènement = .Offset(, 6)
    PriseEnCharge = .Offset(, 7): Trajet = .Offset(, 8): FinCourse = .Offset(, 9)
  End With
  Me.LigsDétail.Clear
With Worksheets("A.LD")
     DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
      For Lgn = 2 To DerLgn
      If Trim(.Cells(Lgn, 1)) Like NuméroDevis Then
        LigsDétail.AddItem .Cells(Lgn, 2) 'Désignation
        n = LigsDétail.ListCount - 1
        LigsDétail.List(n, 1) = .Cells(Lgn, 3) 'Qté
        LigsDétail.List(n, 2) = Format(.Cells(Lgn, 4), "#,##0 €")  'lblPU
        LigsDétail.List(n, 3) = Format(.Cells(Lgn, 5), "#,##0 €")  'lblHT
         LigsDétail.Height = LigsDétail.ListCount * LigsDétail.Font.Size * 2
      End If
      Next Lgn
End With
  Me.Repaint
End Sub



pour ton problème de reclassement, je t'indique juste une piste : après avoir archivé le devis modifié, faire un tri des devis de la feuille "A.LD", selon la colonne A, ordre croissant ; ça pourra être dans ce style :​

Worksheets("A.LD").Range("A2:A" & dlg).Sort [A2], 1

dlg étant le n° de la dernière ligne utilisée.

soan
 

Pièces jointes

  • Essai CL9.xlsm
    405.8 KB · Affichages: 15

974RE

XLDnaute Occasionnel
Bonjour 974RE, le fil,

j'espère que tu as bien pu te reposer lors de tes 2 mois d'arrêt, et que maint'nant tu as bien récupéré. 🍀



tu as écrit : « Je n'arrive pas à mettre en corrélation le Devis et la Facture dans mon USF "Modifier Devis". J'aurais aimé que si je sélectionne un devis qui a fait l'objet d'une facture que le N° de la Facture s'affiche dans la textBox 1 (Facture). »

ton fichier en retour. :)

* dans le formulaire "Modifier Devis", choisis ⦿ Tous les devis

* sélectionne le 1er devis ➯ Facture : FACT2021-001

* note que ce champ est bien effacé lors de la sélection d'un autre devis,
car aucun autre devis n'a fait l'objet d'une facture.

* dans le formulaire "Facturation", fais les mêmes manips que ci-dessus,
tu pourras voir que ça fait la même chose.



dans le module "Modifier_Devis" :

VB:
Private Sub Rechercher_Change()
    If Me.Rechercher.ListIndex = -1 Then Exit Sub
    If Me.Rechercher.List(Me.Rechercher.ListIndex, 0) = "Aucune Facture" Then Exit Sub
  Dim cel As Range, ref$, lig&
  lig = Tab_Devis_Filtre_Final(Me.Rechercher.ListIndex + 1, 11)
  With Worksheets("A.DV").Cells(lig, 1)
'on remplit les champs avec les cellules de la feuille "A.DV"
    ref = .Value: NuméroDevis = ref: TextBox1 = ""
    Set cel = Worksheets("A.Fact").Columns(1).Find(ref, , -4163, 1, 1)
    If Not cel Is Nothing Then TextBox1 = cel.Offset(, 1)
  
    DateDevisInitial = .Offset(, 1): DateModif = .Offset(, 2): NOM = .Offset(, 3)
    ADRESSE = .Offset(, 4): Ville = .Offset(, 5): DateEvènement = .Offset(, 6)
    PriseEnCharge = .Offset(, 7): Trajet = .Offset(, 8): FinCourse = .Offset(, 9)
  End With
 
    With Worksheets("A.LD")
    Set cel = .Columns(1).Find(ref, , -4163, 1, 1)
    If cel Is Nothing Then Exit Sub
  
      Désignation.Height = Désignation.ListCount * Désignation.Font.Size * 1
      Désignation = cel.Offset(n, 1)  'Désignation
      Qté = cel.Offset(n, 2) 'Qté
      lblPU = Format(cel.Offset(n, 3), "#,##0 €") 'lblPU
      lblHT = Format(cel.Offset(n, 4), "#,##0 €") 'lblHT
     End With

        Me.Repaint
End Sub



dans le module "UF_Facture" :

VB:
Private Sub Rechercher_Click()
Dim DerLgn&, Lgn&, n&
If Me.Rechercher.ListIndex = -1 Then Exit Sub
    If Me.Rechercher.List(Me.Rechercher.ListIndex, 0) = "Aucun devis" Then Exit Sub
  Dim cel As Range, ref$, lig&
  lig = Tab_Devis_Filtre_Final(Me.Rechercher.ListIndex + 1, 11)
  With Worksheets("A.DV").Cells(lig, 1)
'on remplit les champs avec les cellules de la feuille "A.DV"
    ref = .Value: NuméroDevis = ref: TextBox1 = ""
    Set cel = Worksheets("A.Fact").Columns(1).Find(ref, , -4163, 1, 1)
    If Not cel Is Nothing Then TextBox1 = cel.Offset(, 1)

    DateDevisInitial = .Offset(, 1): DateModif = .Offset(, 2): NOM = .Offset(, 3)
    ADRESSE = .Offset(, 4): Ville = .Offset(, 5): DateEvènement = .Offset(, 6)
    PriseEnCharge = .Offset(, 7): Trajet = .Offset(, 8): FinCourse = .Offset(, 9)
  End With
  Me.LigsDétail.Clear
With Worksheets("A.LD")
     DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
      For Lgn = 2 To DerLgn
      If Trim(.Cells(Lgn, 1)) Like NuméroDevis Then
        LigsDétail.AddItem .Cells(Lgn, 2) 'Désignation
        n = LigsDétail.ListCount - 1
        LigsDétail.List(n, 1) = .Cells(Lgn, 3) 'Qté
        LigsDétail.List(n, 2) = Format(.Cells(Lgn, 4), "#,##0 €")  'lblPU
        LigsDétail.List(n, 3) = Format(.Cells(Lgn, 5), "#,##0 €")  'lblHT
         LigsDétail.Height = LigsDétail.ListCount * LigsDétail.Font.Size * 2
      End If
      Next Lgn
End With
  Me.Repaint
End Sub



pour ton problème de reclassement, je t'indique juste une piste : après avoir archivé le devis modifié, faire un tri des devis de la feuille "A.LD", selon la colonne A, ordre croissant ; ça pourra être dans ce style :​

Worksheets("A.LD").Range("A2:A" & dlg).Sort [A2], 1

dlg étant le n° de la dernière ligne utilisée.

soan
Bonjour Soan,
Heureux de te lire de nouveau.
Nos échanges m'ont manqué.
Je vais mieux merci. La récupération a été un peu longue, mais apparemment c'était normale.
Je regarde tes codes et je reviens vers toi.
Merci de m'avoir une fois de plus accordé un peu de temps.
 

974RE

XLDnaute Occasionnel
Bonjour Soan,
Heureux de te lire de nouveau.
Nos échanges m'ont manqué.
Je vais mieux merci. La récupération a été un peu longue, mais apparemment c'était normale.
Je regarde tes codes et je reviens vers toi.
Merci de m'avoir une fois de plus accordé un peu de temps.
Bonsoir Soan,
J'espère que tu vas bien.
Etant très débordé ces derniers temps, je n'ai pas eu un moment pour finaliser mon projet.
Je pense avoir réussi à résoudre mon problème de reclassement de mon tableau sur la feuille ALD.
Je te joins le fichier avec ses modifications (exemple: le bouton Fermer de l'USF Accueil). Si tu avais un petit moment pour vérifier ce que j'ai fait et valider, ce serait sympa.
Merci beaucoup Soan. Sans ton aide, je n'aurais pas réussi à en venir à bout. J'ai beaucoup appris grâce à ton aide, même si je sais que je n'ai pas encore la capacité de mener un autre projet de ce type tout seul.
Je t'en suis très reconnaissant.
A te lire, bonne soirée.
 

Pièces jointes

  • Essai CL9 (4).xlsm
    339.6 KB · Affichages: 6

soan

XLDnaute Barbatruc
Inactif
Bonjour 974RE, le fil,

tout ce post #192 est pour le UserForm "Accueil".



pourquoi as-tu laissé :

VB:
Private Sub UserForm_Click()

End Sub

cette sub se déclenche quand on clique sur le formulaire ; mais elle ne fait aucune action, car elle ne contient aucune instruction VBA ; une sub vide ne sert à rien : elle est donc inutile, et tu peux la supprimer. :)


j'ai vu que si on clique sur le bouton "Fermer" du UserForm "Accueil", selon la valeur de la variable ok, ça ferme simplement le classeur ou ça quitte l'application Excel ; perso, j'trouve que dans les 2 cas, c'est un peu « brutal », et ça surprend ! en effet, on pense fermer seulement le formulaire "Accueil", et finalement, ça ferme le UserForm "Accueil" ET le classeur en cours, et même, si la variable ok est True, ça quitte Excel ! mais c'est ton choix, et si c'est ce que tu préfères, alors laisse comme c'est actuellement. 😉 d'un autre côté, même en laissant le même code VBA, note que c'est toujours possible de fermer le UserForm "Accueil" sans fermer le classeur et sans quitter Excel : au lieu de cliquer sur le bouton "Fermer", il suffit de cliquer sur la croix de fermeture du formulaire (située dans le coin supérieur droit) ; éventuellement, tu peux faire en sorte qu'un clic sur la croix de fermeture du UserForm ne fasse rien du tout ; l'utilisateur sera alors obligé de cliquer sur le bouton "Fermer" pour quitter le UserForm "Accueil" (et donc ça fera ce que tu auras choisi, selon la variable ok).​



au départ, ta sub est ainsi :

VB:
Private Sub FERMER_Click()
Dim ok As Boolean
ok = True
    If ThisWorkbook.Parent.Workbooks.Count > 1 Then ok = False
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    If ok = True Then Application.Quit Else ThisWorkbook.Close
End Sub



tu as mis cette instruction :

If ThisWorkbook.Parent.Workbooks.Count > 1 Then ok = False

le parent de ThisWorkbook est Application, donc ça revient à :

If Application.Workbooks.Count > 1 Then ok = False

comme Application est l'objet initial par défaut, tu peux mettre :

If Workbooks.Count > 1 Then ok = False



pour ceci :

VB:
ok = True
If Workbooks.Count > 1 Then ok = False

on peut l'abréger en :

VB:
ok = Workbooks.Count = 1

VBA évalue cette instruction comme si on avait écrit : ok = (Workbooks.Count = 1)

si y'a plus d'un classeur, Workbooks.Count est supérieur à 1 (car il vaut au moins 2), donc l'expression Workbooks.Count = 1 est fausse, donc la valeur de la variable ok est : FAUX.

si y'a un seul classeur, l'expression Workbooks.Count = 1 est vraie, donc la valeur de la variable ok est : VRAI.​



avec d'autres petits changements, ta sub pourrait s'écrire en 3 lignes ainsi :

VB:
Private Sub FERMER_Click()
  Dim ok As Boolean: ok = Workbooks.Count = 1
  Application.DisplayAlerts = 0: ThisWorkbook.Save
  If ok Then Application.Quit Else ThisWorkbook.Close
End Sub

note bien que If ok Then est la même chose que If ok = True Then

* si la valeur de la variable ok est True :
le test est VRAI ➯ ça exécute Application.Quit

* si la valeur de la variable ok est False :
le test est FAUX ➯ ça exécute ThisWorkbook.Close



comme tu sauvegardes le classeur avec ThisWorkbook.Save, alors même sans Application.DisplayAlerts = 0, il n'y a plus d'alerte pour demander s'il faut sauvegarder les changements apportés puisque justement tu viens tout juste de les sauvegarder ; donc ton instruction Application.DisplayAlerts = 0 devient inutile ➯ ta sub peut s'écrire en 2 lignes :​

VB:
Private Sub FERMER_Click()
  Dim ok As Boolean: ok = Workbooks.Count = 1: ThisWorkbook.Save
  If ok Then Application.Quit Else ThisWorkbook.Close
End Sub

et même, comme la variable ok est utilisée une seule fois, tu peux t'en passer :​

VB:
Private Sub FERMER_Click()
  ThisWorkbook.Save
  If Workbooks.Count = 1 Then Application.Quit Else ThisWorkbook.Close
End Sub

ça allège, hein ? 😜

soan
 
Dernière édition:

974RE

XLDnaute Occasionnel
Bonjour 974RE, le fil,

tout ce post #192 est pour le UserForm "Accueil".



pourquoi as-tu laissé :

VB:
Private Sub UserForm_Click()

End Sub

cette sub se déclenche quand on clique sur le formulaire ; mais elle ne fait aucune action, car elle ne contient aucune instruction VBA ; une sub vide ne sert à rien : elle est donc inutile, et tu peux la supprimer. :)


j'ai vu que si on clique sur le bouton "Fermer" du UserForm "Accueil", selon la valeur de la variable ok, ça ferme simplement le classeur ou ça quitte l'application Excel ; perso, j'trouve que dans les 2 cas, c'est un peu « brutal », et ça surprend ! en effet, on pense fermer seulement le formulaire "Accueil", et finalement, ça ferme le UserForm "Accueil" ET le classeur en cours, et même, si la variable ok est True, ça quitte Excel ! mais c'est ton choix, et si c'est ce que tu préfères, alors laisse comme c'est actuellement. 😉 d'un autre côté, même en laissant le même code VBA, note que c'est toujours possible de fermer le UserForm "Accueil" sans fermer le classeur et sans quitter Excel : au lieu de cliquer sur le bouton "Fermer", il suffit de cliquer sur la croix de fermeture du formulaire (située dans le coin supérieur droit) ; éventuellement, tu peux faire en sorte qu'un clic sur la croix de fermeture du UserForm ne fasse rien du tout ; l'utilisateur sera alors obligé de cliquer sur le bouton "Fermer" pour quitter le UserForm "Accueil" (et donc ça fera ce que tu auras choisi, selon la variable ok).​



au départ, ta sub est ainsi :

VB:
Private Sub FERMER_Click()
Dim ok As Boolean
ok = True
    If ThisWorkbook.Parent.Workbooks.Count > 1 Then ok = False
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    If ok = True Then Application.Quit Else ThisWorkbook.Close
End Sub



tu as mis cette instruction :

If ThisWorkbook.Parent.Workbooks.Count > 1 Then ok = False

le parent de ThisWorkbook est Application, donc ça revient à :

If Application.Workbooks.Count > 1 Then ok = False

comme Application est l'objet initial par défaut, tu peux mettre :

If Workbooks.Count > 1 Then ok = False



pour ceci :

VB:
ok = True
If Workbooks.Count > 1 Then ok = False

on peut l'abréger en :

VB:
ok = Workbooks.Count = 1

VBA évalue cette instruction comme si on avait écrit : ok = (Workbooks.Count = 1)

si y'a plus d'un classeur, Workbooks.Count est supérieur à 1 (car il vaut au moins 2), donc l'expression Workbooks.Count = 1 est fausse, donc la valeur de la variable ok est : FAUX.

si y'a un seul classeur, l'expression Workbooks.Count = 1 est vraie, donc la valeur de la variable ok est : VRAI.​



avec d'autres petits changements, ta sub pourrait s'écrire en 3 lignes ainsi :

VB:
Private Sub FERMER_Click()
  Dim ok As Boolean: ok = Workbooks.Count = 1
  Application.DisplayAlerts = 0: ThisWorkbook.Save
  If ok Then Application.Quit Else ThisWorkbook.Close
End Sub

note bien que If ok Then est la même chose que If ok = True Then

* si la valeur de la variable ok est True :
le test est VRAI ➯ ça exécute Application.Quit

* si la valeur de la variable ok est False :
le test est FAUX ➯ ça exécute ThisWorkbook.Close



comme tu sauvegardes le classeur avec ThisWorkbook.Save, alors même sans Application.DisplayAlerts = 0, il n'y a plus d'alerte pour demander s'il faut sauvegarder les changements apportés puisque justement tu viens tout juste de les sauvegarder ; donc ton instruction Application.DisplayAlerts = 0 devient inutile ➯ ta sub peut s'écrire en 2 lignes :​

VB:
Private Sub FERMER_Click()
  Dim ok As Boolean: ok = Workbooks.Count = 1: ThisWorkbook.Save
  If ok Then Application.Quit Else ThisWorkbook.Close
End Sub

et même, comme la variable ok est utilisée une seule fois, tu peux t'en passer :​

VB:
Private Sub FERMER_Click()
  ThisWorkbook.Save
  If Workbooks.Count = 1 Then Application.Quit Else ThisWorkbook.Close
End Sub

ça allège, hein ? 😜

soan
Bonjour Soan,
Superbe démonstration, j'en prends bonne note.
Tu a raison pour le bouton Fermer. Je vais le laisser comme avant: fermeture de l'Usf Accueil.
On peut effectivement avoir besoin de fermer l'Usf, mais pas le classeur.
Cela est d'autant plus vrai qu'à terme, j'envisage d'intégrer la gestion financière dans ce classeur (Plan de Trésorerie, Dépenses recettes....). L'Usf accueil qui reste ouvert limitera la visibilité de certains tableaux.
Soan, si je peux me permettre de te solliciter à nouveau, j'ai un soucis d'affichage de textbox sur un autre de mes fichiers, ainsi qu'un problème de beug si les cellules de mon tableau sont vides.
Si tu as un moment, sans vouloir abuser, tu pourrais y jeter un œil s'il te plaît?
Dans tous les cas je te remercie pour toute l'aide que tu m'as apporté dans ce projet.
Merci pour ta gentillesse et ta patience.
 

Pièces jointes

  • Essai Contrôle Facturation Mai 2021.xlsm
    156.3 KB · Affichages: 6

soan

XLDnaute Barbatruc
Inactif
Bonjour 974RE,

pour ta nouvelle demande, je veux bien t'aider ; mais pour ne pas tout mettre dans le même fil, tu devrais créer un nouveau sujet.

même si tu as une 1ère feuille "Présentation", ça a tout l'air d'être sur le tableau de la 2ème feuille "Controle" qu'il faut travailler ; tu as 3 UserForm, et ça a tout l'air d'être le UserForm "Modifier" sur lequel il faut vérifier les TextBox ; lesquelles ? celles des 12 mois ? si autres, lesquelles ? quelle est la procédure que tu suis ?

quel est au juste le problème d'affichage rencontré ? il manque des infos ? ou au contraire y'en a en trop ? ou y'a quelle donnée à la place de quelle autre ? l'écran clignote comme si c'était un sapin de Noël ? l'affichage devient flou ? ne t'inquiètes pas si t'as ce message, c'est normal : « Ce n'est pas une défaillance de votre moniteur. N'essayez donc pas de régler l'image. Nous maîtrisons à présent toutes les retransmissions. Nous contrôlons à présent les horizontales et les verticales. Nous pouvons vous noyer sous un millier de chaînes ou dilater une simple image jusqu'à lui donner la clarté du cristal, et même au-delà... Nous pouvons modeler votre vision et lui fournir tout ce que votre imagination peut concevoir. Pendant l'heure qui vient, nous contrôlerons tout ce que vous allez voir et entendre. Nous partagerons les angoisses et les mystères qui gisent dans les plus profonds abysses... au-delà du réel. » ; ça signifie juste qu'une des meilleures séries de science-fiction s'est invitée sur ton PC. (je te laisse deviner laquelle)

à quelle étape de ta procédure se produit ton problème d'affichage ? juste avant qu'une soucoupe volante t'a enlevé pour faire un voyage dans l'espace intergalactique de l'Univers ? c'est normal aussi : c'est comme dans le film "Rencontre du 3ème type".

même genre de description pour ton autre problème de bug en cas de cellules vides. (procédure suivie, et étape dans la procédure)

j'ai vu qu'il n'y a pas d'erreur de compilation (c'est bien, c'est toujours ça de gagné ! 😜) ; si y'a une erreur d'exécution, quel est le texte exact du message d'erreur ? quelle est la ligne du code VBA qui est sur fond jaune ?​

ça en fait des questions, hein ? 😁 😄

soan​
 
Dernière édition:

974RE

XLDnaute Occasionnel
Bonjour 974RE,

pour ta nouvelle demande, je veux bien t'aider ; mais pour ne pas tout mettre dans le même fil, tu devrais créer un nouveau sujet.

même si tu as une 1ère feuille "Présentation", ça a tout l'air d'être sur le tableau de la 2ème feuille "Controle" qu'il faut travailler ; tu as 3 UserForm, et ça a tout l'air d'être le UserForm "Modifier" sur lequel il faut vérifier les TextBox ; lesquelles ? celles des 12 mois ? si autres, lesquelles ? quelle est la procédure que tu suis ?

quel est au juste le problème d'affichage rencontré ? il manque des infos ? ou au contraire y'en a en trop ? ou y'a quelle donnée à la place de quelle autre ? l'écran clignote comme si c'était un sapin de Noël ? l'affichage devient flou ? ne t'inquiètes pas si t'as ce message, c'est normal : « Ce n'est pas une défaillance de votre moniteur. N'essayez donc pas de régler l'image. Nous maîtrisons à présent toutes les retransmissions. Nous contrôlons à présent les horizontales et les verticales. Nous pouvons vous noyer sous un millier de chaînes ou dilater une simple image jusqu'à lui donner la clarté du cristal, et même au-delà... Nous pouvons modeler votre vision et lui fournir tout ce que votre imagination peut concevoir. Pendant l'heure qui vient, nous contrôlerons tout ce que vous allez voir et entendre. Nous partagerons les angoisses et les mystères qui gisent dans les plus profonds abysses... au-delà du réel. » ; ça signifie juste qu'une des meilleures séries de science-fiction s'est invitée sur ton PC. (je te laisse deviner laquelle)

à quelle étape de ta procédure se produit ton problème d'affichage ? juste avant qu'une soucoupe volante t'a enlevé pour faire un voyage dans l'espace intergalactique de l'Univers ? c'est normal aussi : c'est comme dans le film "Rencontre du 3ème type".

même genre de description pour ton autre problème de bug en cas de cellules vides. (procédure suivie, et étape dans la procédure)

j'ai vu qu'il n'y a pas d'erreur de compilation (c'est bien, c'est toujours ça de gagné ! 😜) ; si y'a une erreur d'exécution, quel est le texte exact du message d'erreur ? quelle est la ligne du code VBA qui est sur fond jaune ?​

ça en fait des questions, hein ? 😁 😄

soan​
Merci Soan,
Je vais créer un nouveau fil de discussion dans lequel je vais t'apporter toutes les réponses nécessaires.
 

Discussions similaires

Réponses
12
Affichages
282