Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA EXCEL - OUVRIR WINDOWS EXPLORER ET DEFINIR TAILLE FENETRE

379 views
Skip to first unread message

29Eric29

unread,
Jun 22, 2018, 4:33:11 AM6/22/18
to
Bonjour,

Je cherche à ouvrir 4 fenêtres "windows explorer" en imposant leur taille et
position sur l'écran.

J'ai trouvé un code qui fonctionne parfaitement pour ouvrir "notepad.exe" (et
positionner les fenêtres en définissant leur taille) et je cherche à l'adapter
pour "explorer.exe".
https://www.experts-exchange.com/questions/28323487/MoveWindow-in-VBA-in-EXCEL.html


Je pensais que remplacer :
np_retval = Shell("C:windowsnotepad.exe", vbNormalFocus)
par :
np_retval = Shell("C:windowsexplorer.exe", vbNormalFocus)
suffirait....mais ça n'est pas si simple j'ai l'impression ?


Voici le code si quelqu'un avait une idée pour l'adapter à explorer.exe ?? :

Un grand merci d'avance...et bonne journée

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Option Explicit

Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As
Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
bRepaint As Long) As Long

Public Const GW_HWNDNEXT As Long = 2
Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd
As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As
Long, lpdwprocessid As Long) As Long

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Sub tile1()
Dim retval As Long, np_retval As Long

np_retval = Shell("C:windowsnotepad.exe", vbNormalFocus)
retval = MoveWindow(GetWinHandle(np_retval), 0, 0, 950, 550, 1) '
Application.hwnd ' X Y largeur hauteur

np_retval = Shell("C:windowsnotepad.exe", vbNormalFocus)
retval = MoveWindow(GetWinHandle(np_retval), 950, 0, 950, 550, 1) '
Application.hwnd ' X Y largeur hauteur

np_retval = Shell("C:windowsnotepad.exe", vbNormalFocus)
retval = MoveWindow(GetWinHandle(np_retval), 950, 550, 950, 550, 1) '
Application.hwnd ' X Y largeur hauteur

np_retval = Shell("C:windowsnotepad.exe", vbNormalFocus)
retval = MoveWindow(GetWinHandle(np_retval), 0, 550, 950, 550, 1) '
Application.hwnd ' X Y largeur hauteur

End Sub

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Function ProcIDFromWnd(ByVal hwnd As Long) As Long
Dim idProc As Long

' Get PID for this HWnd
GetWindowThreadProcessId hwnd, idProc
ProcIDFromWnd = idProc

End Function

Function GetWinHandle(hInstance As Long) As Long
Dim tempHwnd As Long

' Grab the first window handle that Windows finds:
tempHwnd = FindWindow(vbNullString, vbNullString)

' Loop until you find a match or there are no more window handles:
Do Until tempHwnd = 0
' Check if no parent for this window
If GetParent(tempHwnd) = 0 Then
' Check for PID match
If hInstance = ProcIDFromWnd(tempHwnd) Then
' Return found handle
GetWinHandle = tempHwnd
' Exit search loop
Exit Do
End If
End If

' Get the next window handle
tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
Loop
End Function
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Michd

unread,
Jun 22, 2018, 11:02:12 AM6/22/18
to
Bonjour,

Voici un fichier exemple qui fait le travail.

'Prends le temps de lire les commentaires dans le code.
'Cela peut te donner des idées...
https://www.cjoint.com/c/HFwo3Tuuh4i

Le code que tu as publié devrait fonctionner... cependant pour une raison que j'ignore, cette
section du code "GetWinHandle(np_retval)" dans la ligne de code suivante "retval =
MoveWindow(GetWinHandle(np_retval), 0, 0, 950, 550, 1)" ne retourne pas les "Handle" de la fenêtre
dans le cas de l'explorateur Windows. Sa valeur est 0. Conséquemment, la position de la fenêtre
n'est pas exécutée.

Si tu trouves l'explication ou une autre manière de procéder, je suis preneur!

P.S. Même les amis d'Excel 2003 devait pouvoir utiliser le fichier.

MichD



"29Eric29" a écrit dans le message de groupe de discussion :
gvydnTnYX-HYKbHG...@giganews.com...

Michd

unread,
Jun 22, 2018, 11:05:58 AM6/22/18
to
Sur mon ordinateur, je peux utiliser un délai d'une seule seconde
à la ligne de code T = Timer + 1 et cela fonctionne très bien.

MichD


29eric29

unread,
Jun 24, 2018, 3:42:34 AM6/24/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
Bonjour,

J'imagine que ça marche ! Le problème c'est que j'ai un 64bits pour le week-end
(Grrrr !)..et donc ça ne fonctionne pas !

Je vais creuser pour l'adapter...

Un grand merci pour ce coup de main....

Vivement demain que je teste sur mon ordi 32bits.

