Ouvrir fichier excel sans creer de nouvelle instance

Bonjour à tous
je souhaiterais venir écrire un fichier Excel (existant) depuis SW (avec une macro vba) pour y écrire le nom de ma pièce, le nom du client…
Mais je butte sur problème lorsque j’utilise cette méthode :

Dim xlApp As Excel.Application
Set xlApp = Excel.Application
Dim wbk As Excel.Workbook
Dim sht As Excel.Worksheet

With xlApp
    .Visible = True
    .Workbooks.Open ("mondoc.xlsm")
    
End With

Le problème est que ce code me crée une nouvelle instance de Excel
et cela me pose un problème notamment si le fichier mondoc est déjà ouvert dans une première instance, le fichier et en lecture seule
dans le cas où le fichier ne serait pas ouvert, cela fonctionne, je peux écrire, mais mon fichier mondoc contient lui-même des macros qui ne peuvent plus fonctionner avec les autres fichiers ouverts (du fait qu’ils ne soient pas tous dans la même instance de Excel).

Ma question
est-ce possible d’ouvrir via SW le fichier mondoc dans la même instance que celle déjà en cours sur mon poste
si oui comment faire ?
j’ai testé plusieurs choses, mais mon niveau vba n’est pas très élevé
merci pour le temps consacré.

Bonjour;
Pour vérifier si un fichier Excel est déjà ouvert:
Si oui, on utilise ce fichier.
Sinon on ouvre ce fichier:

Sub CheckAndOpenExcelFile()
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim filePath As String
    Dim isFileOpen As Boolean

    ' Chemin du fichier Excel
    filePath = "C:\Chemin\Vers\Votre\Fichier.xlsx"

    ' Vérifiez si Excel est déjà ouvert
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If xlApp Is Nothing Then
        ' Si Excel n'est pas ouvert, ouvrez une nouvelle instance
        Set xlApp = CreateObject("Excel.Application")
    End If
    On Error GoTo 0

    ' Vérifiez si le fichier est déjà ouvert
    isFileOpen = False
    For Each xlWorkbook In xlApp.Workbooks
        If xlWorkbook.FullName = filePath Then
            isFileOpen = True
            Set xlWorkbook = xlApp.Workbooks.Open(filePath)
            Exit For
        End If
    Next xlWorkbook

    ' Si le fichier n'est pas ouvert, ouvrez-le
    If Not isFileOpen Then
        Set xlWorkbook = xlApp.Workbooks.Open(filePath)
    End If

    ' Affichez Excel (facultatif)
    xlApp.Visible = True

    ' Faites quelque chose avec le fichier Excel
    ' ...

    ' Nettoyez
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
End Sub

En remplaçant le chemin indiqué dans « filepath » par l’emplacement de votre fichier Excel.

Nota: pensez à utiliser les balises </> quand vous postez une macro
image

… sinon celle-ci risque d’être traduite automatiquement en texte Français. ce qui ne facilite pas la lecture

2 « J'aime »

Merci
C’est une épreuve de l’ensemble
:pray:

C’est top merci

il me manquait cela, je pense

Set xlApp = GetObject(, "Excel.Application")

encore merci pour le temps passé cela me permet d’avancer :+1:

1 « J'aime »

Salut
mon code est presque terminé, mais j’ai encore un petit souci que je n’arrive pas à résoudre
lorsque le fichier Excel est ouvert, c’est ok (il s’affiche et je peux sélectionner ma ligne)
en revanche si le fichier Excel est fermé, le fichier s’ouvre bien, mais il reste en arrière-plan, je suis obligé de le sélectionner via la barre d’outils
y a-t-il la possibilité de forcer l’affichage en premier plan du fichier Excel ???
si oui comment faire ?
Merci
J’allais oublier, le fichier Excel est en ligne (office365) et il contient également des macros à l’ouverture.

Sub EXPDDC()



Set swApp = GetObject(, "SldWorks.Application") 'CreateObject("SldWorks.Application")
    Set swmodel = swApp.ActiveDoc
    
If swmodel Is Nothing Then
    Exit Sub
End If

If swmodel.GetType = 3 Then

    Set swDraw = swmodel
    Set swView = swDraw.GetFirstView
    Set swView = swView.GetNextView
    Set swParentModel = swView.ReferencedDocument
    prop1 = swParentModel.GetTitle & "-" & swParentModel.CustomInfo2("", "REVISION")
    If swParentModel.CustomInfo2("", "type") = "FAB" Then
    prop2 = swParentModel.CustomInfo2("", "client")
    ElseIf prop4 = "QUINCAI" Then
    prop2 = ""
    Else: MsgBox "MANQUE CODE FAMILLE"
    End If
    If swmodel.CustomInfo2("", "ETAT") = "VALIDE" And swParentModel.CustomInfo2("", "ETAT") = "VALIDE" Then prop3 = "etat ok"
    
    Else
    
    prop1 = swmodel.GetTitle & "-" & swmodel.CustomInfo2("", "REVISION")
    If swmodel.CustomInfo2("", "type") = "FAB" Then
    prop2 = swmodel.CustomInfo2("", "client")
    ElseIf prop4 = "QUINCAI" Then
    prop2 = ""
    Else: MsgBox "MANQUE CODE FAMILLE"
    End If
    If swmodel.CustomInfo2("", "ETAT") = "VALIDE" Then prop3 = "etat ok"
    
    
