Macro SolidWorks via Excel

Hallo 

Ik was op zoek naar een macro om het equivalent van de actie [Alt + TAB] uit te voeren (actief document wijzigen) en ik vond deze code:

 

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

 

en het werkt perfect wanneer de start van deze macro rechtstreeks via SolidWorks.

Mijn probleem is dat ik een tool maak die via Excel start en daarom al mijn macro's in VBA Excel moet schrijven en niet in VBA Solidworks.

wanneer ik deze code kopieer / plak in mijn Excel-macro, is hier de foutmelding die ik krijg:

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

Als ik op debuggen klik, wordt deze regel voor mij gemarkeerd

Set swApp = Application.SldWorks

 

Ik heb verschillende dingen geprobeerd, maar ik heb niet veel idee meer...

 

Op de vorige macro's heb ik deze code:

Set swApp = CreateObject("SldWorks.application")

 

Dus ik heb geprobeerd hetzelfde te doen voor deze, maar het werkt niet, ik krijg deze foutmelding:

Run-time error'13':
Tpe mismatch

wijzend naar deze regel:

swApp.ActivateDoc2 opendocs(1), False, 0

 

op VBA Excel heb ik de referenties SldWorks 2017 Type Library, SOLIDWORKS 2017 Commends type library en SOLIDWORKS 2017 Constant type library ingeschakeld.

 

Heeft iemand enig idee?

Bij voorbaat dank

Yves

Hallo

Alleen "waarom" het actieve document van Excel veranderen?

Anders is het op SW [Ctrl] + [Tab]

Hoi herinnering,

Ja, ik weet dat het [Ctrl]+[Tab] de toetsenbordopdracht op solidworks is, maar als ik dit vanuit Excel moet doen, komt dat omdat ik een  machineconfiguratietool maak die wordt gestart vanuit Excel, dus alle solidworks-macro's zijn geschreven in Excel

Als u uw configuratiemacro in Excel wilt uitvoeren. U mag dit in geen geval doen!

U moet voor elk geopend document een object maken. En dan moet u een document selecteren en uw bewerkingen uitvoeren, vervolgens een ander document selecteren en uw bewerkingen uitvoeren, enz...

Anders, als de gebruiker tijdens de verwerking van document verandert, wordt al uw code ingeklapt.

Hoe open je je documenten in je macro?

1 like

Mijn macro in Excel bestaat uit het openen van een solidworks-bestand (een assemblage die uit verschillende onderdelen bestaat) en vervolgens alle onderdelen waaruit het bestaat te vervangen, niet de onderdelen waarvan de namen en paden zijn geselecteerd in het Excel-bestand. Op dit moment werkt mijn programma erg goed.

Voor een van de onderdelen moet ik het openen voordat ik het geheel open om 2/3 zijden aan te passen (ik heb al een kant die daarvoor werkt) en het vervolgens onder een nieuwe naam op te slaan. Het is een beetje een vereenvoudiging, maar op een gegeven moment open ik het plan en moet ik terugschakelen naar het documentgedeelte.

Bij het vervangen van de onderdelen gaat de macro om dit nieuwe onderdeel te halen (geen PB daarvoor)

Om de kamer te openen:

Set swApp = CreateObject("SldWorks.application")

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

 Mijn kamer opent goed als zijn plan (met dezelfde methode).

dan gebruik ik de code die ik in mijn oorspronkelijke vraag heb gepost door swApp te vervangen door swApp2, aangezien swApp al wordt gebruikt in wat ik zojuist heb gekopieerd / geplakt.

Er is geen kans dat de gebruiker het document wijzigt tijdens de verwerking van mijn code, aangezien alle stappen automatisch worden uitgevoerd, na het klikken op een enkele knop.

 

Ik raad je ten zeerste aan om de API-help van SW te lezen.

Om een document te openen, raad ik je aan om niet de "ShellExecute" commando's te gebruiken, maar om het te doen met de SW API's zoals hier: http://help.solidworks.com/2018/english/api/sldworksapi/Open_Assembly_Document_Example_VB.htm

U kunt meerdere documenten op hetzelfde proces openen, ze onafhankelijk wijzigen, sluiten...

Het is niet aan te raden om meerdere SW-processen te openen omdat dit ernstige storingen veroorzaakt, om nog maar te zwijgen van bestandsbeheer...

1 like

Dan 

Ik heb net een essay gemaakt waarin ik precies doe wat er op de pagina staat die je hebt verzonden.

Ik krijg dezelfde foutmelding:

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

wijzend naar de lijn:

Set swApp = Application.SldWorks

 

Helaas ben ik niet zo goed in SolidWoprks macro en ben ik daarom een beetje verdwaald met alle objecten, processen, applicaties...

Hallo

Probeer uw macro als volgt te starten:

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

 

