XL 2021 VBA - Quelle fenêtre (non Excel) était active juste avant

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Le problème fonctionnel est le suivant:
Une fenêtre Acrobat s'ouvre suite au double-clic sur un Embbeded Object PDF dans une feuille Excel.
La fenêtre Acrobat s'ouvre sur le même moniteur que la fenêtre Excel.
Je voudrais, via une macro, déplacer la fenêtre Acrobat sur un autre moniteur.

Le problème technique est le suivant:
Après l'affichage de la fenêtre Acrobat sur double-clic par Excel, lorsque je reviens sur Excel pour lancer (via le Ruban de @patricktoulon) la macro qui doit déplacer cette fenêtre Acrobat sur un autre moniteur, comment je trouve son Handle sachant que ça pourrait aussi être une fenêtre Word ou Photo ou autre ?
Autrement dit, comment puis-je trouver le Handle de la Window précédemment active avant le retour sur Excel pour lancer la Macro ?
L'ordre GETNEXT ou GETPREV tient-il compte de l'ordre d'activation ?
 
re bonjour @Dudu2
la reponse est non
le fait de changer le focus sur une fenêtre change son index dans le tableau de position dans le tread
et c'est bien la le probleme

la solution serait ques des le lancement de la fentre adobe lui fait un
setwindowpos hnwd,-1,0,0,0,0,&h1 or &h2
qui permet demettre la fenetre a position superieur et premier plan
du coup il est facile de redescendre sur la 0 qui est forcement la precedente
 
Ok merci pour ta confirmation.
Je n'ai pas la main, c'est Excel qui lance Acrobat, et le double-clic sur l'embbeded object je peux pas le voir.
La seule solution qui reste c'est de lister les fenêtres de la barre des tâches et de demander à l'utilisateur laquelle il souhaite placer sur un autre moniteur. Un peu lourd quand même ! Ou peut-être je peux vérifier les fenêtres sur le même moniteur (MonitorFromWindow).
 
non!! il y a une autre possibilité !!!!
le double clic sur l'object pdf dans la feuille declenche le window_deactivate( dans le thisworkbook testé je confirme)
parti de la tu a la main
et donc cet event tu lance notre petit bébé findwindowbyparttitle ou le nom que tu lui a donné qui recherche la widow avec une partie de texte
parti de la on peut considérer que au dblclick sur l'object tu a ta fenêtre pdf (le handle)
c'est bon tu va y arriver?
 
