Makro SolidWorks za pośrednictwem programu Excel

Witam 

Szukałem makra, które wykonałoby odpowiednik akcji [Alt + TAB] (zmiana aktywnego dokumentu) i znalazłem taki kod:

 

Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim vModels As Variant
Dim count As Integer
Dim opendocs As New Collection
Dim docname As Variant
Dim currentdocTitle As String
Dim title As String

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
currentdocTitle = swModel.GetTitle
vModels = swApp.GetDocuments

For count = LBound(vModels) To UBound(vModels) 'get list of open documents

    Set swModel = vModels(count)
    If swModel.Visible <> False Then
        opendocs.Add (swModel.GetTitle)
    End If

Next

count = 0

If opendocs(opendocs.count) = currentdocTitle Then ' if its the last document in the list, switch to the first document

    swApp.ActivateDoc2 opendocs(1), False, 0
 
End

Else ' else find the next document and activate
 
    For count = 1 To opendocs.count
 
        If opendocs(count) = currentdocTitle Then
            swApp.ActivateDoc2 opendocs(count + 1), False, 0
            End
        End If
 
    Next
 
End If

End Sub

 

i działa doskonale, gdy uruchamia to makro bezpośrednio przez SolidWorks.

Mój problem polega na tym, że tworzę narzędzie, które uruchamia się przez Excela i dlatego musi pisać wszystkie moje makra w VBA Excel, a nie VBA Solidworks.

kiedy kopiuję/wklejam ten kod do makra programu Excel, oto komunikat o błędzie, który otrzymuję:

run-time error '438'
Object doesn't support this property or method

Jeśli kliknę na debug, podświetli mi ten wiersz 

Set swApp = Application.SldWorks

 

Próbowałem kilku rzeczy, ale nie mam już zbyt dużego pomysłu...

 

Na poprzednich makrach mam taki kod:

Set swApp = CreateObject("SldWorks.application")

 

Więc próbowałem zrobić to samo dla tego, ale to nie działa, otrzymuję ten komunikat o błędzie:

Run-time error'13':
Tpe mismatch

wskazując na tę linię:

swApp.ActivateDoc2 opendocs(1), False, 0

 

w VBA Excel mam włączone referencje Biblioteka typów SldWorks 2017, biblioteka typów SOLIDWORKS 2017 Commends i biblioteka typów SOLIDWORKS 2017 Constant .

 

Czy ktoś ma jakieś pomysły?

Z góry dziękuję

Yves

Witam

Po prostu "po co" zmieniać aktywny dokument z Excela?

W przeciwnym razie na SW jest to [Ctrl] + [Tab]

Cześć remrem,

Tak, wiem, że jest to [Ctrl]+[Tab] polecenie klawiaturowe w solidworks, ale jeśli muszę to zrobić z Excela, to dlatego, że tworzę  narzędzie do konfiguracji maszyny, które uruchamia się z Excela, więc wszystkie makra solidworks są napisane w Excelu

Jeśli chcesz wykonać makro konfiguracyjne w programie Excel. Pod żadnym pozorem nie wolno tego robić!

Musisz utworzyć obiekt dla każdego otwartego dokumentu. A potem musisz wybrać dokument i wykonać swoje operacje, a następnie wybrać inny dokument i wykonać swoje operacje itd.

W przeciwnym razie, jeśli użytkownik zmieni doc podczas przetwarzania, cały kod zostanie zwinięty.

Jak otworzyć dokumenty w makrze?

1 polubienie

Moje makro w Excelu polega na otwarciu pliku solidworks (złożenia złożonego z kilku części), a następnie zastąpieniu wszystkich części, które go tworzą, a nie części, których nazwy i ścieżki zostały wybrane w pliku Excel. Na chwilę obecną mój program działa bardzo dobrze.

W przypadku jednej z części muszę ją otworzyć przed otwarciem zespołu, aby zmodyfikować 2/3 boków (mam już stronę, która do tego pasuje), a następnie zapisać ją pod nową nazwą. To pewne uproszczenie, ale w pewnym momencie otwieram plan i muszę przełączyć się z powrotem na część dokumentacyjną.

Podczas wymiany części makro przejdzie do tej nowej części (nie ma do tego PB)

Aby otworzyć pokój:

Set swApp = CreateObject("SldWorks.application")

