SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 juin 2012
-
30 mars 2012 à 10:28
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018
-
4 avril 2012 à 10:02
Bonjour à tous,
Une nouvelle question me taquine l'esprit et j'aimerais en savoir plus...
Dans une feuille Excel j'ai un contrôle image (Contrôle ActiveX). C'est un objet de type OLEObject. Je charge une image BitMap dans ce contrôle et j'aimerais savoir quels en sont la largeur et la hauteur de l'image qui est chargée.
J'ai fait des recherches sur le net et malgré plusieurs questions sur le sujet, je n'ai pas trouvé beaucoup de réponses.
Je suis tout de même parvenu à trouver une solution qui fonctionne bien. Mais le code employé ne me parais pas le plus adapté à mon cas de figure. C'est pourquoi je préfère demander ici, s'il existe une autre méthode plus en adéquation.
Je précise que je ne charge par une image dans un contrôle image pour en obtenir la largeur et la hauteur. Je charge l'image dans le contrôle pour la suite de mon projet. Et je me dis que si l'image doit être chargée, alors autant en profiter pour en extraire les données que je veux. Or actuellement le code que j'emploie ne passe pas du tout par le contrôle image mais directement par la ré-ouverture du fichier via Open For Binary Access.
Voici le code qui génère le contrôle image :
'= =========================================================================================================================
Dim Contrôle_Image1 As OLEObject
'=================================================================
'Création, insertion, placement et dimensionnement d'un object sur la feuille (Contrôle image dans cet exemple)
'Set Contrôle_Image1 ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)
'=============================================================
'On contrôle ensuite ici l'ensemble des propriétés de l'objet sur lequelles ont souhaite agir
'Contrôle_Image1.Name "Image1"
Contrôle_Image1.Left = Range("R7").Left
Contrôle_Image1.Top = Range("R7").Top
Contrôle_Image1.Width = Range("R7:T5").Width
Contrôle_Image1.Height = Range("R7:T15").Height
Contrôle_Image1.Placement = xlMoveAndSize
Contrôle_Image1.PrintObject = True
Contrôle_Image1.Object.Picture = LoadPicture(Fichier_Image)
Contrôle_Image1.Object.PictureAlignment = 2
Contrôle_Image1.Object.PictureSizeMode = 3
Contrôle_Image1.Object.BackStyle = 0
Contrôle_Image1.Object.SpecialEffect = 6
'==========================================================================================================================
Voici le code que j'ai trouvé et qui permet d'obtenir la largeur et la hauteur :
Private Type BITMAPFILEHEADER
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long '<--------------
biHeight As Long '<--------------
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Public Sub test()
Open Fichier_Image For Binary Access Read Write Lock Write As #1
Dim BMPFileHeader As BITMAPFILEHEADER
Dim BMPInfoHeader As BITMAPINFOHEADER
Get #1, 1, BMPFileHeader
Get #1, , BMPInfoHeader
Largeur = BMPInfoHeader.biWidth
Hauteur = BMPInfoHeader.biHeight
End Sub
Comment puis-je améliorer ce code pour le rendre le plus simple simple possible ?
Il me semble qu'il est possible d'utiliser le type suivant :
Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Puis d'obtenir la largeur et la hauteur avec :
Dim bmAPI As BITMAP
With bmAPI
Largeur = .bmWidth:
Hauteur = .bmHeight:
End With
Ce code est simple, mais je ne parviens pas à l'utiliser dans mon cas de figure.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 1 avril 2012 à 08:11
Voilà pour XP : comme pour Vista, mais choisir Apparence et thèmes ===>> modifier la résolution de l'écran ===>> Avancé ===>> général ===>> modifier la DPI
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
MarcPL
Messages postés172Date d'inscriptionjeudi 8 décembre 2011StatutMembreDernière intervention21 juillet 20132 1 avril 2012 à 12:20
Sauf qu'après l'avoir augmenté puis redémarré mon portable de test sous XP, la propriété PixelPerInch dans Excel n'a pas bougé, donc pas d'incidence pour ma conversion de points en pixels ...
Le portable sous Seven est monopolisé par mon aÎnée, je ne pourrai pas le tester aujourd'hui.
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
MarcPL
Messages postés172Date d'inscriptionjeudi 8 décembre 2011StatutMembreDernière intervention21 juillet 20132 1 avril 2012 à 12:24
Précision : après avoir redémarrer le PC, les icônes et les polices étaient donc bien plus gros
mais la résolution du fond d'écran n'a pas bougé, idem dans mes images d'un classeur Excel ...
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 1 avril 2012 à 13:33
Le problème reste identique, MarcPL :
- ou, pour une même session de Windows, ce paramètre est modifié (et fausse alors tes calculs)
- ou tu le rétablis systématiquement (et viens contrecarrer) la configuration éventuellement choisie.
Dans les deux cas : un conflit, à éviter. Et il est largement évitable.
Je vais donc m'atteler à "doter" VBA de tout ce dont dispose VB6, à l'identique.
Et il n'y aura plus, ainsi, ni conflit ni risque d'erreur.
Le coût ? Trois fois rien : deux fonctions dans un module bas.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
MarcPL
Messages postés172Date d'inscriptionjeudi 8 décembre 2011StatutMembreDernière intervention21 juillet 20132 1 avril 2012 à 21:28
Je viens de faire le test une seconde fois : la modif dans Windows ne fausse pas le calcul dans Excel ...
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 1 avril 2012 à 21:59
Mais elle le fausse si on modifie la propriété depuis Excel !
Cela reste donc dangereux et conflictuel, MarcPL.
Enfin ... fais comme tu l'entends (ce sont tes applis, pas les miennes).
J'ai quant à moi dit plus haut :
Je vais donc m'atteler à "doter" VBA de tout ce dont dispose VB6, à l'identique.
Et il n'y aura plus, ainsi, ni conflit ni risque d'erreur.
Le coût ? Trois fois rien : deux fonctions dans un module bas.
et j'ai pour habitude de m'atteler sans attendre à ce à quoi je dis vouloir m'atteler .
Le module est déjà bien avancé, à plus de 97 % (et ce qui est fait fonctionne sans faille).
Y sont déjà traitées toutes les conversions, de toutes les unités vers toutes les autres unités, y compris Char (assez particulier car calcul différent pour la hauteur et pour la largeur) et Himetric et tant horizontalement que verticalement et dans tous les sens imaginables et quelles que soient tant la résolution que le nombre de twips par pixel, même lorsque différents horizontalement et verticalement))
Me reste (fastoche) à offrir dans la foulée deux ou trois autre petites fonctions dans le même module et à en rédiger le mode d'emploi, puis à le déposer.
Son poids actuel n'est (pour l'instant) que de 2,37 kO (vraiment très peu) et je toute fort qu'il dépasse les 3 ko après mes rajouts. Il est par ailleurs extrêmement concentré et rapide.
Je pense que je déposerai tout cela demain après-midi.
Après : chacun en fera ce qu'il voudra ou l'ignorera (ce ne sera plus mon affaire, "comme d'hab", après 15 jours après le dépôt ).
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 3 avril 2012 à 10:10
Voilà qui est fait. Moins de 3 KO ===>>
Offre les équivalents VBA des "facilités" VB6 :
ScaleX, ScaleY, TwipsperPixelX, TwipsperPixelY, TextWidth, TextHeight, Screen.Width et Scree.Height.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient