Piloter application pour Enregistrer sous

Bonjour,

J'ai réussi a créer un bouton pour piloter l'ouverture d'une application

Sub Open() 
Dim procID As Integer

procID = Shell("C:\Program Files\....")

End Sub

Jusque là nickel, je me suis dit que peut être il y avait moyen de faire un "enregistrer sous" , PDF via un bouton sur excel. Qui pilote cette application.

Genre un truc comme ça :

Sub PDF()
' Enregistrement en PDF
With application "BIDULE.exe"
"Bidule.exe".ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"X:\....pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, OpenAfterPublish:=False
End Sub

Edit: j'ai activé ma "Références - VBAProject" de manière à le piloter..

Bonjour,

Précision : est-ce le document excel que tu veux enregistrer sous .. ou bien un document pdf que tu as ouvert avec excel et que tu veux enregistrer sous ?

Non c'est un logiciel de dessin comme solidedge et je souhaite avec un bouton Excel enregistrer la page active de ce logiciel en .PDF sur un chemin donné "R:\..."

ok

Dans ce cas, la seule façon que je vois de le faire est d'utiliser sendkeys.

Il faut d'abord identifier la fenêtre windows, ensuite envoyer les commandes sendkeys, y compris la localisation de stockage.

J'essaye de retrouver un programme générique d'identification exacte des fenêtres ...

Première brique : ce fichier permettra

Mon antivirus empêche l'ouverture du Excel.. Bizarre non ..?

J'ai Avast et il ne m'empêche pas de l'ouvrir !

C'est au lancement de la macro que cela coince ou à l'ouverture du fichier excel ?

Tu as déjà fait tourner des fichiers excel avec macro je suppose quand même !

Oui bien sûr j'ai déjà effectué des macros mais la cest à l'ouverture du Excel que ça plante..

Voici la macro, si tu peux la mettre dans un fichier de ton cru

capture d ecran 72

Lister les applis :

donnera la liste des applications en colonne A

Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

Private Function EnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
Dim SLength&, Buffer As String, RetVal&
SLength = GetWindowTextLength(hwnd) + 1
If SLength > 1 Then
    Buffer = Space(SLength)
    RetVal = GetWindowText(hwnd, Buffer, SLength)
    If CBool(IsWindowVisible(hwnd)) Then Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Left(Buffer, SLength - 1)
End If
EnumWindowsProc = 1
End Function

Sub ListAppli()
Application.ScreenUpdating = False
    Cells.ClearContents
    EnumWindows AddressOf EnumWindowsProc, 0
    Cells.Columns.AutoFit
Application.ScreenUpdating = True
End Sub

Lancer l'appli sélectionnée :

Sub appeler()
    AppActivate Selection
End Sub

Si c'est ok, on pourra passer à l'envoi des codes par sendkeys

On peut aussi procéder autrement ... mais c'est peut-être aléatoire.

Est-ce que tu peux lire intégralement le nom de la fenêtre windows de ton application ?

Exemple simple avec notepad++

C:\Users\Michel\OneDrive\Documents\excel\excel vba\macro.txt - Notepad++
capture d ecran 74

car le seul but de toute la cuisine qui précède est d'identifier cette suite de caractères!

Dans ce cas tu dois pouvoir faire par exemple :

Sub fermernotepad()
    AppActivate "C:\Users\Michel\OneDrive\Documents\excel\excel vba\macro.txt - Notepad++"
    SendKeys "%{F4}"
End Sub

Bonjour Steelson,

J'ai mis ce code, dans ma feuil1 :

Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

Private Function EnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
Dim SLength&, Buffer As String, RetVal&
SLength = GetWindowTextLength(hwnd) + 1
If SLength > 1 Then
    Buffer = Space(SLength)
    RetVal = GetWindowText(hwnd, Buffer, SLength)
    If CBool(IsWindowVisible(hwnd)) Then Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Left(Buffer, SLength - 1)
End If
EnumWindowsProc = 1
End Function

Puis ceci dans un module :

Sub ListAppli()
Application.ScreenUpdating = False
    Cells.ClearContents
    EnumWindows AddressOf EnumWindowsProc, 0
    Cells.Columns.AutoFit
Application.ScreenUpdating = True
End Sub
Sub appeler()
    AppActivate Selection
End Sub

Mon bouton pour "ListAppli" me met en message d'erreur:

Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur un systèmes 64 bits. Vérifiez et mettez à jour les instructions Declare, puis marquez-les avec l'attribut PtrSafe

Pour l'autre méthode,

j'ai essayé :