Rep = ShellExecute(0, "open", CHEMIN & "\" & NOM, vbNullString, vbNullString, 5)
Set Part = swApp.ActiveDoc

 Mój pokój otwiera się dobrze zgodnie z jego planem (tą samą metodą).

następnie używam kodu, który zamieściłem w moim pierwotnym pytaniu, zastępując swApp przez swApp2, ponieważ swApp jest już używany w tym, co właśnie skopiowałem/wkleiłem.

Nie ma szans, że użytkownik zmieni dokument podczas przetwarzania mojego kodu, ponieważ wszystkie kroki są wykonywane automatycznie, po kliknięciu w jeden przycisk.

 

Zdecydowanie polecam zapoznanie się z pomocą API oprogramowania.

Aby otworzyć dokument, radzę nie używać poleceń "ShellExecute", ale zrobić to za pomocą interfejsów API oprogramowania, takich jak tutaj: http://help.solidworks.com/2018/english/api/sldworksapi/Open_Assembly_Document_Example_VB.htm

Będziesz mógł otworzyć kilka dokumentów w tym samym procesie, modyfikować je niezależnie, zamykać...

Nie zaleca się otwierania kilku procesów oprogramowania, ponieważ powoduje to poważne awarie, nie wspominając o zarządzaniu plikami...

1 polubienie

Wtedy 

Właśnie napisałem esej, robiąc dokładnie to, co jest napisane na stronie, którą wysłałeś.

Otrzymuję ten sam komunikat o błędzie:

run-time error '438'
Object doesn't support this property or method

wskazując na linię:

Set swApp = Application.SldWorks

 

Niestety, nie jestem zbyt dobry w makrach SolidWoprks i dlatego jestem trochę zagubiony we wszystkich obiektach, procesach, aplikacjach...

Witam

Spróbuj uruchomić makro w następujący sposób:

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

If swApp Is Nothing Then
   Set swApp = CreateObject("SLDWORKS.application")
   swApp.Visible = True
Else
   Set swApp = Application.SldWorks
End If

Set swModel = swApp.ActiveDoc
    
If swModel Is Nothing Then
   MsgBox "Aucun document SW n'est ouvert"
Else
   MsgBox swModel.GetTitle
End If

 

Pozwala to na utworzenie instancji Solidworks lub dołączenie do istniejącej, jeśli Solidworks jest już otwarty, a następnie sprawdzenie, czy istnieje dokument.

Potrzebna jest co najmniej biblioteka typu referencyjnego SldWorks 2017.

Pozdrowienia

1 polubienie

Witam

Przepraszam za czas odpowiedzi, ale musiałem przełączyć się na inne projekty.

Myślę, że teraz widzę trochę wyraźniej, mogę zarządzać moją otwartą aplikacją SolidWorks... Mój problem polega teraz na tym, że w mojej sekwencji czynności, które chcę, aby makro wykonało, muszę otworzyć pokój, jego rysunek, wrócić do pokoju, zapisać go pod nową nazwą, zamknąć pokój, zapisać rysunek pod tą samą nazwą co nowy pokój, a następnie zamknąć rysunek.

Muszę to wszystko zrobić, ale mój problem polega na tym, że po tym wszystkim muszę zrobić to samo ponownie z drugą częścią, a potem... To nie działa.

Aby zamknąć dokument za pomocą dokumentu wyjustowującego:

swApp.CloseDoc NOMFICHIEROUVERT.SLDPRT

 

A do zamknięcia dokumentu rysunkowego używam:

swApp.CloseDoc swModel.GetTitle

 

Ponieważ 

swApp.CloseDoc NOMFICHIEROUVERT.SLDDRW

nie działa.

Ta metoda zamyka mój plik rysunku, ale także zamyka okno solidworks i myślę, że mój problem wynika stamtąd, ponieważ aplikacja nie jest zamknięta na to wszystko.

a gdy poproszę o otwarcie drugiego pokoju z:

    Set swDocSpecification = swApp.GetOpenDocSpec(PATH & "\" & NOUVELLEPIECEAOUVRIR.SLDPRT)
    Set swModel = swApp.OpenDoc7(swDocSpecification)

(Ta sama metoda, której użyto wcześniej do zróżnicowania mojego pierwszego dzieła, a także jego rysunku), mam następujący komunikat:

Run-time error '-2147023170 (800706be)':

Automation error
The remote procedure call failed

wskazując na:

Set swDocSpecification = swApp.GetOpenDocSpec(PATH & "\" & NOUVELLEPIECEAOUVRIR.SLDPRT)

 

Czy ktoś ma jakieś pomysły?

Z góry dziękuję

Yves

Witam

Jeśli otworzysz Solidworks z CreateObject w makrze, po zamknięciu ostatniego dokumentu zostanie rozłączony obiekt "SLDWORKS.application". Aby tego uniknąć, możesz otworzyć następujący plik przed zamknięciem ostatniego dokumentu pierwszego procesu:

Sub Macro1()

    Dim swApp As SldWorks.SldWorks
    Dim swModelUn As SldWorks.ModelDoc2
    Dim swModelDeux As SldWorks.ModelDoc2

    If swApp Is Nothing Then
        Set swApp = CreateObject("SLDWORKS.application")
        swApp.Visible = True
    Else
        Set swApp = Application.SldWorks
    End If

    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1520.sldprt")
    Set swModelUn = swApp.OpenDoc7(swDocSpecification)
    MsgBox swModelUn.GetTitle
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1520.slddrw")
    Set swModelUn = swApp.OpenDoc7(swDocSpecification)
    MsgBox swModelUn.GetTitle
    
    swApp.CloseDoc swModelUn.GetTitle
    
    Set swModelUn = swApp.ActiveDoc
    MsgBox swModelUn.GetTitle
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1532.sldprt")
    Set swModelDeux = swApp.OpenDoc7(swDocSpecification)
    
    swApp.CloseDoc swModelUn.GetTitle

    MsgBox swModelDeux.GetTitle
    
    swApp.CloseDoc swModelDeux.GetTitle
    
End Sub

 

Innym rozwiązaniem jest zresetowanie swApp do Nothing, a następnie odtworzenie obiektu przed przetworzeniem pliku 2:

    Set swApp = Nothing
    
    If swApp Is Nothing Then
        Set swApp = CreateObject("SLDWORKS.application")
        swApp.Visible = True
    Else
        Set swApp = Application.SldWorks
    End If
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1533.sldprt")
    Set swModelDeux = swApp.OpenDoc7(swDocSpecification)
    
    MsgBox swModelDeux.GetTitle
    
    swApp.CloseDoc swModelDeux.GetTitle

 

Innym rozwiązaniem byłoby otwarcie Solidworks z powłoką ("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe") na początku makra, a następnie podłączenie do tego Solidworks, co jest tym, co linia Set swApp = Application.SldWorks robi w if na początku. Bądź ostrożny, otwieranie Solidworks na tej zasadzie jest znacznie dłuższe i może zmusić Cię do ustawienia tempa przed kontynuowaniem przetwarzania, a dodatkowo jest nadal, moim zdaniem, znacznie mniej czyste.

Pozdrowienia

2 polubienia

Witam wszystkich i życzę szczęśliwego Nowego Roku

Jeszcze raz przepraszam za czas odpowiedzi.

Ponieważ mam dwie pary (plik PART + plik DRW) do otwarcia i zapisania pod nową nazwą, próbowałem otworzyć drugi plik PART i jego DRW przed zamknięciem pierwszego pliku DRW, pozwólcie, że wyjaśnię:

  • - Otwieram PART1
  • - Otwieram DRW1
  • - Wracam do CZĘŚCI 1
  • - Zamykam CZĘŚĆ 1
  • - Otwieram CZĘŚĆ 2
  • - Otwieram DRW2
  • - Wracam do CZ.2
  • - Zamknij CZĘŚĆ 2

A teraz wróciłem do DRW2, ale ponieważ nadal mam otwarty DRW1, powinienem być w stanie zamknąć DRW2... ale nie... żadnych komunikatów o błędach, ale ani DRW2, ani DRW1 nie zamykają.

Z drugiej strony, jeśli postąpię w następujący sposób:

  • - Otwieram PART1
  • - Otwieram DRW1
  • - Wracam do CZĘŚCI 1
  • - Zamykam CZĘŚĆ 1
  • - Otwieram CZĘŚĆ 2
  • - Otwieram DRW2
  • - Zamykam DRW2
  • - Zamknij CZĘŚĆ 2

W tym przypadku DRW2 zamyka się razem z PART2

Jakieś pomysły?

Dziękuję

Yves

Witam

Bądź ostrożny, w podanym powyżej przykładzie bawiłem się kilkoma obiektami ModelDoc2:

Dim swModelUn As SldWorks.ModelDoc2

Dim swModelTwo As SldWorks.ModelDoc2

Obiekty, którymi należy manipulować, aby je zdefiniować, aktywować i zamknąć. Nie mieszasz się szybko, a potem albo zamykasz niewłaściwy dokument, albo próbujesz zamknąć niezdefiniowany obiekt itp.

Pozdrowienia