IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Ouvrir un fichier EXTERNE si l'applic est deja ouverte


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut Ouvrir un fichier EXTERNE si l'applic est deja ouverte
    Bonjour,

    J'ai un petit problème, j'ai besoin d'ouvrir un fichier par un bouton, ça j'y arrive, mais mon problème était que lorsque je clique une 2 et une 3 et... ben le fichier s'ouvre 2,3,4,... fois(et l'applic aussi).

    Donc j'ai résolu ce problème et cherchant si l'applic étais déjà ouverte et ça c'est bon.

    Maintenant, si l'applic est fermé, tout fonctionne a merveille, mais si l'applic est déjà ouverte, je n'arrive pas a ouvrir le fichier dans cette applic ouverte.

    J'avais fait un truc avec les biblioteque activée, mais comme dans mon bureau on est 15 a travailler dessus et que l'on a pas tous la meme version exact d'excel. ça pose problème.

    Si quelqu'un à une solution en sachant que mon code vba doit absolument rester dans un Sheet et non pas dans un module ou un thisworkbook.

    Je vous met mon code ci-dessous

    code des Boutons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub open_feuille_autocad_Click()
        ' OUVERTURE DU DESSIN AUTOCAD
            ThisWorkbook.Sheets("FORM").open_feuille_autocad.Caption = "*OUVRE DESSIN AUTOCAD"
            NomBouton = "open_feuille_autocad"
            OuvreFichier
    End Sub
     
    Private Sub open_programme_Click()
        ' OUVERTURE DU PROGRAMME
            Sheets("FORM").open_programme.Caption = "*OUVRE LE PROGRAMME"
            NomBouton = "open_programme"
            OuvreFichier
    End Sub
    code OuvreFichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub OuvreFichier()
        Dim NomDeCefichierExcel, NomSansExt, NomAvecNewExt, Ext
        Dim CheminRepertoire, CheminNewFichier, CheminApp, OuvreFic
     
        '******************* DEFFINITION DES DONNEES **************************
            If NomBouton = "open_feuille_autocad" Or NomBouton = "ImprimerDossier" Then
                CheminApp = "C:\Program Files\Autodesk\MDT 2006\acad.exe"
                Ext = ".DWG"
            ElseIf NomBouton = "open_programme" Then
                CheminApp = "notepad.exe"
                Ext = ".CNC"
            Else
                MsgBox ("PAS UTILISE")
                End
            End If
        '**********************************************************************
     
        ' Definition du nom de fichier
        NomDeCefichierExcel = ActiveWorkbook.Name
     
        ' Definition du nom du fichier a traiter
        NomSansExt = Left(NomDeCefichierExcel, Len(NomDeCefichierExcel) - 4)
        NomAvecNewExt = (NomSansExt & Ext)
     
        ' Chemin du fichier a traiter
        CheminRepertoire = ActiveWorkbook.Path
        CheminNewFichier = CheminRepertoire & "\" & NomAvecNewExt
        OuvreFic = (CheminApp & " " & CheminNewFichier)
     
        On Error Resume Next
        'test si applic ouverte
        Dim svc As Object, sQuery As String, Oproc
     
        Set svc = GetObject("winmgmts:root\cimv2")
        sQuery = "select * from win32_process"
     
        For Each Oproc In svc.ExecQuery(sQuery)
            Debug.Print Oproc.Name
            If UCase(Oproc.Name) = UCase(CheminApp) Then
                'MsgBox "" & c & " ouverte"
                OuvreFic = (CheminNewFichier)
                Oproc.Activate
                Exit For
            Else
            End If
        Next
        Set svc = Nothing
     
        'ouverture fichier
        Shell (OuvreFic), vbMaximizedFocus
    End Sub

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Ho, je suis pas du tout accro au Shell, si quelqu'un a une autre solution... c'est très volontier, mais a part les biblioteques je vois pas trop et comme je suis au niveau 1/100 en connaissance vba, ben c'est dur pour moi.

    ou au moins si je pouvais ouvrir mon fichier en lecture seul ça m'arrangerais.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Regardes dans la FAQ Access, il y'a des bouts de codes pour killer des processus ouvert avec Shell Comment fermer un programme ouvert avec la fonction Shell ?

    Je l'ai trouvé en fonction des recherches avec le mot Processus.

    Ce sont des codes à base d'API, donc en théorie devraient fonctionner sous Excel.

    Pensez à regarder les FAQ et Sources Access et VB6, vous y trouverez souvent du code adaptable.

    Starec

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Je vais aller voir ça.

    Merci beaucoup.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Bon, pour le moment je trouve rien et j'en ai vraiment ma claque.
    Donc, je vais réessayer plus tard.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le code donné par Jean-Marc Rabilloud fonctionne parfaitement.
    Tu le lances par la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Appel()
         KillApp ("Autocad") 
    End Sub
    dans laquelle tu remplace "Autocad" par le nom qui apparaît dans la barre des tâches quand autocad est ouvert. Comme il est possible que le nom complet n'apparaisse pas, pour le faire apparaître, tu lances Appel() avec n'importe quel nom en utilisant la fonction de Jean-Marc Rabilloud, fonction dont j'ai très légèrement modifié le code afin d'afficher le nom des applis en cours.
    Une fois que tu as le nom, tu peux le mettre en dur à la place de "bloc-note" (dans le code)

    La fonction de Jean-Marc Rabilloud (à peine modifiée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
     
    Dim buf As String * 256
    Dim Titre As String
    Dim Longueur As Long
     
    'Récupère le titre de la fenêtre
    Longueur = GetWindowText(app_hWnd, buf, Len(buf))
    Titre = Left$(buf, Longueur)
     
    'J 'ai ajouté la condition suivante pour éviter d'afficher une foultitude de chaînes vides ds le msgbox
    If Trim(Titre) <> "" Then
     
        '****************** TOUT SE PASSE ICI ****************
        'Vérifie si le titre de la fenêtre correspond au nom recherché
            MsgBox Titre
    'Pour avoir le nom complet, tu commences par le récupérer 
    'pour l'utiliser dans la ligne suivante
        If InStr(LCase(Titre), "bloc-note") <> 0 Then 'tu remplaces par le nom correspondant à Autocad
            'Ferme la fenêtre
            SendMessage app_hWnd, WM_CLOSE, 0, 0
        End If
    End If
    'Poursuit l'énumération
    EnumCallback = 1
     
    End Function
    Pour le reste du code, tu as ça à l'adresse donnée par Starec.
    Une fois connu le nom, tu remets la fonction telle que Jean-Marc Rabilloud l'a écrite et tu mets le nom exact dans la macro Appel(...)

    Là, j'ai testé et c'est ok pour NotePad

Discussions similaires

  1. Ouvrir un fichier xls alors qu'excel est ouvert
    Par pascalouh dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/06/2007, 18h10
  2. Réponses: 1
    Dernier message: 04/10/2006, 13h40
  3. ouvrir un fichier XML dans une application tierce
    Par boulator dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 09/06/2006, 11h44
  4. Comment ouvrir un fichier externe?
    Par mathesna dans le forum Access
    Réponses: 9
    Dernier message: 03/04/2006, 14h27
  5. [Runtime] Ouvrir un fichier externe
    Par olkis dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/11/2005, 01h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo