XL 2010 Compatibilité 32 - 64 bits

mécano41

XLDnaute Accro
Bonjour,

J'ai récupéré ce code qui a bien fonctionné jusqu'à présent. Mon ordi est en 64 bits mais ma version EXCEL (2010) est en 32 bits. Je viens de passer à quelqu'un un fichier contenant ce code, et il a le problème indiqué ci-dessous. Que puis-je modifier pour faire une seconde fonction qui fonctionne en 64 bits? Ensuite, comment faire pour que l'appli. choisisse entre les deux fonction?

(tout ceci sachant que je ne pourrai pas faire les essais en 64 bits moi-même)

Si nécessaire, je pourrai poster l'appli...

Cordialement

Le code complet :

Code:
Option Explicit

'-============= Code récupéré sur ExcelDownloads ============
' 14/11/2012
' myDearFriend!  -   www.mdf-xlpages.com
'---------------------------------------------------------------------------------------
'!* MODULE NAME:     Paste Picture
'!* AUTHOR & DATE:   STEPHEN BULLEN, Business Modelling Solutions Ltd.
'!*                  15 November 1998
'!* CONTACT:         Stephen@BMSLtd.co.uk
'!* WEB SITE:        http://www.BMSLtd.co.uk
'
'! un peu modifié par Thierry Pourtier (Ti) oct 2004
'---------------------------------------------------------------------------------------
Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

' -----
Private Type uPicDesc
  Size As Long
  Type As Long
  hPic As Long
  hPal As Long
End Type

' -----
Private Declare Function IsClipboardFormatAvailable& Lib "user32" (ByVal wFormat&)
Private Declare Function OpenClipboard& Lib "user32" (ByVal hWnd&)
Private Declare Function GetClipboardData& Lib "user32" (ByVal wFormat%)
Private Declare Function CloseClipboard& Lib "user32" ()
Private Declare Function OleCreatePictureIndirect& Lib "olepro32.dll" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle&, IPic As IPicture)
Private Declare Function CopyEnhMetaFile& Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc&, ByVal lpszFile$)
Private Declare Function CopyImage& Lib "user32" (ByVal handle&, ByVal un1&, ByVal n1&, ByVal n2&, ByVal un2&)

Const CF_BITMAP = 2, CF_PALETTE = 9, CF_ENHMETAFILE = 14
Const IMAGE_BITMAP = 0, LR_COPYRETURNORG = &H4
Const PICTYPE_BITMAP = 1, PICTYPE_ENHMETAFILE = 4

' -----
Private Function CreatePicture(hPic&, hPal&, lPicType&) As IPicture
Dim uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPicture
  With IID_IDispatch
    .Data1 = &H7BF80980
    .Data2 = &HBF32
    .Data3 = &H101A
    .Data4(0) = &H8B
    .Data4(1) = &HBB
    .Data4(2) = &H0
    .Data4(3) = &HAA
    .Data4(4) = &H0
    .Data4(5) = &H30
    .Data4(6) = &HC
    .Data4(7) = &HAB
  End With
  With uPicInfo
    .Size = Len(uPicInfo)
    .Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE)
    .hPic = hPic
    .hPal = IIf(lPicType = CF_BITMAP, hPal, 0)
  End With
  OleCreatePictureIndirect uPicInfo, IID_IDispatch, True, IPic
  Set CreatePicture = IPic
End Function

' -----
Function PastePicture(Optional lXlPicType& = xlPicture) As IPicture
Dim hPtr&, lPicType&, hCopy&
  lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)
  
  If IsClipboardFormatAvailable(lPicType) Then
    If OpenClipboard(0&) > 0 Then
      hPtr = GetClipboardData(lPicType)
      If lPicType = CF_BITMAP Then
        hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
      Else
        hCopy = CopyEnhMetaFile(hPtr, vbNullString)
      End If
      CloseClipboard
      If hPtr <> 0 Then Set PastePicture = CreatePicture(hCopy, 0, lPicType)
    End If
  End If
End Function
 

Pièces jointes

  • 427370d1607615621-calcul-excel-levage-d-une-passerelle-mecano41.jpg
    427370d1607615621-calcul-excel-levage-d-une-passerelle-mecano41.jpg
    92.6 KB · Affichages: 82

Phil69970

XLDnaute Barbatruc
Bonjour Mecano, le forum

Un peu de lecture devrait pouvoir t'éclairer





@Phil69970
 

patricktoulon

XLDnaute Barbatruc
bonsoir
si tu est en excel 32 bits tu ne devrais pas passer en déclaration 64 même si ton Windows est en 64
par contre si tu est en vba7 il te faudra passer en ptrsafe
j'ai des codes un peu plus light que ceux de stephen bullen
faut il encore savoir ce que tu copie en image ??????
 

mécano41

XLDnaute Accro
Bonsoir,

Merci à vous deux pour ces renseignements.

Je suis en EXCEL WINDOWS 64 bits mais Office 32 bits ; le problème survient lorsque je passe le fichier à quelqu'un qui est en Office 64 bits.

Afin d'être clair, je préfère mettre le fichier de l'appli. qui fonctionne parfaitement chez moi mais pas chez mon correspondant.

