Pb macro suite au passage Excel 2021 64 bits

Bonjour,

j'ai des erreurs de macro qui viennent d'apparaitre suite au passage a Excel 2021 et 64 bit

comment résoudre le problème svp ?

merci

pb macro 01

Bonjour,

En cherchant un peu, voici ce qu'on trouve, :

Les instructionsDeclare avec le mot-clé PtrSafe sont la syntaxe recommandée. Les instructionsDeclare qui incluent PtrSafe fonctionnent correctement dans l’environnement de développement VBA7 sur les plateformes 32 bits et 64 bits.

Pour assurer la compatibilité descendante avec VBA7 et versions antérieures, utilisez la construction suivante :

VB

 #If VBA7 Then 
 Declare PtrSafe Sub... 
 #Else 
 Declare Sub... 
 #EndIf

re

bonjour

juste en passant

Les instructionsDeclare avec le mot-clé PtrSafe sont la syntaxe recommandée. Les instructionsDeclare qui incluent PtrSafe fonctionnent correctement dans l’environnement de développement VBA7 sur les plateformes 32 bits et 64 bits. Pour assurer la compatibilité descendante avec VBA7 et versions antérieures, utilisez la construction suivante :

hou làlà non ca suffit pas en tout ca pas tout le temps

ne pas confondre VBA7 et 64 Bits

il y VBA7 pour 64 bit et VBA7 pour 32bits

en l'occurence ici c'est bon pour la sub sleep mais c'est pas le cas pour tout

dans certaines fonctions, certaines variables de type long (handle, contexte ,double) doivent être en longPtr voir LongLong

et même pire dans certaines fonctions ,certaines variables change carrément de genre entre 32/64 bits

donc ne pas prendre l'expression "PtrSafe" comme seule nécessité pour déclarer des fonctions apis d'une dll en 64 bits

à bon entendeur

j'ai modifié le code mais cela ne fonctionne pas, n'étant pas un pros pas sur d'avoir fait les bonnes modifications

pb macro 01bis

Bonjour,

moi je met : #If VBA7 Or Win64 Then

Mais ne comprenant pas tout ce que dit patrickT, je ne sais pas si cela suffira pour vous, ou bien essayez dans cette condition de déclarer la variable en LongPtr à la place de Long

@ bientôt

LouReeD

Bonjour LouReed

Mais ne comprenant pas tout ce que dit patrickT, je ne sais pas si cela suffira pour vous,

ce que je veux dire c'est que VBA7 n'est pas le 64 bit

et donc ptrsafe en 64 ne suffit pas
en 64 il faut mettre les variables longlong ou Longptr
et non seulement ça mais il y a des api ou les argument sont de type différent pour le 32/64 bits

par exemple tu comprendra mieux ici on va prendre l'api Windowfrompoint

tu constatera que dans ce cas je suis bien obligé de distinguer le VBA 6 du VBA7
mais aussi le 32 du 64 en VBA7
car nonseulement elle n'ont pas le même type mais en plus les arguments sont de nombres différents
et qu'il faut passer par une conversion

#If VBA7 Then    'office 2010 à 2021

    #If Win64 Then    'les versions VBA7 en 64 bits
        Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal point As LongLong) As LongPtr
    #Else    'les versions VBA7 en 32 bits
        Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As LongPtr, ByVal yPoint As LongPtr) As LongPtr
    #End If

    'ici pour 32 et 64 VBA
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

#Else    'VB6 office  2003 à 2007
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

#End If

'ce qui implique une conversion longlong to point en 64 bits
#If Win64 Then
Function PointToLongLong(point As POINTAPI) As LongLong
    Dim ll As LongLong, cbLongLong As LongPtr
    cbLongLong = LenB(ll)
    If LenB(point) = cbLongLong Then
        CopyMemory VarPtr(ll), VarPtr(point), cbLongLong
    End If
    PointToLongLong = ll
End Function
#End If

Private Type POINTAPI
    X As Long
    Y As Long
End Type

'ce qui implique que dans les macros ou fonctions utilisant cet api ,
'qu'on puissent faire le jump en 32 et 64 bits selon la version de l'utilsateur utilsant le fichier
Sub test()
    Dim PA As POINTAPI
    Dim hWnd As LongPtr

    'Cursor position
    GetCursorPos PA

    #If Win64 Then
        hWnd = WindowFromPoint(PointToLongLong(PA))
    #Else
        hWnd = WindowFromPoint(PA.X, PA.Y)
    #End If

End Sub

et ce n'est qu' un exemple parmi tant d'autre

d'autre part

et là j'en reviens au dernier message du demanteur

la portabilité d'une fonction

private ou public kézaco ça !!??????

et bien c'est simple d'autant plus que le message d'erreur est explicite

on est dans un module feuil donc dans un module object donc declare doit être précédé par "Private"

seul les module standards et classe peuvent avoir des declaration public

Oui pour le deuxième problème !

Il y avait anguille sous roche ! 2 pannes pour le prix d'une, on se croirait avec une Renault !

@ bientôt

LouReeD

re

@LouReed

ne te moque pas hein j'ai une LAGUNA

diabolo

et elle tourne super bien comme moi

reflechiquestion gif

Bonjour,

je ne sais pas si je vais arriver à me dépatouiller de tout cela ...

j'ai rentré les lignes de codes qui ont l'air de fonctionner mais cela me déclenche une autre erreur.....j'ai du mal à suivre là

pb macro 03

Bonjour

C'est pourtant clair : Il manque un End if à #If VBA7 (Après le 1er End if et avant Private Sub)

A+

Bonjour le fil,

@samying2044, vous voulez utiliser VBA, commencez par savoir comment l'utiliser, non

Quand vous codez, utilisez le menu "Compiler VBAProject"

image

Cela vous informera d'une erreur et de l'endroit ou elle se situe

image

A+

Désolé mais si je passe par un forum c'est que je n'ai pas toutes les compétences pour répondre a mes problèmes, si je les avais je ne serais pas là et si tout le monde les avait le forum n'existerait pas. Mais je prends les remarques avec humour

J'ai des bases, mais le coup du passage au 64 VBA7 je connaissais pas et le coup du end if cela ne m'a pas paru évident sur le coup mais effectivement cela aurait du me sauter aux yeux.

J'ai modifié mon code et les autres erreurs qui sont survenu après et cela fonctionne.

Merci de votre aide.

Rechercher des sujets similaires à "macro suite passage 2021 bits"