Je vous tiens au courant !

Bonne journée

Michd

unread,
Jun 24, 2018, 6:40:24 AM6/24/18
to
| J'imagine que ça marche ! Le problème c'est que j'ai un 64bits pour le week-end
| (Grrrr !)..et donc ça ne fonctionne pas !

J'ai testé ceci sur mon ordi 64 bits, Windows 10 version 1703 et Microsoft Office 2016. Cela
fonctionne très bien. En théorie, cela devrait marcher sur un 32 bits bien que je n'ai pas testé cet
environnement. As-tu un message d'erreur? Si oui, lequel? Quelle ligne de code est mise en
surbrillance lorsque la macro s'arrête durant l'exécution?

MichD

Michd

unread,
Jun 24, 2018, 9:20:46 AM6/24/18
to
2 Choses à surveiller :

A ) Exécute le raccourci suivant : Win + E cela ouvre l'explorateur Windows. Dans la fenêtre de
l'explorateur Windows, quel est le texte inscrit dans la barre de titre? La procédure utilise
""Explorateur de fichiers". Si tu as autre chose, tu dois adapter cette ligne de code "NomFenetre =
"Explorateur de fichiers" selon le texte de la barre de titre.

B ) La procédure utilise une temporisation afin de permettre la finalisation de la création de 4
instances de la fenêtre "Explorateur Windows". Chez moi, une seconde est suffisante. Cela pourrait
être plus selon la puissance de l'ordinateur. Au besoin, il faut adapter cette ligne de code:

T = Timer + 1 'le 1 représente une seconde.
Do While T >= Timer
DoEvents
Loop

MichD


29eric29

unread,
Jun 25, 2018, 2:07:53 AM6/25/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
Bonjour,

Dans la fenêtre de l'explorateur windows il n'y a "rien du tout d'écrit "...

En fait je suis sous win7 SP1 pro 64 bits....

Ceci explique t-il cela ?

Une idée ?

D'avance merci

Bonne journée

Eric

29eric29

unread,
Jun 25, 2018, 2:26:23 AM6/25/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
Cerise sur le gâteau "Aucun message d'erreur" pour me guider !

Les 4 fenêtres s'ouvrent...mais dans la "dernière position de fermeture".

Gloups...

Michd

unread,
Jun 25, 2018, 7:07:19 AM6/25/18
to
https://www.cjoint.com/c/HFzk3Zxs7Ii

Voici une image de "l'explorateur de fichiers" sur Windows 10 et son appellation dans la barre de
titre "Explorateur de fichiers" lorsque la fenêtre s'ouvre par la procédure. Pour que la procédure
fonctionne, l'expression de la barre de titre est nécessaire et essentielle à la procédure sans
cela, le positionnement des fenêtres ne s'exécute pas correctement. La procédure que tu as publiée
se retrouve sur le "Web" et c'est celle qui est recommandée... et elle a déjà fonctionné même avec
l'explorateur de fichiers par le passé. Pour l'instant, je n'ai pas d'autre alternative à te
proposer.

MichD


Michd

unread,
Jun 25, 2018, 11:18:04 AM6/25/18
to
À cette adresse https://docs.microsoft.com/en-us/sysinternals/downloads/handle il y a un petit
programme "Handle v4.11" (310 Ko) que tu peux télécharger pour obtenir le hwnd d'une fenêtre en
utilisant l'un des paramètres. Perso., je n'ai jamais utilisé ce programme.

MichD


Michel__D

unread,
Jun 25, 2018, 5:49:06 PM6/25/18
to
Bonjour,

Le 25/06/2018 à 08:26, 29eric29 a écrit :
> Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
>> Bonjour,
>>
>> Je cherche à ouvrir 4 fenêtres "windows explorer" en
>> imposant leur taille et position sur l'écran.

