Otwórz plik Excela bez tworzenia nowej instancji

Cze wszystkim
Chciałbym przyjść i napisać plik Excel (istniejący) z SW (z makrem vba), aby wpisać nazwę mojej części, nazwę klienta...
Ale napotykam problem, gdy używam tej metody:

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

Problem polega na tym, że ten kod tworzy dla mnie nową instancję Excela
I to sprawia mi problem, zwłaszcza jeśli plik mondoc jest już otwarty w pierwszej instancji, plik jest tylko do odczytu
w przypadku, gdy plik nie jest otwarty, działa, mogę pisać, ale sam mój plik mondoc zawiera makra, które nie mogą już działać z innymi otwartymi plikami (ponieważ nie wszystkie są w tej samej instancji Excela).

Moje pytanie
czy możliwe jest otwarcie za pomocą oprogramowania pliku mondoc w tej samej instancji, co ten, który jest już uruchomiony na mojej stacji roboczej
Jeśli tak, to jak to zrobić?
Przetestowałem kilka rzeczy, ale mój poziom VBA nie jest zbyt wysoki
Dziękuję za poświęcony czas.

Witam;
Aby sprawdzić, czy plik programu Excel jest już otwarty:
Jeśli tak, używamy tego pliku.
W przeciwnym razie otwieramy ten plik:

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

Zastępując ścieżkę wskazaną w " filepath " lokalizacją pliku Excel.

Uwaga: pamiętaj, aby używać tagów </> podczas publikowania makra
image

… w przeciwnym razie może zostać automatycznie przetłumaczony na tekst francuski. co nie sprawia, że jest łatwy do odczytania

2 polubienia

Dziękuję
To próba całości
:pray:

To świetnie, dziękuję

Myślę, że tego mi brakowało

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

Jeszcze raz dziękuję za poświęcony czas, który pozwala mi iść naprzód :+1:

1 polubienie

Witam
Mój kod jest prawie gotowy, ale nadal mam mały problem, którego nie mogę rozwiązać
po otwarciu pliku Excel jest w porządku (pojawia się i mogę wybrać swój wiersz)
z drugiej strony, jeśli plik Excel jest zamknięty, plik otwiera się dobrze, ale pozostaje w tle, jestem zmuszony wybrać go za pomocą paska narzędzi
Czy istnieje możliwość wymuszenia wyświetlania na pierwszym planie pliku Excel???
Jeśli tak, to jak to zrobić?
Dziękuję
Prawie zapomniałem, że plik Excel jest online (office365) i po otwarciu zawiera również makra.

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

Próbowałem kilku rzeczy, ustawiłem tempo, ale to nie działa
Zrobiłem to

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

To działa, ale to trochę żart, aby przezwyciężyć problem, którego nie rozumiem!!

… Jestem zakłopotany, całe makro nie powinno działać z Excelem w wersji online (musiałbyś otworzyć przeglądarkę internetową, zalogować się, zweryfikować ID), ponadto Solidworks nie jest znany z tego, że jest super kompatybilny z office 365... i nie sądzę, żeby można było sobie z tym poradzić w VBA...

Teoretycznie, aby wyświetlić okno programu Excel na pierwszym planie (w przypadku programu Excel w trybie offline), polecenie:

xlApp.Visible = True

to więcej niż wystarczająco.

1 polubienie

Aby zapewnić czytelność kodu, pamiętaj, aby umieścić deklaracje zmiennych " Dim..."  " na górze... tuż pod " Sub EXPDDC() "

Przesuń linie:

    ' Nettoyez
    Set xlWorkbook = Nothing
    Set xlApp = Nothing

Na końcu makra, tuż nad podrzędnym  końcem

1 polubienie

Nie ma obaw po mojej stronie. Office 365 od 2020 roku bez problemów

1 polubienie

Dzieje się tak dlatego, że w moim umyśle " office365 " jest wyłącznie online (microsoftonline.com). I widzę, że Excel jest zainstalowany lokalnie.

1 polubienie

Plik jest w trybie online, ale jest otwierany za pomocą lokalnej aplikacji Excel
Nie korzystam z przeglądarki Internet Explorer.

wypróbuj tryb krok po kroku (F8) i powiedz mi, czy program Excel jest widoczny na pierwszym planie, gdy dojdziesz do polecenia "xlWorkbook.Sheets("feuil1").Activate"
(wiersz 68) .

Położyłem więc kres poprzedniej linii
i w trybie krok po kroku, gdy przekraczam linię

xlWorkbook.Sheets("feuil1").Activate

Nic się nie dzieje

(Nie mogę wykonać całego kodu w trybie krokowym, ponieważ otwierając plik Excel, który sam w sobie zawiera makra, jestem zmuszony umieścić plik na pierwszym planie, aby wykonać je w trybie krokowym)

Jednak linia działa
Testowałem, zmieniając zakładki
Więc się nie pojawia, ale kiedy ręcznie umieszczam go na pierwszym planie, oczywiście podążam za wybraną zakładką

Musi pochodzić z makr, kiedy otworzyłem plik Excel
bo jak je wyłączę to działa
Patrzę w tym kierunku
Dziękuję

W wewnętrznym makrze programu Excel nie będzie ani jednego wiersza
xlApp.Visible = False
przypadkowo
lub
Application.ScreenUpdating = false

1 polubienie

To jest dokładnie to
w Workbook_Open() wywołuję makro, w którym go brakowało
Application.ScreenUpdating = true

Działa idealnie
Jeszcze raz dziękuję za poświęcony czas :pray::wink::+1:

1 polubienie