Excellent boulot Patrick :ccool:
Version imprimable
Excellent boulot Patrick :ccool:
Attention tout de même car ce n'est parfois pas si simple.
http://arkham46.developpez.com/artic...vba64bits/#LIV
https://www.microsoft.com/en-us/down...s.aspx?id=9970
Salut Patrick,
j'ai réussi a adapter ton code a mon USF et ca marche
je modifie comme je le souhaitai en me placant dans l'angle de l'usf
Sur mon usf j'ai pas mal de labels qui sont rangés tous très correctement voir svp photo ci-jointe
Cependant quand j'agrandi l'usf ca déforme ou décale quelque peu l'alignement
de mes labels voir sur l'image j'ai mis des croix rouges pour repère
Quand je diminue l'usf le défaut ne se modifie en reprenant l'aspect initial
Je ne sait pas pourquoi ce soucis
j'ai compresser un bout de l'image te montrer sinon ca ne passe pas
Merci a toi bonne soirée
Cdlt Ray
peux tu poster juste ton usf sans les données juste les controls ?
je regarderais ca ;)
Salut Patrick
ok j'arrange ca et j'envoi pour jeudi demain absent toute la journée obligé
merci pour ton aide bonne soirée je regarde ca de suite pour m'avancer
PS: pour infos j'ai également fait l'essai sur pc portable écran 17 pouces
ca fait pareil.
mais ca marche
A plus tard merci beaucoup
Cdlt
@nibledispo,
Remplace le contenu du Module1 par ceci (un simple copié collé):
@ patricktoulon,Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 '********************************************************************************************************************** '* CREATEUR :Patrick toulon Alias chamalin1@msn.com * '* DATE :23/09/2010 * '* UTILISATION D'UNE SEULE API LE "USER32.DLL" * '* EXEMPLE DE USERFORM REDIMENTIONNABLE NOUVELLE VERSION * '* LES CONTROLS SONT REDIMENTIONNES EN MEME TEMPS * '* AINSI QUE LES FONT SIZE * '* * '* REVISION:21:02:2013(Modification de la gestion du font.size) * '*le font size est géré control par control ,il peuvent donc avoir un fontsize différent * '* REVISION:26:02:2013 (modification de la memorisation des dimention '*tout est dans le tag '* on ne cherche plus le handle de l'userform on se sert de l'api "getactivewindow" directement dans le ligne de modification des propertie de l'userform ' on ne se sert plus de l'api "getwindowslonga" non plus ,des nombre au format hex representant les properties sont directement injectées dans la ligne de modification '********************************************************************************************************************** Option Explicit #If VBA7 Then ' capture le handle de la fenetre Public Declare PtrSafe Function GAW Lib "user32" Alias "GetActiveWindow" () As LongPtr 'api pour changer le mode d affichage du userform et activer ou non la fenetre Public Declare PtrSafe Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long ' api pour changer le mode d affichage du userform et activer ou non la fenetre Public Declare PtrSafe Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long ' api pour garder la main sur le userform au cas ou on enleve la caption Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr Public Declare PtrSafe Function ReleaseCapture Lib "user32" () As Long ' api pour redresser l'affichage en cas de modification de la caption Public Declare PtrSafe Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As LongPtr) As Long ' api pour recupérer le style de la fenetre : GWLg Alias GetWindowLongPtrA/GetWindowLongA ' api pour appliquer le nouveau style a la fenetre (userform) : SWLA Alias SetWindowLongPtrA/SetWindowLongA #If Win64 Then Public Declare PtrSafe Function GWLg Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr #Else Public Declare PtrSafe Function GWLg Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr #End If 'capturer l'ecran Public Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr) ' api pour le presse papier (clipboard) Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long #Else ' capture le handle de la fenetre Public Declare Function GAW Lib "user32" Alias "GetActiveWindow" () As Long 'api pour changer le mode d affichage du userform et activer ou non la fenetre Public Declare Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 'api pour appliquer le nouveau style a la fenetre (userform) Public Declare Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long ' api pour garder la main sur le userform au cas ou on enleve la caption Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function ReleaseCapture Lib "user32" () As Long 'api pour redresser l'affichage en cas de modification de la caption Public Declare Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As Long) As Long ' api pour recupérer le style de la fenetre Declare Function GWLg Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 'cet api n'est plus utilisée car la variable modif est agrémenté dans le userform par un long au format hex 'Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 'capturer l'ecran Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) ' api pour le presse papier (clipboard) Public Declare Function CloseClipboard& Lib "user32" () Public Declare Function OpenClipboard& Lib "user32" (ByVal hwnd As Long) Public Declare Function EmptyClipboard& Lib "user32" () #End If Public Ctl As Object, ctrl As Object Public Properties Public redima As Boolean #If VBA7 Then Dim oldlong As LongPtr #Else Dim oldlong As Long #End If Function cliché(uf As Object) oldlong = GWLg(GAW, -16) ' on recupere le style actuel de la fenetre(bouton,caption ect...) SWLA GAW, -16, &H94080080: SWLA GAW, -20, &H0: DMB GAW 'on supprime la caption Dim retour As Long '--- Le presse-papiers --- retour = OpenClipboard(0) 'Ouvre If retour = 0 Then MsgBox "Impossible d'ouvrir le presse papier." Exit Function End If retour = EmptyClipboard 'Efface retour = CloseClipboard 'Ferme If retour = 0 Then MsgBox "Impossible de fermer le presse papier." Exit Function End If '-------------------------- keybd_event vbKeySnapshot, 1&, 0&, 0 ' fenêtre active On Error Resume Next Do Err.Clear DoEvents Sheets(1).Paste Loop Until Err = 0 On Error GoTo 0 SWLA GAW, -16, oldlong Selection.Name = "cliché de " & uf.Name End Function Function modif_userform(uf As Object, Optional modif As Long = &H94CF0080, Optional redims As Boolean = False) redima = redims 'on va memoriser le multiplicateur des dimention de l'usf par rapport a chaque controls dans leurs tags respectifs For Each ctrl In uf.Controls '* ctrl.Tag = uf.InsideWidth / (ctrl.Left + 0.01) & ":" & uf.InsideHeight / (ctrl.Top + 0.01) & ":" & uf.InsideWidth / ctrl.Width & ":" & uf.InsideHeight / ctrl.Height If TypeName(ctrl) <> "ScrollBar" And TypeName(ctrl) <> "Image" And TypeName(ctrl) <> "SpinButton" Then ctrl.Tag = ctrl.Tag & ":" & uf.InsideWidth / ctrl.Font.Size '* Next 'on applique les modification a la fenetre userform en une seule ligne SWLA GAW, -16, modif: SWLA GAW, -20, &H0: DMB GAW MsgBox Hex(GWLg(GAW, -16)) End Function Sub affichage_normal() ' on affiche le userform en plein ecran avec l'api showwindowa de la user32.dll _ bien moins lourd que mes versions precedente de maximisation de l'userform et plus rapide et plus propre '1= mode normal:3 =maximiser:6 =minimiser SWH GAW, 1 End Sub Sub affichage_plein_ecran() ' on affiche le userform en plein ecran avec l'api showwindowa de la user32.dll _ bien moins lourd que mes versions precedente de maximisation de l'userform et plus rapide et plus propre '1= mode normal:3 =maximiser:6 =minimiser SWH GAW, 3 End Sub Sub maForm_Resize(usf As Object) If redima = True Then 'ici on boucle sur tout les controls For Each Ctl In usf.Controls Properties = Split(Ctl.Tag, ":") 'et on applique le multiplicateur au controls pour la largeur et la hauteur en une seule ligne 'left,top,largeur,hauteur, Ctl.Move usf.InsideWidth / Properties(0), usf.InsideHeight / Properties(1), usf.InsideWidth / Properties(2), usf.InsideHeight / Properties(3) 'tout les controls qui ont le multiplicateur du font size enregistré dans leurs tags respectifs verront leur font size redimentionné en proportion If UBound(Properties) > 3 Then Ctl.Font.Size = Round(usf.InsideWidth / Properties(4), 0) Next usf.Repaint End If End Sub Sub deplacement(uf As Object) ReleaseCapture SendMessage GAW, &HA1, 2, 0& End Sub
:ccool:
Pas mal dutout pour la suppression du contour de l'UF. Sais-tu si il possible de supprimer le cadre + caption tout en conservant le redimensionnement (Elasticité) ? Pour obtenir une fenêtre un peu à la Excel 2013 sans bordure.
En tout cas, bon boulot.
Bonsoir Vcottineau et Nouveau2,
Merci pour vos apports.
Vcottineau : merci pour le le frère du dossier de Patrik écrit dans une langue que je comprends.
c'est dommage que le passage au 64 bit ne soit pas aussi simple. j'en viens à regretter d'avoir fait installer mon Excel 2013 en 64 bits qui semblait déjà déconseillé pour Excel 2010.
Nouveau2 : J'ai cru comprendre dans cet apport qu'Excel ferait lui même le choix selon qu'il est en 32 ou 64 bits.
Peut-être as tu ajouté autre chose que "ptrsafe". Je comparerai avec la version originale pour m'en assurer.
Pour ma gouverne, que signifie la # devant if, else et end if ? Je ne crois pas avoir déjà vu cela dans un code.
Cordialement.
Bonjour eliot.raymond.
Voici qui me semble répondre à ta demande.
J'ai tenu compte des remarques et conseils et de l'expérience de Patrick concernant, entre autres, le fontsize qui exige un traitement particulier.
Cordialement,
Docmarti
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 Dim Largeur_Actuelle Dim Hauteur_Actuelle Private Sub SpinButton1_Change() h = SpinButton1.Value Me.Move Me.Left, Me.Top, Me.Width, h End Sub Private Sub SpinButton2_Change() w = SpinButton2.Value Me.Move Me.Left, Me.Top, w, Me.Height End Sub Private Sub UserForm_Initialize() Largeur_Actuelle = Me.Width Hauteur_Actuelle = Me.Height Call sauverTag SpinButton2.Max = Application.Width SpinButton2.Value = Me.Width SpinButton2.Min = 10 SpinButton2.SmallChange = 5 SpinButton1.Max = Application.Height SpinButton1.Value = Me.Height SpinButton1.Min = 10 SpinButton1.SmallChange = 5 SpinButton1.Value = Me.Height SpinButton2.Value = Me.Width End Sub Sub sauverTag() On Error Resume Next For Each c In Me.Controls c.Tag = c.Width / c.FontSize Next End Sub Private Sub UserForm_Resize() On Error Resume Next For Each c In Me.Controls c.Width = c.Width * (Me.Width / Largeur_Actuelle) c.Height = c.Height * (Me.Height / Hauteur_Actuelle) c.Left = c.Left * (Me.Width / Largeur_Actuelle) c.Top = c.Top * (Me.Height / Hauteur_Actuelle) c.FontSize = c.Width / c.Tag + 0.01 Next Largeur_Actuelle = Me.Width Hauteur_Actuelle = Me.Height Me.Repaint 'repeint le userform End Sub
salut a tous, Forum
Bonjour Docmarti
Merci pour ta réponse et pour le code, je ferai l'essai de ton code en fin d'après midi je ne suis pas dispo jusqu'a 17 h
tu a vu mon dernier post adresser a l'ami Patrick concernant un petit souci sur l'usf une fois que l'on agrandie, j'ai joint une photo
je posterai mon fichier ce soir
je te souhaite une agréable journée
Merci pour ton aide
Cdlt Ray
re
Bonjour a tous
un petit plus pour l'ami nouveau2 qui a ajouté la gestion 64/32 bits
je n'ai pas essayé mais le code m'a l'air propre: cool:
maintenant avoir l'élasticité sans le cadre ni captions c'est possible mais c'est une autre astuce
Au plaisir:)
re
pour docmarti
il faut savoir que "on error resume next" ne résous pas tout
ici tu met
donc si j'ai 50 contrôles et que le 25 eme n'a pas cette propriété la boucle saute donc les 25 autres ne seront pas traitéCode:
1
2
3
4
5
6
7 Sub sauverTag() On Error Resume Next For Each c In Me.Controls c.Tag = c.Width / c.FontSize Next
tu vois ce que je veux dire ?
Re
une premiere solution pour nouveau2
avec les coordonnées de la souris déterminer quand l'élasticité doit être
ici un exemple :
Au plaisirCode:
1
2
3
4
5
6
7
8
9 'SI LA SOURIS SE TROUVE DANS L'ANGLE BAS A DROITE LE CADRE ELASTIQUE EST PRESANT SINON PAS DE CADRE Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) If x > Me.InsideWidth - 5 And y > Me.InsideHeight - 5 Then modif_userform Me, &H140F0101, True Else modif_userform Me, &H94080080, True End If End Sub
Non Patrick. Pas du tout. Ce que tu décris, c'est le comportement de On Error Goto. Tu peux vérifier avec la touche F8 que, après On Error Resume Next, le code ne s'arrête pas mais qu'il continue comme s'il n'avait pas rencontré d'erreur. C'est très utile car après une commande qui risque de provoquer une erreur, on peut peut vérifier si l'erreur attendue s'est produite par
Va voir l'aide de VBA au sujet de Resume Next qui dit :Code:
1
2
3 If Err <> 0 then End if
"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."
bonjour docmarti
Moi j'ai toujours appris que pour remettre le conteur d'erreur a zéro il fallait mettre juste en dessus de next 'on error goto 0"
sans ca je suis persuadé que la boucle est stoppée l'ors de l'erreur
j'ai eu d'ailleurs affaire a ce problème dans des modules plus complexes
mais je reste aussi persuadé que la gestion du problème avant l'erreur reste une meilleure solution
dans ce cas présent les exceptions sur les contrôles (sans font size) sont beaucoup mieux avec typename(nom du control)
A mediter
Au plaisir
Oui ou éventuellement un Err.Clear
il faut réservé le On Error à des scénarios bien défies une ouverture de fichier sur un serveur alors que le câble réseau est débranché par exemple!
il est préférable d'avoir une erreur et déguger que de ne pas avoir d'erreur et un résultat étrange.
Salut tout le monde,
@ PatrickToulon
Je crois que le GetActiveWindow n'est pas une superbe solution, le cadre de ma fenêtre VBE a été supprimé :mrgreen: en voulant essayer le code.
Sinon, le redimensionnement fonctionne bien :ccool: Parfait
--------------------------------------------------------------------------------
@nibledispo,
Oui LongPtr correspond à un Long en environnement 32 bit et un LongLong en environnement 64 bit. C'est un Alias de Type.Citation:
Nouveau2 : J'ai cru comprendre dans cet apport qu'Excel ferait lui même le choix selon qu'il est en 32 ou 64 bits.
Oui, PtrSafe ne suffit pas. Cette attribut est là pour protéger avant tout les systèmes 64 bit parce qu'un programme fait pour du 32 bit fera planter EXCEL si il n'est pas mis à jour.Citation:
Peut-être as tu ajouté autre chose que "ptrsafe". Je comparerai avec la version originale pour m'en assurer.
Pour la compilaton conditionnelle utilisant des constantes de compilation conditionnelle pour déclarer les bonnes variable avec les bons types de données en fonction de certaines constantes (VBA6, VBA7, Win32, Win64, MAC).Citation:
Pour ma gouverne, que signifie la # devant if, else et end if ? Je ne crois pas avoir déjà vu cela dans un code.
J'ai pris les 1ers liens:
http://msdn.microsoft.com/fr-fr/libr.../x435tkbk.aspx
http://msdn.microsoft.com/fr-fr/libr.../tx6yas69.aspx
bonjour nouveau2
si le cadre de l'editeur vbe a été supprimer tu a mal ecrit la commande dans le suserform lors de l'activate
edit
oui effectivement le getactivewindows n'est peut être pas la meilleure solution
utilise le findwindows avec une variable pour le handle
Au plaisir
Salut a tous, Forum
Salut Patrick
je t'envoie le fichier comme convenu hier soir, j'espere qu'il fonctionnera bien tel quel.
j'ai tester cette version cette après midi sur un autre PC (famille) et le probleme
est toujours pareil, ca ne tient pas compte de l'alignement.
Merci de ton aide, prends ton temps suis pas pressé.
A plus tard Patrick
Cdlt Ray
Re
bon je viens de tester ton fichier sans les références manquantes
et c'est rigolo chez moi pas de décalage tout est parfait
cependant si j'avais su je t'aurait orienté vers des listbox ou des listview
plutôt que faire des tableau avec des labels
A méditer
RE Patrick
Alors merci d'avoir regarder le fichier, c'est gentil
bon bah tant pis, si ca ne marche pas.
Pour ci dessous merci de tes intentions mais je ne saurai faire, j'ai déja passer beaucoup de temps sur ce bazar mais c'était pour me faire la main avec les USF
Surement mieux a faire mais je ne suis pas assez costaud en VBA, donc c'est déja pas mal pour moi
avec des exemples peut etre j'essairai de refaire pourquoi pas ????
Merci pour l'aide apporter, je vais continuer sans redimensionnement sniffCitation:
cependant si j'avais su je t'aurait orienté vers des listbox ou des listview
plutôt que faire des tableau avec des labels
Cordialemant Raymond
C'est le contraire. Après On Error Goto 0, la boucle est stoppée lors de l'erreur. Non seulement la boucle, mais la procédure elle-même est stoppée.
Car On Error Goto 0 supprime toute gestion d'erreur. Seul On Error Resume Next fait qu'une erreur ne provoque pas l'arrêt du code.
Je suis d'accord que la gestion du problème avant l'erreur reste la meilleure solution et même l'unique solution dans la plupart des cas.
Mais dans le cas présent, qui porte sur des objets, On Error Resume Next est la meilleure solution car il est difficile et fastidieux de prévoir toutes les possibilités d'erreurs avec des objets.
Bonjour Nouveau2,
J'ai trouvé la réponse aux deux questions que je te posais dans les documents proposés par Patrick (hélas pour moi en Anglais) et Vcottineau (heureusement pour moi en Français). Merci.
Je crois finalement, au vu des difficultés et de l'intérêt à peu près nul (pour moi) de la version 64 bit que je vais redemandé l'installation en 32 bits si Microsoft ne fait pas de difficulté.
Cordialement.