Sub fermernotepad()
    AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - Notepad++"
    SendKeys "%{F4}"
End Sub

Du coup j'ai créé un blocnote nommé macro que j'ai enregistré sur ce chemin. Je l'ai laissé ouvert et j'ai cliqué sur le bouton excel mais là il me met cette ligne

AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - Notepad++"

en surbrillance...

Mon bouton pour "ListAppli" me met en message d'erreur:

Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur un systèmes 64 bits. Vérifiez et mettez à jour les instructions Declare, puis marquez-les avec l'attribut PtrSafe

Malhueruesement je ne connais pas les déclarations en 64bits, fais peut-être une recherche sur le net, sinon lorsque la deuxième méthode fonctionnera ce sera suffisant !

Pour l'autre méthode,

j'ai essayé :

Sub fermernotepad()
    AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - Notepad++"
    SendKeys "%{F4}"
End Sub

Du coup j'ai créé un blocnote nommé macro que j'ai enregistré sur ce chemin. Je l'ai laissé ouvert et j'ai cliqué sur le bouton excel mais là il me met cette ligne

AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - Notepad++"

en surbrillance...

Là je suis sec, car
  • s'il n'y a pas d'erreur d'orthographe,
  • et que le fichier existe bien à cette adresse,
  • et qu'il a bien été lancé avec notepad++ (c'est peut-être là le problème) ...
cela doit fonctionner

Sinon, fais moi une copie d'écran du fichier macro.txt ouvert de façon à ce que je voie l'en-tête windows.

Je ne sais pas faire mais l'en-tête c'est macro - Bloc-notes

Du coup j'utilise notepad et non notepad++ c'est peut être ça la différence non ?

Essaie alors

Sub fermernotepad()
    AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - Bloc-notes"
    SendKeys "%{F4}"
End Sub

voire

Sub fermernotepad()
    AppActivate "macro - Bloc-notes"
    SendKeys "%{F4}"
End Sub

j'ai tout essayé les deux que tu m'as dit et même

Sub fermernotepad()
    AppActivate "C:\Users\seby\AppData\Roaming\Microsoft\Excel\macro.txt - notepad"
    SendKeys "%{F4}"
End Sub
Sub fermernotepad()
    AppActivate "macro - notepad"
    SendKeys "%{F4}"
End Sub

Faut-il activer une Référence dans VBA "Outils"Références.. ?

J'ai chercher si tute fois il y avait quelque chose qui se nommais Bloc note ou notepad mais sans résultat une fois de plus..

Edit: Je viens de test avec Word aussi

Sub fermernotepad()
    AppActivate "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk"
    SendKeys "%{F4}"
End Sub

Mais il me surligne en Jaune toujours la ligne "AppActivate....."

Peux-tu m'envoyer le fichier avec ceci :

Sub fermernotepad()
    AppActivate "macro - Bloc-notes"
    SendKeys "%{F4}"
End Sub

et faire une copie d'écran avec le bloc note ouvert sur macro.txt ?

Voilà:

macro
13classeur3.xlsm (16.70 Ko)

Dans ma version, j'ai une étoile devant.

En tous cas quand je recopie exactement ce qui est indiqué, cela fonctionne !

Essaie d'ajouter l'extension du fichier .txt (car chez moi je l'ai configuré comme tel dans l'explorateur).

Désolé, mais à distance c'est vraiment difficile, dommage que la captation des fenêtres n'ait pas fonctionné).

capture d ecran 78

Malheureusement même avec .txt ça ne fonctionne pas je suis déçu...

Je ferrai le test avec un autre pc ou je vais kill l'antivirus voir.. je ne sais pas

1- un site décrivant les compatibilités 32/64bits ... mais comme je ne pourrais pas tester, je ne me suis pas appesanti !

2- J'ai bien une autre application qui me permet de savoir quelles sont les applications ouvertes. Elle est strictement inoffensive !

Voici son code (c'est de l'AutoIt)

Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
$titre = WinGetTitle("[ACTIVE]", "")

$var = WinList()

send( "Liste des fenêtres ouvertes :" & @LF & @LF )

For $i = 1 to $var[0][0]
  ; Only display visble windows that have a title
  If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    send( "Titre :{TAB}{TAB}" & $var[$i][0] & @LF &  "Handle : {TAB}" & $var[$i][1] & @LF & @LF)
  EndIf
Next

Func IsVisible($handle)

  If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
  Else
    Return 0
  EndIf

EndFunc

exit
17liste-fenetres.zip (413.06 Ko)
Rechercher des sujets similaires à "piloter application enregistrer"