Je voudrais que lorsque je clique sur le fichier excel, il n'y que le userform qui s'affiche.
J’ai trouvé ceci qui fonctionne et qui m’ouvre direct le userform :
Application.WindowState = xlMinimized
Database.Show vbModeless
Du coup j’ai aussi le excel qui s’ouvre et quand je le réduis le userform disparait aussi. Ce que je voudrais c’est que le userform ne disparaisse pas et que je puisse le réduire dans la barre des taches et pouvoir cliquer dessus quand bon me semble pour pouvoir l’utiliser.
Le userform est paramétré pour rechercher par soldto (=textbox1) mais je voudrais aussi pouvoir taper ancien soldto (=textbox12) et il m’afficherait alors les infos aussi comme pour le soldto (=textbox1). Si pas bonne référence alors je voudrais meme message d’erreur que pour (=textbox1).
Concernant les messages d’erreur, ensuite il me ferme le userform, je voudrais qu’il ne le ferme pas afin de pouvoir recommencer une saisie sans devoir aller cliquer sur le bouton userform dans le classeur excel.
Je voudrais pouvoir aussi rechercher par Nom client (=textbox2), que je commence a taper quelques lettres et il me propose les choix adaptés en menu déroulant juste en dessous de la case.
Avoir un petit drapeau France a coté de "France" dans la barre grise en haut à gauche.
Les declarations Function et le sub FormatUserform dans un module
VB:
Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
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
Sub FormatUserForm(UserFormCaption As String)
Dim hwnd As Long
Dim exLong As Long
hwnd = FindWindowA(vbNullString, UserFormCaption)
exLong = GetWindowLongA(hwnd, -16)
If (exLong And &H20000) = 0 Then
SetWindowLongA hwnd, -16, exLong Or &H20000
Else
End If
End Sub
Private Sub UserForm_Initialize()
Call FormatUserForm(Me.Caption)
End Sub
Pour le reste si personne prend la suite, je regarde la chose
bonsoir
avec un userform ;pour ajouter les fonctions de fenêtre classique windows a savoir:
agrandir
fenêtrer
réduire ( vraiment dans la barre des taches)
il va te falloir quelques api
une pour déterminer sa poignée(handle (adresse mémoire) )dans la file des windows
une 2d pour modifier le parmètres menu (les boutons manquants dans la barre de titre) très connue
une 3eme qui va paramétrer ses etats (reduit/fenétré/agrandi)
tu te sent d'attaque
allez c'est parti j'explique
pour l'exemple je vais travailler dans le module du userform
j'ai dis 3 apis
ah oui effet
comme je travaille dans le userform
je vais prendre pour déterminer le handle la GetActivewindow
je vais prendre celle qui est faite pour modifier les paramètres la Setwindowlong
et pour finir pour parmétrer les mode reduit/agran,dir etc.. bien que c'est juste la partie réduction qui nous intéresse ici je vais prendre la setwindowpos
voilà on y est
alors perso je suis sur 2013 en 32 bits mais pas tout le monde nous allons donc faire nos déclarations d'api pour 32 et 64 bits comme ça tout le monde pourra essayer
Allez c'est parti
j'ouvre un nouveau fichier excel vierge pour l'occasion
j'ajoute un userform
d'entrée de jeu je vais dans le module du userform et je fait mes déclaration d'api
VB:
Option Explicit
#If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As LongPtr
Dim HwnDuSF As LongPtr
#Else
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As Long
Dim HwnDuSF&
#End If
#Else
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
Dim HwnDuSF&
#End If
bon on y est
dans le activate de mon userform je vais commencer par ajouter les boutons manquants dans la barre de titre
et ensuite on déterminera les paramètres pour le mode réduit (DANS LA BARRE DES TACHES)
Code:
Private Sub UserForm_Activate()
HwnDuSF& = GetActiveWindow 'on determine le handle
SetWindowLong HwnDuSF, -16, &H94C80080 Or &H94CF8080 'on donne les deux mode a la barre de tire (sans ou avec la totale
'ici on va determiner sa position en mode reduit c'est a dire en l'occurence dans la barre des tache
'et non réduit sur la gauche au dessus comme à l'origine
SetWindowPos HwnDuSF&, 0, 0, 0, 0, 0, &H2 Or &H1 Or &H10 Or &H80
SetWindowLong HwnDuSF&, -20, &H101 Or &H40101
SetWindowPos HwnDuSF&, 0, 0, 0, 0, 0, &H2 Or &H1 Or &H10 Or &H40
End Sub
bon ben ça en fait du charabia hein
mais bon on est arrivé
maintenant pour les tests je vais dans un module standard mettre ue sub pour appeler le userform tout en re duisant l'application excel pour un visuel userform only
Code:
Sub test()
Application.WindowState = xlMinimized
UserForm1.Show
End Sub
voilà maintenant on a tout
chiche on teste ?
allez je lance la sub test
voyons voir ou il est quand je réduis
a ben oui il est bien dans la barre des tache groupé avec les fichiers excel et plus agauche au dessus de la barre des taches
je donnerais des explications a la demande quand au arguments numeriques et autres utilisés dans les fonctions
je joint les fichier exemple
Bonne buche
hou lala fatigué moi j'ai trop travaillé
Pièces jointes
userform réductible dans la barre des taches .xlsm
Bonsoir, je viens de voir le fichier excel et c'est génial !!!
Je cherchais désespéramment à obtenir ce résultat mais là c'est au dessus de mes espérances MERCI 1000 Fois !! Je vais essayer d'appliquer cela à mon fichier original maintenant. C'est vraiment top !!
J'essaye également de faire ceci mais j'ai du mal:
- je voudrais pouvoir ajouter des informations clients au fichier excel depuis le userform avec un bouton 'ajouter". Par exemple si je vois qu'il manque une information client, je souhaiterais pourvoir la rajouter directement depuis le userform en renseignant le champs et que ca se rajoute au classeur excel en meme temps. En gros je voudrais éviter de devoir rentrer dans le classeur pour rajouter une info et pouvoir le faire directement depuis le userform mais je ne sais pas si cela est possible sur le meme userform ?
re
bonsoir @fanch55
c'etait le temps ou 64 bit ne m'intéressait pas
correction
VB:
#If Win64 Or VBA7 Then
Private Declare PtrSafe Function GAW Lib "user32" Alias "GetActiveWindow" () As LongPtr
Private Declare PtrSafe Function SWL Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SMG Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As LongPtr
cela dit je propose mieux maintenant (la réduction réellement dans la barre des taches ) voir POST #4
Bonjour tout le monde ,
Ah! oui. Il faut suivre l'évolution:
On se vouvoyait par respect. présentement, on se tutoie car on estime que le vouvoiement n'est plus d'actualité (à la mode). Pour la politesse, autant repasser...
re
bonsoir @fanch55
c'etait le temps ou 64 bit ne m'intéressait pas
correction
VB:
#If Win64 Or VBA7 Then
Private Declare PtrSafe Function GAW Lib "user32" Alias "GetActiveWindow" () As LongPtr
Private Declare PtrSafe Function SWL Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SMG Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As LongPtr
cela dit je propose mieux maintenant (la réduction réellement dans la barre des taches ) voir POST #4
Salut Pat,
Je dois avouer que ta proposition était alléchante pour envoyer le Userform dans la barre des tâches, j'ai testé .
Mais je fais un application.visible = false pour qu'on ne voit que le Userform dans la barre des taches,
j'ai un effet de bord si j'ouvre et ferme un autre classeur excel,
le classeur de l'userform se ferme aussi ( étonnant, non ? )
Bonjour @fanch55
a ben il faut séparer les instance
on a ce paramètre dans 2013 et 2007 d'origine
a savoir ouvrir les classeur dans une fenêtre séparée
Pour cela, selon Microsoft, il faut modifier une clé de registre pour lancer systématiquement une nouvelle instance mais uniquement sur l'icône de base Excel .
Cliquer directement via l'explorateur, c'est toujours la même instance .....
re
ou ajouter dans le menu contextuel "ouvrir avec une new instance"
et ajouter la clé dans le shell de l’extension "xlsm" dans hk/classe/root
je me rappelle plus la synatxe de la valeur dword il me semble que c'est le chemin de excel &"%1"
Bonjour à tous merci pour votre aide et votre implication je sais le temps que cela représente et vous prie de bien vouloir m'excuser pour mon impolitesse. Je suis rentré tard hier soir et je ne n'ai pas eu le temps de répondre à tout le monde. Je suis en train de regarder petit à petit ce que vous avez posté mais avant que je ne rebondisse sur votre travail il faut que je le teste dans mon fichier original mais pour cela il faut que je comprenne toutes les lignes ce qui n'est vraiment pas chose aisée pour moi car je suis loin d'avoir votre niveau.
Merci encore pour votre travail je vous en suis très reconnaissant. Je vais tester cela dans la journée et vous dirai si cela fonctionne bien. Bonne journée à tous