End If

If prop3 <> "etat ok" Then

    réponse = MsgBox("LES FICHIERS NE SONT PAS A L'ETAT   " & Chr(34) & " VALIDÉ " & Chr(34) & vbCrLf & "SOUHAITEZ VOUS TOUS DE MÊME EXPORTER VERS" & vbCrLf & Chr(34) & " DEMANDE DE CHIFFRAGE " & Chr(34) & " ?", vbExclamation + vbYesNo + vbDefaultButton2, "ETAT FICHIER")

End If
        
    If réponse = vbYes Or prop3 = "etat ok" Then
    
        'traitement
        Dim xlApp As Object
        Dim xlWorkbook As Object
        Dim filePath As String
        Dim Selec As Range
    
        ' Chemin du fichier Excel
        filePath = "chemin/monfichier.xlsm"

        'Vérifiez si Excel est déjà ouvert
        On Error Resume Next
        Set xlApp = GetObject(, "Excel.Application")
        If xlApp Is Nothing Then
        ' Si Excel n'est pas ouvert, ouvrez une nouvelle instance
        Set xlApp = CreateObject("Excel.Application")
        
    End If
    
        On Error GoTo 0
        Set xlWorkbook = xlApp.Workbooks.Open(filePath)
       
        ' Affichez Excel (facultatif)
        xlApp.Visible = True
        xlWorkbook.Sheets("feuil1").Activate
        

        ' Faites quelque chose avec le fichier Excel
        On Error Resume Next    'au cas où on clique sur Annuler
        Set Selec = xlApp.InputBox("CLIQUER SUR LA LIGNE DE DESTINATION", Type:=8)
        On Error GoTo 0
    
    If Not Selec Is Nothing Then
        Ligne = Selec.Row
        xlWorkbook.Sheets("feuil1").Cells(Ligne, 2) = prop1
        xlWorkbook.Sheets("feuil1").Cells(Ligne, 4) = prop2
        xlWorkbook.Save
    Else
        swApp.Visible = True
        swApp.SendMsgToUser "EXPORT ANNULÉ!"
    End If
  
    ' Nettoyez
    Set xlWorkbook = Nothing
    Set xlApp = Nothing

Else
    MsgBox "VEUILLEZ MODIFIER L'ETAT DES FICHIERS" & vbCrLf & "( AUCUNE ACTION EFECTUEE !!! )"
    End If

End Sub
saisissez ou collez du code ici

J’ai essayé plusieurs choses mettre une tempo mais cela ne marche pas
j’ai fait ça

        Set xlWorkbook = xlApp.Workbooks.Open(filePath)
        Set xlWorkbook = xlApp.Workbooks.Open(filePath)

Cela fonctionne, mais c’est de la bricole pour palier à un problème que je ne comprends pas !!!

… Je suis perplexe, l’ensemble de la Macro ne devrait pas fonctionner avec Excel en version online (il faudrait ouvrir un navigateur web, s’identifier, valider l’ID ), de plus Solidworks n’est pas connu pour être super-compatibe avec office 365… et je je crois pas qu’il soit possible de le gérer en VBA…

En théorie pour afficher la fenêtre Excel au premier plan (pour un excel offline) la commande:

xlApp.Visible = True

suffit amplement.

1 « J'aime »

Pour la lisibilité de votre code, pensez à mettre vos déclarations de variables Les « Dim… » en haut… juste sous « Sub EXPDDC() »

en déplacez les lignes:

    ' Nettoyez
    Set xlWorkbook = Nothing
    Set xlApp = Nothing

A la fin de votre macro, juste au dessus du « end sub »

1 « J'aime »

Pas de soucis de mon côté. Office 365 depuis la 2020 sans problème

1 « J'aime »

C’est que dans mon esprit « office365 » est exclusivement en Online (microsoftonline.com). Et je lui distingue l’Excel installé en local.

1 « J'aime »

Le fichier est en ligne, mais il est ouvert avec l’application Excel local
je ne travaille pas via un explorateur web.

essayez le mode pas-a-pas (touche F8) et dites moi si excel est visible au premier plan, arrivé à la commande "xlWorkbook.Sheets("feuil1").Activate"
(ligne 68) .

Alors, j’ai mis un point d’arrêt sur la ligne précédente
et en mode pas à pas lorsque je passe la ligne

xlWorkbook.Sheets("feuil1").Activate

il ne se passe rien

(je ne peux pas faire tout le code en mode pas à pas, car lors de l’ouverture du fichier Excel qui contient lui-même des macros, je suis obligé de mettre le fichier au premier plan pour les exécuter en mode pas à pas)

Pourtant, la ligne fonctionne
j’ai testé en changent d’onglet
alors ça ne s’affiche pas, mais lorsque que je le mets au premier plan manuellement, je suis bien sûr l’onglet choisi

Cela doit venir des macros à l’ouverture de mon fichier Excel
car lorsque je les désactive cela fonctionne
je cherche de ce côté
merci

Dans votre macro interne à Excel vous n’auriez pas une ligne
xlApp.Visible = False
par hasard
ou
Application.ScreenUpdating = false

1 « J'aime »

C’est exactement cela
dans le Workbook_Open() j’appelle une macro dans laquelle il manquait
Application.ScreenUpdating = true

ça marche parfaitement
encore merci pour le temps passé :pray::wink::+1:

1 « J'aime »