Les images (en jpeg) sont dans une feuille spécifique Images.

La partie de code que j'ai recopiée est dans le module PastePicture. Le but était de ne pas avoir les images dans un autre fichier, mais dans l'appli. elle-même.

L'utilisation est dans l'Userform_Initialize de la BdDlgParamètres

Les deux images apparaissent lorsque l'on ouvre cette boîte de dialogue par le bouton Paramétrage de la passerelle.

Cordialement
 

Pièces jointes

  • Fichier pour aide .xlsm
    289.8 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
ha ouais tu voul voul c'est ça
non plus serieusement il faut etre un peu plus precis dans les demande
si tu a un office 32 tu peux pas avoir un office 64 sauf installation supplémentaire de excel 64 bits seulement mais on est dans l'absurde
déjà que faire tourner 2 versions d'exel 32 l'une en vb6 l'autre en vb7 c'est compliqué alors une 64 avec une 32 a mon avis il doit y avoir conflit dans le registre là
bref difficile de t'aider si tu n'en sais pas plus toi meme
 

mécano41

XLDnaute Accro
J'ai dit que moi j'avais un Office 32 bits et que ça fonctionne bien, mais que mon correspondant avait un Office 64 bits et que ça donne le message indiqué. Pas autre chose.. .Et j'ai demandé comment faire pour que ça fonctionne dans tous les cas....

Cordialement
 

mécano41

XLDnaute Accro
Bonjour Phil69970,

J'ai lu ce que tu m'as indiqué. Dans un premier temps, j'ai voulu tester :
Code:
#If VBA7 Then
    '64 bit declares here
#Else
    '32 bit declares here
#End If
en mettant dans le Else tout ou partie de mon code actuel (et rien dans le IF) dans le but de voir déjà si cela fonctionnait comme avant pour l'utilisation 32 bits. Pas bon. Si je mets dans le Else seulement les déclarations de Type et de Function ça me dit dans l'exécution des fonctions que quelque chose n'est pas déclaré et si je mets tout le code dans le Else, c'est dans l'exécution de mon code à l'ouverture de la boîte Paramètres que cela me dit que la fonction PastePicture n'est pas déclarée...

Comme je ne connais pas, je n'y arrive pas...

Cordialement
 

patricktoulon

XLDnaute Barbatruc
bonjour
tu pourrais tester cette sub SVP
VB:
#If VBA7 Then
     #If Win64 Then
       Public Const le_vb As String = "windows 64 office 64 et vb7"
    #Else
        'windows 64 office 32 et vb7
      Public Const le_vb As String = "windows 64 office 32 et vb7"
   #End If
#Else
    'windows 64 office 32 et vb6
    Public Const le_vb As String = "windows 64 office 32 et vb6"
#End if

sub test ()
msgbox le_vb
end sub
 

Phil69970

XLDnaute Barbatruc
Mécano, Patrick, le forum

A mon avis le message est normal car tu l'as déclaré 2 fois.
1607682810174.png


Sous réserve de vérification, voici ce que Patrick t'as écris avec mes commentaires.

VB:
#If VBA7 Then              '==> déclaration conditionnelle qui indique qu'on est en excel 64 bits

         #If Win64 Then    '==> déclaration conditionnelle qui indique qu'on est en Windows 64 bits
                ' Ici on est en Win 64 et excel 64
                'Code spécififique à Win 64 et excel 64
                Public Const le_vb As String = "windows 64 office 64 et vb7"

          #Else             '==> déclaration conditionnelle qui indique qu'on est en Windows 32 bits
                ' Ici on est en Win 32 et excel 64
                'Code spécififique à Win 32 et excel 64
                Public Const le_vb As String = "windows 32 office 64 et vb7"

          #End If          '==> On sort de la déclaration conditionnelle qui teste la version de Windows

#Else                      '==> déclaration conditionnelle qui indique qu'on est en excel 32 bits

         #If Win64 Then       '==> déclaration conditionnelle qui indique qu'on est en Windows 64 bits
                ' Ici on est en Win 64 et excel 32
                'Code spécififique à Win 64 et excel 32 si besoin
                Public Const le_vb As String = "windows 64 office 32 et vb6"
          #End If        '==> On sort de la déclaration conditionnelle qui teste la version de Windows

           ' Ici on est en Win 32 et excel 32
'         Code spécififique à Win 32 et excel 32
           Public Const le_vb As String = "windows 32 office 32 et vb6"

#End if                  '==> On sort de la déclaration conditionnelle car on a tout testé
'La macro sait maintenant quelle version est installé sur l'ordi (Win et excel)
'Elle peut faire le reste du code normalement ici

sub test ()
msgbox le_vb 'Affiche la version Win et excel
end sub

@Phil69970
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Cela m'indique : windows 32 office 64 et vb7 ... alors que je suis en Windows 64 Office 32 et vb6...

Cordialement
bonsoir mécano41 Phil69970

heu..la tu me donne le tournis

si tu est sur d’être en win64 et office 32 les déclaration basiques devraient suffire
et tu nous dit que tu a des soucis avec le module de stephen bullen
là mon amis c'est plus cohérent
 

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 938
Membres
101 844
dernier inscrit
pktla