XL 2021 Calendrier DTPiker

  • Initiateur de la discussion Initiateur de la discussion Bruce68
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Hello,

un autre qui a fait l'objet d'une discussion récente et d'améliorations
Bonjour,

pour info, le code plante sur cette ligne: PPX = 72 / AppDpi, dans la procédure 'initialize' du calendrier (erreur: division par zéro).
Et ce, sur Windows 7 64 bits / Excel 2010 32 bits.
ok, j'ai compris qu'on doit utilisé l'autre fonction "Private Function AppDpi() As Long".
Je trouve que c'est un peu foireux, lorsqu'on passe d'une machine win7 à win10 et inversement.
n'aurait-il pas fallu créer une fonction pour les 2 cas?!
Bon week-end.
 
Dernière édition:
Bonjour,
Un autre calendrier sans userform :
 
Bonjour le forum,
Nous sommes beaucoup à utiliser des calendriers perso par UserForm.
Oui et les DatePickers sont toujours très compliqués alors qu'insérer une date ce n'est pas grand-chose.

Si vous voulez un UserForm simple vous pouvez utiliser le fichier joint avec ce code :
VB:
Private Sub ComboBox3_Change()
Dim dat$
If ComboBox1.ListIndex = -1 Or ComboBox2.ListIndex = -1 Or ComboBox3.ListIndex = -1 Then ComboBox3 = "": Exit Sub
dat = Right(ComboBox3, 2) & "/" & ComboBox2 & "/" & ComboBox1
If IsDate(dat) Then ActiveCell = CDate(dat): Unload Me
End Sub

Private Sub ComboBox3_Enter()
Dim i%, dat As Date, jour$, a$(), n%
If ComboBox1.ListIndex = -1 Or ComboBox2.ListIndex = -1 Then ComboBox3.Clear: Exit Sub
For i = 1 To 31
    dat = DateSerial(ComboBox1, ComboBox2, i)
    jour = Application.Proper(Left(Format(dat, "ddd"), 2)) & " " & Format(i, "00")
    If Month(dat) = Val(ComboBox2) Then ReDim Preserve a(n): a(n) = jour: n = n + 1
Next
ComboBox3.List = a: ComboBox3.DropDown
End Sub

Private Sub UserForm_Initialize()
Dim a(10), b(11), i%
For i = 0 To UBound(a): a(i) = CStr(Year(Date) - 1 + i): Next
ComboBox1.List = a
For i = 0 To UBound(b): b(i) = Format(i + 1, "00"): Next
ComboBox2.List = b
ComboBox1 = Year(Date): ComboBox2 = Format(Month(Date), "00")
End Sub
A+
 

Pièces jointes

