XL 2016 Aide UserForm VBA Excel SVP

excelimprover

XLDnaute Nouveau
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.

Le mot de passe est abracadabra1618

Merci et bonne journée ;)
 

Pièces jointes

  • TEST 1 (Pour internet fake datas).xlsm
    44 KB · Affichages: 7

Oneida

XLDnaute Impliqué
Bonjour,
Pour bouton reduction/affichage.

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
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
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
capturescreen.jpg


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

demo - Copie.gif


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

diabolo.gif


hou lala fatigué moi j'ai trop travaillé
 

Pièces jointes

  • userform réductible dans la barre des taches .xlsm
    15.2 KB · Affichages: 10
Dernière édition:

excelimprover

XLDnaute Nouveau
Bonsoir,
Voyez si le classeur joint répond en gros à votre demande.
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 ?
 

patricktoulon

XLDnaute Barbatruc
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
 

cp4

XLDnaute Barbatruc
Bonjour à tous

Franchement formidable....
on répond à un mec qui ne dit même pas bonjour à la première question posée 🤔 :rolleyes:

Yeeeaaahhh c'est la fête du slip 🤣
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...

Bonne journée.
 

fanch55

XLDnaute Barbatruc
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 ? :confused:)
 

fanch55

XLDnaute Barbatruc
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 .....
1675934083393.png
 

excelimprover

XLDnaute Nouveau
Bonsoir,
Voyez si le classeur joint répond en gros à votre demande.

Bonjour à tous

Franchement formidable....
on répond à un mec qui ne dit même pas bonjour à la première question posée 🤔 :rolleyes:

Yeeeaaahhh c'est la fête du slip 🤣
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 ;)
 

Discussions similaires

Réponses
8
Affichages
227

Statistiques des forums

Discussions
312 206
Messages
2 086 220
Membres
103 158
dernier inscrit
laufin