Supprimer la croix de fermeture Userform

  • Initiateur de la discussion Initiateur de la discussion maval
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

maval

XLDnaute Barbatruc
Bonjour,

J'ai un petit souci, je travail avec Excel2013 64 bits.

Pour supprimer la croix qu'il y a sur mon Userform j'utilise se code

Code:
Declare Function GetWindowLongA Lib "User32" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLongA Lib "User32" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

J'ai bien sur un message d'erreur en me disant "Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur les systèmes 64 bits.....

Je vous remercie de votre aide
 
Re : Supprimer la croix de fermeture Userform

Bonjour JM

Merci pour l'info je pense avoir fait se qu'il préconise en faisant ceci;

Code:
#If VBA7 Then

Declare Function GetWindowLongA Lib "User32" _
    ('ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLongA Lib "User32" _
  '  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

#End If

sa na rien changer?
 
Re : Supprimer la croix de fermeture Userform

Re,

Voila

Ceci dans le code de l'Userform:
Code:
Private Sub UserForm_Initialize()
SupprimerFermeture Me
End Sub

Public Sub SupprimerFermeture(USF As UserForm)
    Dim hWnd       As Long
    hWnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
                       "X", "D") & "Frame", USF.Caption)
    SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFF
End Sub

Et ceci dans un module

Code:
#If VBA7 Then

Declare Function GetWindowLongA Lib "User32" _
    ('ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLongA Lib "User32" _
  '  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

#End If

@+
 
Re : Supprimer la croix de fermeture Userform

Re________________EDITION: Bonjour xhudi69 😉

maval
Tu sais que tu peux aussi simplement désactiver la croix sans la supprimer...
Code VBA:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub





Sinon tu as essayé en mettant tes déclarations dans l'userform?
 
Dernière édition:
Re : Supprimer la croix de fermeture Userform

Bonjour Xhudi

je te remercie mais le problème est toujours le même, J'ai cette partie du code qui se met en rouge avec le même message d'erreur.

Code:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const VK_SNAPSHOT = 44
Const VK_LMENU = 164
Const KEYEVENTF_KEYUP = 2
Const KEYEVENTF_EXTENDEDKEY = 1

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib "user32" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

@+
 
Re : Supprimer la croix de fermeture Userform

Re

maval
Tu as vu mon précédent message (et le code proposé qui désactive la croix) ?
Le code en rouge c'est normal c'est PtrSafe (et ce n'est pas une erreur)
D'ailleurs tu dois l'utiliser pour tout tes appels à des Dll
Ce qui n'est pas le cas dans ton dernier message, non ?
(cf la copie de ton VBA dans ton message)
 
Re : Supprimer la croix de fermeture Userform

Re JM

J'ai adopté ton code du post6 qui fonctionne très bien, mais si vraiment a chaque fois j'ai des problèmes avec excel 64 bits je vais le passer en 32 bits.....

Bonne journée

@+
 
Re : Supprimer la croix de fermeture Userform

Bonjour.
Il m'a été indiqué (je ne sais plus si ce n'est pas même par Staple, sinon qu'il se fasse connaitre) de quoi apporter cette modification dans un code fondamental de la plupart de mes fournitures:
VB:
#Const AvecMoveMemory = 1 ' = 1 normalement, à corriger = 0 si MoveMemory n'est pas disponible sur votre machine.
Option Explicit
#If AvecMoveMemory Then
   #If VBA7 Then ' Attention: versions antérieures: erreur de syntaxe sur PtrSafe non gênante pour la compilation de projet VBA.
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
   #Else
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
      #End If
Et il semblerait que ça marche, puisque je n'ai pas d'écho contraire.
Celà engendre un erreur de syntaxe permanente sur l'instruction contenant le mot clé PtrSafe, mais qui ne gène en rien la compilation du projet VBA.
 
Re : Supprimer la croix de fermeture Userform

Effectivement j'ai oublié d'englober le #End If du #If AvecMoveMemory Then, car il est un peu plus loin. la séquence complète est :
VB:
#Const AvecMoveMemory = 1 ' = 1 normalement, à corriger = 0 si MoveMemory n'est pas disponible sur votre machine.
Option Explicit
#If AvecMoveMemory Then
   #If VBA7 Then ' Attention: versions antérieures: erreur de syntaxe sur PtrSafe non gênante pour la compilation du projet VBA.
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
   #Else
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
      #End If
Const LimiteDicho = 950 ' Pour les partitions restantes de cet ordre de grandeur ou moins, la méthode dichotomique apporte un gain de
#Else ' performance de 25% pour 1000 éléments, mais à la condition expresse de pouvoir décaler massivement les numéros en mémoire.
Const LimiteDicho = 40
   #End If
 
Re : Supprimer la croix de fermeture Userform

Mais… mon exemple n'avait rien à voir avec le APIs dont vous avez besoin, vous !
C'était juste pour essayer à mon tour de vous enfoncer dans le crâne qu'il faut ajouter le mot clé PtrSafe derrière les Declare pour qu'il veille à transmettre en 64 bits les Long devant représenter des adresses, mot clé que je n'ai jamais vu dans les bouts de code que vous avez mis dans vos postes précédents en disant qu'ils ne marchaient pas.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
46
Affichages
2 K
Retour