Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/09/2011, 16h27   #1
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Par défaut Centrer image sur userform

Bonjour,

Sur un classeur, j'affiche en plein écran un userform comportant un contrôle image. Concernant le plein écran, j'ai réussi à trouver un code qui récupère les variables de configuration de l'écran. En revanche, selon l'écran et sa résolution, le contrôle image a tendance à bouger ! Ou plutôt le contraire, lui ne s'adapte pas au changement d'écran. Pensez-vous qu'il soit possible de le centrer sur le userform quelque soit le type d'écran, et si oui, comment ?

Je tiens à préciser que dans les propriétés de l'image, j'ai déjà placé fmPictureAlignmentCenter et fmPictureSizeModeZoom, mais cela ne résout pas le problème.

Merci d'avance.
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 18h07   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 620
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 620
Points : 30 954
Points : 30 954
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Un code ce ce style à adapter à tes noms (ici c'est les noms par défaut) devrait le faire :

Code :
1
2
3
4
5
6
Private Sub UserForm_Initialize()
    With Me.Image1
        .Top = (Me.InsideHeight - Me.Image1.Height) / 2
        .Left = (Me.InsideWidth - Me.Image1.Width) / 2
    End With
End Sub
Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 13h31   #3
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Bonjour Philippe,

Merci pour ta réponse.
Je viens de tester ton code, malheureusement il ne fonctionne pas du tout.. Je l'ai essayé uniquement sur mon poste pour le moment, et là l'image sur le userform est totalement décalée sur la droite, si bien qu'on ne la voit pas entièrement.

Au besoin, je peux fournir un fichier exemple pour constater.
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 13h51   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Fait voir le code qui te permet de te-dimensioner l'userform..
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 14h35   #5
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Bonjour bbil,

Voici:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub UserForm_Initialize()
 Dim hWnd As Long, exLong As Long, zFactor As Integer
 
 hWnd = FindWindowA(vbNullString, Me.Caption)
 exLong = GetWindowLongA(hWnd, -16)
 If exLong And &H880000 Then SetWindowLongA hWnd, -16, exLong And &HFF77FFFF
 Me.Width = ScreenWidth * PointsPerPixel
 Me.Height = ScreenHeight * PointsPerPixel
 
 With Me.Image1
    .Top = (Me.InsideHeight - Me.Image1.Height) / 2
    .Left = (Me.InsideWidth - Me.Image1.Width) / 2
 End With
 End Sub
Et dans un module:

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
Private Declare Function GetSystemMetrics Lib "User32" (ByVal nIndex As Long) As Long
Private Const SM_CXSCREEN = 0 'Screen width
Private Const SM_CYSCREEN = 1 'Screen height
 
Private Declare Function GetDC Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Declare Function ReleaseDC Lib "User32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
'
Private Const LOGPIXELSX = 88 'Pixels/inch in X
'
'A point is defined as 1/72 inches
Private Const POINTS_PER_INCH As Long = 72
 
'The width of the screen, in pixels
Public Function ScreenWidth() As Long
ScreenWidth = GetSystemMetrics(SM_CXSCREEN)
End Function
 
'The height of the screen, in pixels
Public Function ScreenHeight() As Long
ScreenHeight = GetSystemMetrics(SM_CYSCREEN)
End Function
 
'The size of a pixel, in points
Public Function PointsPerPixel() As Double
Dim hDC As Long
Dim lDotsPerInch As Long
hDC = GetDC(0)
lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
ReleaseDC 0, hDC
End Function
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 14h52   #6
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
pas de problème avec ce code ...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 14h57   #7
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Tu obtiens bien une image centrée sur le userform ? Et ce quelque soit la résolution de l'écran ? Je confirme que pour moi ça ne passe pas, décalage sur la droite..

Je ne te propose pas de t'envoyer le fichier, je crois que tu es de ceux qui ne les ouvre pas non ?

Edit:

Quelques détails complémentaires: je viens de faire un autre test, en affichant directement le userform à la fin de la procédure d'initialisation. Là, en effet, ça fonctionne, j'ai bien l'image parfaitement centrée !
En fait, ça ne marche plus quand je clique sur la feuille graphique, sur laquelle j'ai placé le code suivant:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private Sub Chart_Activate()
 
'Affichage du graphe dans une popup en plein écran
 
Dim fname As String
Dim ch As Chart
Dim t As Double, h As Double, l As Double, w As Double
 
fname = ThisWorkbook.Path & "\ Ch.bmp"
Set ch = ActiveChart
ch.Export fname, "Bmp"
popupIndicateur.Image1.Picture = LoadPicture(fname)
Kill fname
 
Application.WindowState = xlMinimized
Application.Visible = False
 
popupIndicateur.Show 0
 
End Sub
Mais on se rapproche du résultat je pense ! Alors, curieux que ça ne passe pas comme ça non ?

Edit 2: Je rajoute même que c'est le fait de mettre une copie image du graphe qui change la donne.. On peut contourner une partie du problème en sortant l'autosize du contrôle image, mais du coup j'obtiens un graphe image bien plus petit, et moins lisible...
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 13h37   #8
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
ben en chargeant l'image tu modifie la taille du contrôle image .. il faut relancer le code de centrage de philippe ...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 17h13   #9
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Pourtant, je n'ai pas l'impression:

- Dans le code de la page graphique, je commence par charger l'image, puis je fais popupIndicateur.Show 0.

- Et dans le code d'initialisation de popupIndicateur, j'y ai placé le code de Philippe.

Comment tu vois les choses ?
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 18h28   #10
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Le code d'initialisation ce fait au chargement de ton userform (load..) ce chargement est effectué automatiquement par VB lorsque tu accède au objet sur ton Userform.. (image..)

et donc le code d'initialisation s'effectue .. puis c'est le load Picture...

si tu ne définit pas d'image par défaut tu peu visualiser cela, tu rajoute la ligne suivante
Code :
1
2
3
 
  If Me.Image1.Picture Is Nothing Then MsgBox "pas d'image de chargée dans Init" Else MsgBox "Image chargée dans Init"
 With Me.Image1
avant le With Image ... de ton Initiate ..

et dans activate :

Code :
1
2
3
4
5
6
7
Private Sub UserForm_Activate()
If Me.Image1.Picture Is Nothing Then MsgBox "pas d'image de chargée dans Activate" Else MsgBox "Image chargée dans Activage"
 With Me.Image1
    .Top = (Me.InsideHeight - Me.Image1.Height) / 2
    .Left = (Me.InsideWidth - Me.Image1.Width) / 2
 End With
End Sub
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 14h39   #11
Membre du Club
 
Avatar de m@tix
 
Inscription : octobre 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 290
Points : 42
Points : 42
Bonjour bbil,

Ton idée de passer avec les msgbox est très bien, ça m'a en effet permis de me rendre compte que l'image n'était pas chargée alors que je faisais les réglages !

Du coup, en suivant tes conseils, ça marche à présent parfaitement.

Merci pour ton aide, précieuse.
m@tix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h30.


 
 
 
 
Partenaires

Hébergement Web