Essaye avec le code ci-dessous (je n'ai pas testé) :

' Début
Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, _
ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Sub Depart()
Dim oSHA As Object, oWnd As Object
Dim iK As Long, ndT As Double

' ouverture des 4 fenêtres de l'explorateur windows
For iK = 1 To 4
Shell "C:\windows\System32\explorer.exe", vbNormalFocus
Next
ndT = Timer + 1
Do While ndT >= Timer
DoEvents
Loop
iK = 0
asV = Split("0,0,950,550,950,0,950,550,950,550,950,550,0,550,950,550", ",")
Set oSHA = CreateObject("Shell.Application")
For Each oWnd In oSHA.Windows
If Left(TypeName(oWnd.Document),12)="IShellFolder" Then
MoveWindow oWnd.HWND,CLng(asV(iK)),CLng(asV(iK + 1)),CLng(asV(iK + 2)),CLng(asV(iK + 3)),1
iK = iK + 4
End If
If iK > 15 Then Exit For ' 4 Fenêtres
Next

Set oWnd=Nothing
Set oSHA=Nothing
End Sub
' Fin

29eric29

unread,
Jun 26, 2018, 3:41:45 AM6/26/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
Nom d'un petit bonhomme !!!!

Ça marche....Je n'y crois pas.... J'ai tellement galéré !

Je vais analyser et voir pour intégrer tout ça dans mon code...

Un grand grand merci !

Bonne journée à tous

Eric

29eric29

unread,
Jun 26, 2018, 6:22:43 AM6/26/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
Deux points à ajuster:

(1) Ne fonctionne pas si des fenêtres "explorer" sont déjà ouvertes. Il faut
donc trouver un moyen de toutes les fermer avant ?

(2) Sur l'un de mes PC les 4 fenêtres s'ouvrent et sont mises à la bonne taille
mais "restent derrière excel"...donc restent cachées...

Je poursuis mes recherches...mais si quelqu'un a des suggestions je suis preneur
!

Merci d'avance

29eric29

unread,
Jun 26, 2018, 8:08:31 AM6/26/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
La première partie de mon problème est réglé. J'ai trouvé ce code (je ferme
ainsi toutes les autres fenêtres "explorer.exe" :

Dim aProcess, theProcesses
Set theProcesses = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\." _
& "\root\cimv2").ExecQuery _
("Select * from Win32_Process Where Name = 'explorer.exe'")
If theProcesses.Count > 0 Then
For Each aProcess In theProcesses
aProcess.Terminate
Next
End If


Il me reste à trouver comment éviter que les fenêtres restent "derrière" !

Courage...

Michd

unread,
Jun 26, 2018, 8:22:54 AM6/26/18
to
Bonjour,

Adapte la procédure de Michel_D comme ceci. Attention, certaines lignes peuvent être coupées par le
service de messagerie.

'Déclaration des API
Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal x As Long, _
ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

'---------------------------------------------------------
Sub Depart()
Dim oSHA As Object, oWnd As Object
Dim iK As Long, ndT As Double

' ouverture des 4 fenêtres de l'explorateur windows
For iK = 1 To 4
Shell "C:\windows\System32\explorer.exe", vbNormalFocus
Next
ndT = Timer + 1
Do While ndT >= Timer
DoEvents
Loop
iK = 0
asV = Split("0,0,950,550,950,0,950,550,950,550,950,550,0,550,950,550", ",")
Set oSHA = CreateObject("Shell.Application")
For Each oWnd In oSHA.Windows
If Left(TypeName(oWnd.Document), 12) = "IShellFolder" Then
MoveWindow oWnd.hWnd, CLng(asV(iK)), CLng(asV(iK + 1)), CLng(asV(iK + 2)), CLng(asV(iK + 3)),
1
SetForegroundWindow oWnd.hWnd
iK = iK + 4
End If
If iK > 15 Then Exit For ' 4 Fenêtres
Next

Set oWnd = Nothing
Set oSHA = Nothing
End Sub
'---------------------------------------------------------

MichD

"29eric29" a écrit dans le message de groupe de discussion :
eqadneY7ocQnsa_G...@giganews.com...

patricktoulon

unread,
Jul 9, 2018, 3:49:50 PM7/9/18
to
Le vendredi 22 Juin 2018 à 10:33 par 29Eric29 :
bonsoir
tout les chemins menent a rome le mien aussi
#If VBA7 Then
Declare Function ptrsafe MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal
x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
bRepaint As Long) As Long
Declare Function ptrsafe FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
#Else
Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As
Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
bRepaint As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
#End If

'0, 0, 950, 550, 1
'950, 0, 950, 550, 1
'950, 550, 950, 550, 1
' 0, 550, 950, 550, 1
Sub test2()
mesdossiers = Array("C:\Users\polux\Desktop\imageBouton",
"C:\Users\polux\Desktop\lien streaming", "C:\Users\polux\Desktop\cature d'ecran
api vba", "C:\Users\polux\Desktop\wisiwig fonctionnels")
mespositions = Array("0, 0, 950, 550, 1", "950, 0, 950, 550, 1", "950, 550,
950, 550, 1", "0, 550, 950, 550, 1")
Set objShell = CreateObject("shell.application")
For x = 0 To UBound(mesdossiers)
nbfenetre = CLng(objShell.Windows.Count)
retval = Shell("C:\windows\System32\explorer.exe " & Chr(32) &
mesdossiers(x) & Chr(32), vbNormalFocus)
Do: DoEvents: Loop While objShell.Windows.Count = nbfenetre: pos =
Split(mespositions(x), ",")
MoveWindow FindWindow(vbNullString, objShell.Windows(nbfenetre -
1).locationname), pos(0), pos(1), pos(2), pos(3), pos(4)
Next
End Sub
0 new messages