Bonjour @Nain porte quoi
Le truc c'est que je lui ai déjà repondu
On utilise getdpifromwindow (api qui est apparu qu'à partir de Windows 10)
Donc tous ceux qui tournent encore sur w7 auront cette erreur
la réponse que j'avais donné
1769252532577.png


Quant au fait de gerer éventuellement les deux versions a l'heure ou il n'y a plus de mise ajour Win10 je ne vois pas pourquoi je m'ennuierais à faire des codes a bretelles pour Win 7
déjà je donne une solution c'est déjà pas mal
ce calendrier a été fait en collaboration avec @Rheeem ou nous avons décidé des méthodes pour coller aux versions excel les plus récentes. excel 2007 et windows7 ;il faudrait peut être penser à changer
car ca devient de plus en plus difficile de maintenir en faisant des passerellse pour win 7 et ou excel 2007
Et surtout ça fait des codes sales
 
Dernière édition:
Bonjour tout le monde,
Le truc c'est que je lui ai déjà repondu
En es-tu sûr?
faire des codes a bretelles pour Win 7
déjà je donne une solution c'est déjà pas mal
C'est tout à ton honneur.
ca devient de plus en plus difficile de maintenir en faisant des passerellse pour win 7 et ou excel 2007
Je suis tout à fait d'accord avec toi.
Cependant, on est parfois obligé de faire avec.
En effet, dans mon cas j'aide une association bénévolement et gracieusement.
Mon budget étant très limité, je me contente du win7 et office 2010.
Alors que l'association tourne sous win10. Si les codes plantes en passant d'une machine à l'autre, autant ne pas coder.
Donc un code qui fonctionne pour n'importe quelle version m'intéresse.

Je n'ai fait qu'une suggestion. Ne te prend pas la tête pour moi.
j'utilise depuis un bon bout de temps l'un de tes premier calendrier autonome.
Que j'ai customisé à mon goût (tu n'étais très content qu'on touche à tes codes).

Je partage la solution trouvée par le fils de mon voisin (fusion des 2 procédures pour win10 et win7).
la nouvelle procédure fonctionne bien (plus de plantage).
VB:
''pour les utilisateur de Win10 et +
'Private Function AppDpi() As Long
'    'AppDpi = 96
'    On Error Resume Next
'    AppDpi = GetDpiForWindow(Application.hWnd)
'End Function
'
''pour les utilisateur de Win 7
'Private Function AppDpi() As Long
'    With ActiveWindow.Panes(1)
'        AppDpi = ((.PointsToScreenPixelsX(7200) - .PointsToScreenPixelsX(0)) / 7200) * 72
'    End With
'End Function

'pour Win10 et Win7
Private Function AppDpi() As Long
   Dim dpi As Long
   On Error Resume Next
   ' Tentative Windows 10+
   dpi = GetDpiForWindow(Application.hWnd)
   On Error GoTo 0
   ' Si l'appel API échoue ou renvoie 0 ==> fallback Windows 7
   If dpi <= 0 Then
      On Error Resume Next
      With ActiveWindow.Panes(1)
         dpi = ((.PointsToScreenPixelsX(7200) - .PointsToScreenPixelsX(0)) / 7200) * 72
      End With
      On Error GoTo 0
   End If
   ' Si toujours 0 ==> valeur par défaut (Win7 = 96 DPI)
   If dpi <= 0 Then dpi = 96
   AppDpi = dpi
End Function

Bon week-end.
 
Mr le prend mal par ce qu'on luimet ses erreurs sous le nez
tu partage que quand tu crois avoir raison toi

regarde j'explique doucement
win7 64 excel (2010 ou plus) en 32 on est donc en vba 7
parti de la le long est en defaut puisque c'est longptr

win 10 ou 11 (excel 2010 ou plus) en 32 bit on est en vba 7
donc je resume
le #if win64 ne servira à rien sur win 7 par ce c'est exel qui prend la main sauf que pour 2010 et plus c'est longptr et pas long
le #if vba7 même punition pour la même raison
conclusion
essayer de merger 3 problématiques (version Win , version vba , misxte n'est pas possible sans faire de bretelles supplémentaires

d'après toi pourquoi je ne t'ai pas proposé la fusion
justement pour éviter de faire du code sale

la seule solution la plus propre et encore pour moi c'est encore sale ce serait de faire un if sur application.operatingsystem
et l'on forcerait le long tantpis sur win 7 de toute manière pas d'autre choix pour vraiment bien faire les choses

pour moi la solution la plus propre serait encore celle ci bien que
VB:
Private Function AppDpi() As Long
     Dim dpi As Long
      If Application.OperatingSystem Like "*NT 6.01" Then
         With ActiveWindow.Panes(1)
            dpi = ((.PointsToScreenPixelsX(7200) - .PointsToScreenPixelsX(0)) / 7200) * 72
        End With
    Else
        Dim HwndX As LongPtr
        HwndX = Application.hWnd
        dpi = GetDpiForWindow(HwndX)
    End If
    AppDpi = dpi
End Function
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
275
D
  • Question Question
Réponses
5
Affichages
179
Didierpasdoué
D
  • Question Question
Microsoft 365 Graphique
Réponses
3
Affichages
160
Retour