OK, c'est un idée intéressante que je vais exploiter.
Sinon suite à notre discussion sur le sujet des problèmes Word et Excel sur l'insertion en embbeded:
VB:
'----------------------
    'Intégration du fichier
    '----------------------
    FileName = Mid(TabFileFullNames(1), InStrRev(TabFileFullNames(1), "\") + 1)
    k = InStrRev(FileName, ".")
    If k > 0 Then
        Extension = LCase(Mid(FileName, k + 1))
    Else
        Extension = ""
    End If
    
    Select Case Extension
        Case "pdf"
            IconShapeName = "IconePDF"
            IconFileName = "PDF.ico"
            
        Case "doc", "docx"
            IconShapeName = "IconeWord"
            IconFileName = "Word.ico"
            
        Case "xls", "xlsx", "xlsm"
            IconShapeName = "IconeExcel"
            IconFileName = "Excel.ico"
            
        Case "txt"
            IconShapeName = "IconeText"
            IconFileName = "Text.ico"
            
        Case Else
            IconShapeName = "IconeAutre"
            IconFileName = "Autre.ico"
    End Select
    
    'Gestion du fichier icône
    If Len(Dir(Environ("TEMP") & "\" & IconFileName)) = 0 Then
        Set oShell = CreateObject("Shell.Application")
        
        With ThisWorkbook.Worksheets(1).OLEObjects(IconShapeName)
            'Save the Embbeded Object
            .Copy
            oShell.Namespace(Environ("TEMP")).Self.InvokeVerb "Paste"
        End With
    End If
    
    'Intégration du fichier
    If IconShapeName = "IconeWord" Or IconShapeName = "IconeExcel" Then
        'Avec Word et Excel impossible de faire ce qu'on veut
        Set OLEObject = ActiveSheet.OLEObjects.Add(FileName:=TabFileFullNames(1), Link:=False, DisplayAsIcon:=True, _
                                                   IconFileName:=Environ("TEMP") & "\" & IconFileName, _
                                                   IconLabel:=DocName, IconIndex:=0, _
                                                   Left:=ActiveCell.Left, _
                                                   Top:=ActiveCell.Top)
    Else
        'Avec les applications non-office, pour avoir le nom de fichier sur 1 ligne
        Set OLEObject = ActiveSheet.OLEObjects.Add(FileName:=TabFileFullNames(1), Link:=False, _
                                                   Left:=ActiveCell.Left, _
                                                   Top:=ActiveCell.Top)
    End If
 

Pièces jointes

bonjour @Dudu2
en fait c'est beaucoup plus simple que ça et sans issue en même temps
quand le pdf est ouvert par le double click sur l'embeded object
le texte de la caption est simple

1° c'est simple par ce que
  • le texte de la barre de titre est toujours le même c'est :"Acrobat Document in " & thisworkbook.name
2° sans issue
  • parce que tout les object embeded pdf ouvrant les pdf vont mettre cette caption dans la barre de titre
  • du coup si tu en ouvre plusieurs ben pour chopper le bon bonne chance
donc au final
un fichier oui!! mais plusieurs de même type non(sauf si c'est juste pour les ouvrir)

j'ai aussi testé ce matin ma théorie avec le switch avec le setwindowpos hwnd,-1,.....
la aussi c'est choux blanc ; en effet le changement dans le switch change l'ordre des fenêtres

conclusion:
si tu veux utiliser des embeded object pdf ou autre
en fait ok pour l'aspect stockage sur la feuille mais
les rendre invisibles
ajouter autant de bouton ou shapes pour les lancer
au lancement créer un vrai fichier a partir de l'object pdf
et lancer le vrai fichier pdf

l'a recherche du handle sera plus simple après ouverture
 
demo avec un embeded acrobat et l'autre en package
comme tu peux le constater c'est le même titre de fenêtre
1768632358702.png
 
OK merci pour tes essais.
Je vais donc revenir à la liste des fenêtres de la barre des tâches qui sont sur le même moniteur qu'Excel et dont l'état est xlNormal ou xlMaximized.
S'il n'y en a qu'une seule (en plus d'Excel) je la déplace. Sinon je demande laquelle.
Cependant je ne suis pas sûr de proposer une telle fonctionnalité complexe à mettre en place alors qu'un simple déplacement manuel règle le problème.
 
Bonjour @patricktoulon,
le double clic sur l'object pdf dans la feuille declenche le window_deactivate( dans le thisworkbook testé je confirme)
Je sais pas comment tu fais mais moi je n'y arrive pas ! Le Window_Deactivate ne se déclenche pas !
Ça ne marche qu'entre fenêtres Excel. Mais pas à l'activation d'une fenêtre d'une autre application ni au lancement de l'embbeded file.
Que ce soit en Event direct sur la feuille, sur le Workbook ou en Classe Application.
 

Pièces jointes

voici ma proposition
elle consiste a mettre
une shape dessus l'oleobject on l'appelerapar exemple mask
  1. la rendre transparente(Attention j'ai dit transparente et non sans fond sinon elle n'est pas clickable
  2. affecter une macro pour le click à cette shape mask
dans la macro affectée
la rentre invisible
et appeler en différé (ontime sans delay c'est suffisant,juste pour que l'appel soit indirecte)la macro réelle pour cliquer sur l'oleobject
en différé sinon ca plante excel et c'est normal

dans la macro réelle du click
je determine un point dans la feuille correspondant à l'oleobject
avec les api je double click
je cherche le handle par rapport au texte de la caption qui diffère selon l'app par defaut pour le document
et je remet ma shape visible
terminé
et pour le coup j'ai tester chez moi
un oleobject acrobat document
un oleobject package
un oleobject package2
et enfin un oleobject etant juste un lien ( il est possible que celui ci ne fonctionne pas chez toi et c'est normal (change le lien dans la barre de formule
je t'ai préparé un classeur de demo
alors selon l'oleobject se sera plus ou moins long (on est en dessous la demie seconde donc ça va
pour le pdf j'ai testé avec l'application par defaut
acrobat 7 ,9 et 10
edge
firefox

Patrick
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Problème Code VBA
Réponses
9
Affichages
530
Retour