Hiermee kunt u een Solidworks-instantie maken of aan de bestaande instantie toevoegen als er al een Solidworks open is en vervolgens controleren of er een document bestaat.

Je hebt minimaal het referentietype SldWorks 2017 nodig: Bibliotheek.

Vriendelijke groeten

1 like

Hallo

Sorry voor mijn reactietijd, maar ik moest overschakelen naar andere projecten.

Ik denk dat ik nu wat duidelijker kan zien, ik kan mijn open SolidWorks-applicatie beheren... Mijn probleem is nu dat, in mijn opeenvolging van acties die ik wil dat de macro doet, ik een kamer moet openen, de tekening, terug moet gaan naar de kamer, deze onder een nieuwe naam moet opslaan, de kamer moet sluiten, de tekening moet opslaan onder dezelfde naam als de nieuwe kamer en vervolgens de tekening moet sluiten.

Ik moet dit allemaal doen, maar mijn probleem is dat ik na dit alles hetzelfde opnieuw moet doen met een tweede deel, en dan... Het werkt niet.

Om mijn document af te sluiten met een uitvullend document:

swApp.CloseDoc NOMFICHIEROUVERT.SLDPRT

 

En om mijn tekendocument af te sluiten gebruik ik:

swApp.CloseDoc swModel.GetTitle

 

Omdat 

swApp.CloseDoc NOMFICHIEROUVERT.SLDDRW

werkt niet.

Deze methode sluit mijn tekeningbestand, maar sluit ook het solidworks-venster en ik denk dat mijn probleem daar vandaan komt, omdat de applicatie niet voor dat alles is gesloten.

en als ik vraag om de tweede kamer te openen met:

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

(Dezelfde methode die eerder werd gebruikt om mijn eerste stuk en de tekening ervan te beoordelen), heb ik het volgende bericht:

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

Automation error
The remote procedure call failed

wijzend op:

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

 

Heeft iemand enig idee?

Bij voorbaat dank

Yves

Hallo

Als u Solidworks opent met een CreateObject in de macro, wordt bij het sluiten van het laatste document de verbinding met het object "SLDWORKS.application" verbroken. Om dit te voorkomen, kunt u uw volgende bestand openen voordat u het laatste document van het eerste proces sluit:

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

 

Een andere oplossing is om de swApp terug te zetten naar Nothing en vervolgens een object opnieuw te maken voordat bestand 2 wordt verwerkt:

    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

 

Een andere oplossing zou zijn om Solidworks te openen met een Shell ("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe") aan het begin van de macro en dan aan die Solidworks te haken, wat de regel Set swApp = Application.SldWorks doet in de als aan het begin. Wees voorzichtig, het openen van Solidworks volgens dit principe is veel langer en kan je dwingen een tempo in te stellen voordat je doorgaat met de verwerking, en bovendien is het naar mijn mening nog steeds veel minder schoon.

Vriendelijke groeten

2 likes

Hallo en gelukkig nieuwjaar aan iedereen

Nogmaals, sorry voor de reactietijd.

Aangezien ik twee paren heb (PART-bestand + DRW-bestand) om te openen en op te slaan onder een nieuwe naam, heb ik geprobeerd het tweede PART-bestand en de DRW te openen voordat ik het eerste DRW-bestand sloot, laat het me uitleggen:

  • - Ik open DEEL 1
  • - Ik open DRW1
  • - Ik kom terug naar DEEL 1
  • - Ik sluit DEEL 1 af
  • - Ik open DEEL 2
  • - Ik open DRW2
  • - Ik kom terug naar DEEL 2
  • - Sluit DEEL 2

En nu ben ik weer terug bij DRW2 maar aangezien ik DRW1 ook nog open heb staan, zou ik DRW2 moeten kunnen sluiten... maar nee... geen foutmeldingen, maar noch DRW2 noch DRW1 sluiten.

Aan de andere kant, als ik als volgt te werk ga:

  • - Ik open DEEL 1
  • - Ik open DRW1
  • - Ik kom terug naar DEEL 1
  • - Ik sluit DEEL 1 af
  • - Ik open DEEL 2
  • - Ik open DRW2
  • - Ik sluit DRW2
  • - Sluit DEEL 2

In dit geval sluit DRW2 samen met PART2

Om het even welke ideeën?

Bedankt

Yves

Hallo

Wees voorzichtig, in het bovenstaande voorbeeld heb ik met verschillende ModelDoc2-objecten gespeeld:

Dim swModelUn As SldWorks.ModelDoc2

Dim swModelTwo als SldWorks.ModelDoc2

Objecten die gemanipuleerd moeten worden om ze te definiëren, te activeren en te sluiten. Je raakt niet snel in de war en dan sluit je ofwel het verkeerde document, ofwel probeer je een ongedefinieerd object te sluiten, enz ...

Vriendelijke groeten