XL 2016 Modification code pour compatibilité 32 64 bit VBA7

treza88

XLDnaute Occasionnel
Bonjour a tous,

J'essaie de modifier mon code pour le rendre compatible en 32 et 64 bit sous VBA7

Quand j'ai essayé d'ouvrir mon code qui fonctionne normalement en 32 bit dans un univers 64 bit, ces ligne sont passé en rouge, j'ai donc ajouté un PtrSafe sur ces lignes.

VB:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function SetCursorPos Lib "user32" ( _
                         ByVal x As Long, ByVal y As Long) As Long

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Any) As Long    'API pour rechercher le handle d'une fenetre
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long    'API pour envoyer une commande a une fenetre avec son Handle
Public Const WM_CLOSE = &H10
Public ind As Integer
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

Mais c'est certainement insuffisant car j'ai des erreurs de type "Projet ou bibliothèque introuvable" sur des lignes de code simple.
Du type suivant:

Sur Left apparemment et dans un autre module que celui ou j'ai ajouté les PtrSafe:

VB:
If toto = True Then
        'OK button

        ThisWorkbook.SaveAs toto
        Dim dosfinal As String
        Dim toto2 As String
        dosfinal = Dir(ActiveWorkbook.Path, vbDirectory)
        toto2 = Left(toto, Len(toto) - 4)
        dosfinal = toto2 & " " & dosfinal
        ThisWorkbook.SaveAs dosfinal
        Kill (toto)
    Else
        'Annuler
        Exit Sub
    End If

Et par exemple sur Chr dans la function suivante:

VB:
Public Function NumCol2Lettre(ByVal pNombre As Long) As String

    Dim lDiv As Long, lReste As Long
    Do
        lDiv = pNombre \ 26
        lReste = pNombre Mod 26
        ' on commence la numérotation à 1 pour A
        ' donc si 0 => Z
        If lReste = 0 Then
            lReste = 26
            lDiv = lDiv - 1
        End If
        ' ajout de la lettre qui correspond au reste de la division par 26
        NumCol2Lettre = Chr(64 + lReste) & NumCol2Lettre
        ' on continue avec le résultat de la division
        pNombre = lDiv
        ' dernière lettre
        If pNombre <= 26 Then
            If pNombre > 0 Then NumCol2Lettre = Chr(64 + pNombre) & NumCol2Lettre
            Exit Do
        End If
    Loop


End Function

Et il doit en avoir bien d'autre.

J'ai bien lu des tutos sur ce type de modification mais je suis un peu perdu surtout qu'il y a des "Long" apparemment a passer en "LongPtr" et certaines autres choses de ce type, mais là je dois bien avouer que je nage la brasse coulée et quand je dis coulée c'est bien profond.
Donc un peu d'aide ne serait pas de refus.
Merci d'avance
 

treza88

XLDnaute Occasionnel
Merci Staple1600 et Dranreb pour le coup de main,

Le VBA. a fonctionné sur ces lignes, mais j'ai une erreur identique sur ces déclarations de variables:

VB:
Set firstCell = Range("C9")
Set lastCell = Range("C65536").End(xlUp)
Set Selection = Range(firstCell, lastCell)

Dranreb, quand tu parle de référence manquante, comment identifier la ou les références qui manquent.
Est ce que regardé les références qui sont cochées sur mon Excel 32 et cocher les même sur ma version 64 est la solution?
 

treza88

XLDnaute Occasionnel
Ok et Merci Dranreb, j'ai décoché la référence noté manquant et il y a déjà une grande amélioration.

Par contre, j'ai une autre erreur sur l'affichage d'un userform l'erreur est la suivante:
"Impossible de trouver le fournisseur. Il est peut être mal installé."

VB:
Sub Ajout_feuilles()
    Ajout_feuille.Show

End Sub
 

treza88

XLDnaute Occasionnel
Ok merci pour ta reponse, ça ma fait regarder du coté du code du Userform et je viens de voir (je ne m'en rappelais plus) que le code fait reference a un fichier de base de données qui n'est pas sur le pc que j'ai pour tester mon code en 64 bit.
Donc je pense que je ne dois pas chercher plus loin.

VB:
Private Sub UserForm_Initialize()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & "C:\X18\Dossier\DB\mmat.mdb" & ";"
        Me.tb_matiere.List = Application.Transpose(.Execute("Select distinct [MaterialsCode] from [Materials] order by [MaterialsCode]").GetRows)

        .Close
    End With
End Sub
 

Dranreb

XLDnaute Barbatruc
Un objet non spécifiquement typé et initialisé par CreateObject.
Les liaison sont alors démerdées à l'exécution, elles ne peuvent pas être résolues à la compilation comme les liaisons anticipées. Et surtout, outre que c'est très légèrement plus lent à l'exécution parce que les méthodes et propriétés doivent être recherchées à ce moment là, l'explorateur d'objet ne peut être d'aucune aide pour trouver ce qui existe pour ce type d'objet.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Trouver le fichier qui contient la définition de l'objet en choisissant parcourir dans la liste des références, le cocher, ne jamais utiliser Object mais le type explicite de l'objet. Ne pas non plus faire de Wiith CreateObject(etc.
 

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh