Icône de la ressource

VBA - Vertical Scroll en ComboBox, ListBox et TextBox (ActiveX en Feuille et en UserForm) V13

cathodique

XLDnaute Barbatruc
Bonjour @cathodique,
Manifestement la fonction API GetDpiForWindow() n'est pas dans la bibliothèque User32 de Windows 7.
Dans la V13, je suis revenu sur les API "classiques" pour ces fonctions GetDC() / ReleaseDC() / GetDeviceCaps() pour la compatibilité Window 7.
Re, c'est la dernière version que j'ai téléchargé. à moins que tu n'aies fait la correction juste après mon message.

Bon dimanche
 

Dudu2

XLDnaute Barbatruc
Tu as téléchargé la V12 qui plantait en Windows 7.
La V13 je viens de la mettre après avoir modifié suite à ton message de plantage.
La fonction en erreur sur Windows 7 GetDpiForWindow() n'y est plus.
 

cathodique

XLDnaute Barbatruc
Tu as téléchargé la V12 qui plantait en Windows 7.
La V13 je viens de la mettre après avoir modifié suite à ton message de plantage.
La fonction en erreur sur Windows 7 GetDpiForWindow() n'y est plus.
Merci. Mais plantage à l'ouverture du fichier dans la procédure
Private Sub PreventTextBoxFirstTimeScrollDown(TextBox As MSForms.TextBox). Voici en image le message d'erreur et la ligne d'erreur.
Erreur sur V13.JPG

Ligne Erreur sur V13.JPG
 

Dudu2

XLDnaute Barbatruc
Ah oui, alors là, ça me dépasse un peu !
Est-ce que tu peux à titre de test remplacer ActiveWindow.hwnd par Application.hwnd ?
Je m'attends encore à des surprises avec Windows 7 !
 

cathodique

XLDnaute Barbatruc
Ah oui, alors là, ça me dépasse un peu !
Est-ce que tu peux à titre de test remplacer ActiveWindow.hwnd par Application.hwnd ?
Je m'attends encore à des surprises avec Windows 7 !
C'est parfait. Plus de plantage à l'ouverture du fichier et la roulette fonctionne bien pour tous les contrôles que tu as mis dans ton fichier (V13).

Merci beaucoup.
 

Dudu2

XLDnaute Barbatruc
Merci à toi pour ce test en Windows 7 qui a permis de rendre fonctionnel le Scroll pour ce système d'exploitation.
Je vais corriger la V13 pour y inclure cette dernière modif.
 

patricktoulon

XLDnaute Barbatruc
Ah oui, alors là, ça me dépasse un peu !
Est-ce que tu peux à titre de test remplacer ActiveWindow.hwnd par Application.hwnd ?
Je m'attends encore à des surprises avec Windows 7 !
non ce n'est pas une surprise du tout
depuis 2010 la gestion MDI des fenêtres a changé et sur windows 7 l'activewindow te donne la window active a l'intérieur de l'application aujourd'hui window(x) c'est la fenêtre tout entière d'excel comme l'activewindow d'ailleurs ca c'est parce que tu t es habitué a variabilisé la fenêtre avec "window"dans tes fonctions alors q'il faudrait utiliser app....hwnd

cette petite démo devrait pouvoir t'aider a saisir la subtilité
comme tu le constatera le handle sera le même
mais la considération window de excel s'arrête là
sur windows 7 l'erreur sera inverse quoi que je ne m'en souvient plus
VB:
Sub test()
    mafonction Application
End Sub
Sub test2()
    mafonction ActiveWindow
End Sub
Function mafonction(window)
    MsgBox window.Hwnd'plante sur W7 avec activewindow(il faut findwindowwexpour son handle)
    MsgBox window.Zoom'plante avec application sur excel 2007
End Function

Sub EtOnEnfonceLeClou()
MsgBox Application.Windows(1).Hwnd
End Sub
'autrement dit application  a bien un membre collection windows mais tu aura les handle des workbook si il y en a plusieurs
donc Attention dans ton codage évite des variables ou argument du style "Window"
de plus avec "As Window"
j'ai vu que tu l'utilisait souvent
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Je vais peut-être créer un sujet à ce propos pour approfondir car il y a de nombreuses variantes:
- Application.hWnd
- ActiveWindow.hWnd
- Workbook.Windows(i).hWnd
- Windows(Workbook.Name).hWnd
 

patricktoulon

XLDnaute Barbatruc
oui ça c'est apres 2007
- Application.hWnd --->W7 oui
- ActiveWindow.hWnd --->W7 non
- Workbook.Windows(i).hWnd --->W7 non
- Windows(Workbook.Name).hWnd --->W7 non

je répète
2007 "windows" membre collection window(FILLE) de l'application
2007 "activeWindow"membre window(FILLE) de l'application celle qui est active

2010 &+ "windows" membre collection d'exemplaire de l'application(en gros des classeurs)

2010 &+ "Activewindow" membre de l'application (en gros le classeur actif)

et c'est bien là le soucis car pour toutes les autres considérations VBA (par exemple pour les display) le "Window" ou activeWindow est considéré comme pour 2007

on marche sur la tête 🤣
 

patricktoulon

XLDnaute Barbatruc
tu comprends maintenant pourquoi je te conseille de ne pas faire ce genre de trucs
VB:
function trucbidule(Window)
end function
ajoute une lettre devant ou un tiret en deux syllabes mais pas "Window" ni avec le "s" d'ailleurs
pour l'application je ferait par exemple
VB:
function trucbidule(AppWindow)
end function
et je te parle même pas du membre ".windows" de shell 🤣 🤣
allez je sort 🤣
 

patricktoulon

XLDnaute Barbatruc
tiens voila une capture 2007 parlantes
affichage de 2 feuilles en windowstate xlnormal
ces deux fenêtres sont les windows(1) et windows(2) de l'application
1736106363691.png



la même chose avec 2013 et +
1736106666390.png
 

Discussions similaires

Statistiques des forums

Discussions
315 260
Messages
2 117 856
Membres
113 354
dernier inscrit
caillet