2017-10-11 18 views
0

Est-il possible de détecter et de lister tous les fichiers PDF ouverts d'Excel Vba? Je sais que je peux vérifier un fichier PDF et un chemin d'accès spécifiques, mais dans ce cas, le nom et le chemin du fichier ne seront pas connus.Détecter et lister tous les fichiers PDF ouverts d'Excel VBA

Merci

+1

Vous pouvez utiliser des API Win pour cela. Voir: https://support.microsoft.com/en-us/help/183009/how-to-enumerate-windows-using-the-win32-api. Il pourrait être plus facile d'utiliser un langage d'encapsulation comme Autohotkey ou AutoIT pour ce faire. –

+1

@Siddharth Rout a une solution sur [cet autre forum] (https://www.experts-exchange.com/questions/26817662/VBA-or-VBS-enumerate-all-open-Acrobat-Reader-documents.html) –

+0

@Ryan Wildry Merci! J'oublie toujours que je peux utiliser AHK pour contourner Excel VBA manque de fonctionnalité dans certains domaines. –

Répondre

0

m'a rappelé dans le commentaire par Ryan Wildry que je peux utiliser AHK pour des choses comme ça. Voici le code que j'ai fini par utiliser:

D'abord, je crée un pattern regex dans VBA pour l'affichage des titres des fenêtres PDF. J'ai utilisé quelques fonctions que j'ai extraites du Web pour des applications précédentes.

principal VBA:

Private Sub Get_PDFs() 

    Dim pattern As String 
    Dim ahkParamColl As Collection 
    Dim windowArr() As String 

    'regex pattern to match with open Adobe PDF Files 
    pattern = "^(.+)\.pdf - Adobe Reader$" 

    'add pattern to AHK parameter collection 
    Set ahkParamColl = Nothing 
    Set ahkParamColl = New Collection 
    ahkParamColl.Add (pattern) 

    'run window detection AHK Script 
    Call Functions.Run_AHK("Detect All Open Windows.ahk", ahkParamColl) 

    'send list to array 
    windowArr = Split(GetClipBoardText, Chr(10)) 

End Sub 

Fonction appeler AHK:

'these are for AHK scripts to run from Excel 
Public Const ahk_ScriptsLoc = """C:\Location of Scripts\" 'starts w/a quote 
Public Const ahk_PgmLoc = "C:\Location of AHK Pogram\AHK.exe" 


Function Run_AHK(AHK_Script_Name As String, Optional Parameters As Collection) 

'Call AHK script from VBA 
Dim i As Integer 
Dim waitOnReturn As Boolean: waitOnReturn = True 
Dim windowStyle As Integer: windowStyle = 1 
Dim AHKscript As String 
Dim wsh As Object 
Set wsh = VBA.CreateObject("WScript.Shell") 

    'set the ahk script string to call 
    AHKscript = ahk_PgmLoc & " " & ahk_ScriptsLoc & AHK_Script_Name & """ """ 

    'add parameters to script string 
    If Not Parameters Is Nothing Then 
     For Each s In Parameters 
      AHKscript = AHKscript & s & """ """ 
     Next s 
    End If 

    'run ahk script 
    wsh.Run AHKscript, windowStyle, waitOnReturn 

End Function 

fonction pour obtenir le texte le presse-papiers:

Public Function GetClipBoardText() 
    Dim DataObj As MsForms.DataObject 
    Set DataObj = New MsForms.DataObject 

    On Error GoTo Whoa 

    '~~> Get data from the clipboard. 
    DataObj.GetFromClipboard 

    '~~> Get clipboard contents 
    myString = DataObj.GetText(1) 
    GetClipBoardText = myString 

    Exit Function 
Whoa: 
    If Err <> 0 Then MsgBox "Data on clipboard is not text or is empty" 
End Function 

principal AHK (snagged de Here):

;regex pattern sent from calling application 
pattern = %1% 

;get all window names and loop through 
WinGet windows, List 
Loop %windows% 
{ 
    id := windows%A_Index% 
    WinGetTitle wt, ahk_id %id% 
    ;if window matches pattern, add to list 
    IF (RegexMatch(wt,pattern)>0) then 
    { 
     s .= wt . "`n" 
    } 
} 
;send list to clipboard 
Clipboard := s 

La macro VBA va donc configurer le motif regex à envoyer au script AHK. Je peux l'utiliser pour d'autres types de documents ou des modèles de dénomination plus tard si nécessaire. On appellera alors AHK qui boucle à travers chaque fenêtre ouverte, vérifie si elle correspond au modèle défini, puis l'ajoute à une chaîne. Cette chaîne est envoyée au presse-papiers, que VBA lit et divise ensuite en un tableau que je peux utiliser.

Je suis sûr qu'il y a probablement un moyen plus efficace, mais c'était une façon amusante et la seule façon de le faire.