Eigenschappen bewerken vanuit Excel voor Solidworks met de Document manager API

Hallo;
Ik wil graag de eigenschappen van mijn Solidworks-projecten wijzigen met Excel, hiervoor heb ik gedacht aan het gebruik van de Solidworks " Document manager " API.
Dus ik heb een bestaande code aangepast om deze te kunnen gebruiken, maar helaas heb ik een fout op een functie van de bibliotheek " SolidWorks documentmanager " waarvoor ik geen oplossing kan vinden.

" Een ActiveX-component kan geen object maken "

De functie in kwestie:

Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)

Met SwDmDoc = Niets

hier is de code (PS: de code heeft een persoonlijke licentiesleutel nodig die ik je niet kan laten zien)

Const SW_DM_KEY As String = "Clé perso"

Sub main()
End Sub

Function ConnectToDm() As SwDocumentMgr.SwDMApplication

    Dim swDmClassFactory As SwDocumentMgr.swDmClassFactory
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    
    Set swDmClassFactory = CreateObject("SwDocumentMgr.SwDMClassFactory")
        
    If Not swDmClassFactory Is Nothing Then
        Set swDmApp = swDmClassFactory.GetApplication(SW_DM_KEY)
        Set ConnectToDm = swDmApp
    Else
        Err.Raise vbError, "", "Document Manager SDK is not installed"
    End If
    
End Function

Function OpenDocument(swDmApp As SwDocumentMgr.SwDMApplication, path As String, readOnly As Boolean) As SwDocumentMgr.SwDMDocument10
    
    Dim ext As String
    ext = LCase(Right(path, Len(path) - InStrRev(path, ".")))
    
    Dim docType As SwDmDocumentType
    
    Select Case ext
        Case "sldlfp"
            docType = swDmDocumentPart
        Case "sldprt"
            docType = swDmDocumentPart
        Case "sldasm"
            docType = swDmDocumentAssembly
        Case "slddrw"
            docType = swDmDocumentDrawing
        Case Else
            Err.Raise vbError, "", "Unsupported file type: " & ext
    End Select
    
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    Dim openDocErr As SwDmDocumentOpenError
    Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)
    
    If swDmDoc Is Nothing Then
        Err.Raise vbError, "", "Failed to open document: '" & path & "'. Error Code: " & openDocErr
    End If
    
    Set OpenDocument = swDmDoc
    
End Function

Public Function GETSWPRP(fileName As String, prpNames As Variant, Optional confName As String = "") As Variant
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    Dim vNames As Variant
            
    If TypeName(prpNames) = "Range" Then
        vNames = RangeToArray(prpNames)
    Else
        vNames = Array(CStr(prpNames))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, True)
    
    Dim res() As String
    Dim i As Integer
    ReDim res(UBound(vNames))
    
    Dim prpType As SwDmCustomInfoType
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            res(i) = swDmDoc.GetCustomProperty(CStr(vNames(i)), prpType)
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                res(i) = swDmConf.GetCustomProperty(CStr(vNames(i)), prpType)
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    GETSWPRP = res
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If

End Function

Public Function SETSWPRP(fileName As String, prpNames As Variant, prpVals As Variant, Optional confName As String = "")
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    If TypeName(prpNames) <> TypeName(prpVals) Then
        Err.Raise vbError, "", "Property name and value must be of the same type, e.g. either range or cell"
    End If
    
    Dim vNames As Variant
    Dim vVals As Variant
        
    If TypeName(prpNames) = "Range" Then
        
        vNames = RangeToArray(prpNames)
        
        vVals = RangeToArray(prpVals)
        
        If UBound(vNames) <> UBound(vVals) Then
            Err.Raise vbError, "", "Number of cells in the name and value are not equal"
        End If
    Else
        vNames = Array(CStr(prpNames))
        vVals = Array(CStr(prpVals))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, False)
    
    Dim i As Integer
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            swDmDoc.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
            swDmDoc.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                swDmConf.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
                swDmConf.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    swDmDoc.Save
    
    SETSWPRP = "OK"
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If
    
End Function

Private Function RangeToArray(vRange As Variant) As Variant
    
    If TypeName(vRange) = "Range" Then
        Dim excelRange As Range
        Set excelRange = vRange
        
        Dim i As Integer
        
        Dim valsArr() As String
        ReDim valsArr(excelRange.Cells.Count - 1)
        
        i = 0
        
        For Each cell In excelRange.Cells
            valsArr(i) = cell.Value
            i = i + 1
        Next
        
        RangeToArray = valsArr
        
    Else
        Err.Raise vbError, "", "Value is not a Range"
    End If
    
End Function

Basiscode:

Bij voorbaat dank

Hallo
Omdat het functies zijn, moet je ze aanroepen in de hoofdprocedure, anders kun je alleen een lege waarde hebben voor de SwDmDoc-variabele. Anders moet u ook de status Alleen-lezen beheren, anders kunt u de eigenschappen niet wijzigen.

Hallo;
Ik ben het eens met @Cyril_f en ik zal ook toevoegen om te controleren of u de referentie laadt:
SwDocumentMgr 2022Type Bibliotheek
(2022 = huidige Solidworks release)

Vriendelijke groeten.

2 likes

Hallo Cyril.f en Maclane,

Bedankt voor je feedback, ik heb moeite om te begrijpen wat je bedoelt met " bel ze in de hoofdprocedure ".
Ik heb geprobeerd ze te bellen door te doen: Bellen + naam van mijn functie of gewoon door de naam van mijn functie in te voeren (Voorbeeld: OpenDocument) en het geeft me een foutmelding:

Kunt u mij een voorbeeld geven van uw uitleg.

Bij voorbaat dank

Hallo
Je moet de opendocument-functie aanroepen met de verwachte argumenten, ofwel als ik geen fout maak, een regel van dit type:

OpenDocument(connecttodm(),FilePath,true)

U moet verbinding maken met de licentie om de API te gebruiken, het pad naar het doelbestand en waar of onwaar instellen om het bestand alleen-lezen te hebben of niet.

Bedankt voor je hulp, maar het werkt nog steeds niet, mijn " OpenDocument " -functie is al aangeroepen in mijn GETSWPRP-functie en als ik het in de hand roep, verandert er niets.

Zowel de path, docty, readonly als de oppenDocErr zijn goed geïnformeerd, maar ik krijg nog steeds de foutmelding " An ActiveX component cannot create an object "

Ik zag dat het kon komen door de compatibiliteit tussen mijn Excel en Solidworks (32 bits en 64 bits).
Denk je dat ik dit VBA-project kan voortzetten of hangt het niet van mij af maar van het systeem

Vriendelijke groeten

Kunt u uw volledige code plaatsen die ik kan testen? (zonder de sleutel natuurlijk)

Een screenshot van uw geladen bibliotheken wordt ook op prijs gesteld;
Ik vermoed een gebrek aan:
Microsoft ActiveX-gegevensobjecten ... Bibliotheek
en
Recordset voor Microsoft ActiveX-gegevensobjecten ... Bibliotheek

Het is mogelijk dat dit ook te wijten is aan een fout bij het kopiëren van uw Document Manager-sleutel.
VB accepteert niet meer dan 1023 tekens op een regel.
(De indeling moet de vorm hebben van "tekst, dan spatie, dan onderstrepingsteken, dan regeleinden, dan de rest van de tekst...).

Vriendelijke groeten.

3 likes

Hallo @Cyril_f en @Maclane,
Dank u voor uw antwoord
Mijn code:

Const SW_DM_KEY As String = "<>"


Sub main()
'Call OpenDocument(ConnectToDm(), fileName, True)

End Sub

Function ConnectToDm() As SwDocumentMgr.SwDMApplication

    Dim swDmClassFactory As SwDocumentMgr.swDmClassFactory
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    
    Set swDmClassFactory = CreateObject("SwDocumentMgr.SwDMClassFactory")
        
    If Not swDmClassFactory Is Nothing Then
        Set swDmApp = swDmClassFactory.GetApplication(SW_DM_KEY)
        Set ConnectToDm = swDmApp
    Else
        Err.Raise vbError, "", "Document Manager SDK is not installed"
    End If
    
End Function

Function OpenDocument(swDmApp As SwDocumentMgr.SwDMApplication, path As String, readOnly As Boolean) As SwDocumentMgr.SwDMDocument10
    
    Dim ext As String
    ext = LCase(Right(path, Len(path) - InStrRev(path, ".")))
    
    Dim docType As SwDmDocumentType
    
    Select Case ext
        Case "sldlfp"
            docType = swDmDocumentPart
        Case "sldprt"
            docType = swDmDocumentPart
        Case "sldasm"
            docType = swDmDocumentAssembly
        Case "slddrw"
            docType = swDmDocumentDrawing
        Case Else
            Err.Raise vbError, "", "Unsupported file type: " & ext
    End Select
    
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    Dim openDocErr As SwDmDocumentOpenError
    Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)
    
    If swDmDoc Is Nothing Then
        Err.Raise vbError, "", "Failed to open document: '" & path & "'. Error Code: " & openDocErr
    End If
    
    Set OpenDocument = swDmDoc
    
End Function

Public Function GETSWPRP(fileName As String, prpNames As Variant, Optional confName As String = "") As Variant
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    Dim vNames As Variant
            
    If TypeName(prpNames) = "Range" Then
        vNames = RangeToArray(prpNames)
    Else
        vNames = Array(CStr(prpNames))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, True)
    
    Dim res() As String
    Dim i As Integer
    ReDim res(UBound(vNames))
    
    Dim prpType As SwDmCustomInfoType
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            res(i) = swDmDoc.GetCustomProperty(CStr(vNames(i)), prpType)
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                res(i) = swDmConf.GetCustomProperty(CStr(vNames(i)), prpType)
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    GETSWPRP = res
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If

End Function

Public Function SETSWPRP(fileName As String, prpNames As Variant, prpVals As Variant, Optional confName As String = "")
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    If TypeName(prpNames) <> TypeName(prpVals) Then
        Err.Raise vbError, "", "Property name and value must be of the same type, e.g. either range or cell"
    End If
    
    Dim vNames As Variant
    Dim vVals As Variant
        
    If TypeName(prpNames) = "Range" Then
        
        vNames = RangeToArray(prpNames)
        
        vVals = RangeToArray(prpVals)
        
        If UBound(vNames) <> UBound(vVals) Then
            Err.Raise vbError, "", "Number of cells in the name and value are not equal"
        End If
    Else
        vNames = Array(CStr(prpNames))
        vVals = Array(CStr(prpVals))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, False)
    
    Dim i As Integer
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            swDmDoc.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
            swDmDoc.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                swDmConf.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
                swDmConf.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    swDmDoc.Save
    
    SETSWPRP = "OK"
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If
    
End Function

Private Function RangeToArray(vRange As Variant) As Variant
    
    If TypeName(vRange) = "Range" Then
        Dim excelRange As Range
        Set excelRange = vRange
        
        Dim i As Integer
        
        Dim valsArr() As String
        ReDim valsArr(excelRange.Cells.Count - 1)
        
        i = 0
        
        For Each cell In excelRange.Cells
            valsArr(i) = cell.Value
            i = i + 1
        Next
        
        RangeToArray = valsArr
        
    Else
        Err.Raise vbError, "", "Value is not a Range"
    End If
    
End Function



Mijn sleutel is in deze vorm:

"Nom: swdocmgr_general-0000," & _
"swdocmgr_previews-0000," & _
"swdocmgr_dimxpert-0000," & _
"swdocmgr_geometry-0000," & _
"swdocmgr_xml-0000," & _
"swdocmgr_tessellation-0000"

De 2 bibliotheken ontbreken, maar dat lost de fout niet op:
image

Vriendelijke groeten.

Hallo

Ik ben vandaag weg, ik zal morgen zien of ik beschikbaarheid heb als er nog niemand is geweest

1 like

Hallo
Het lijkt mij dat "Microsoft Excel 15.0 Object Library" overeenkomt met de 2013-versie van Excel die, als dit inderdaad het geval is, niet compatibel is met de Solidworks 2021 die u lijkt te hebben.
Vriendelijke groeten

3 likes

Hallo;
De genoemde fout wordt hier becommentarieerd (ActiveX...).

Vriendelijke groeten.

3 likes

Hallo
Ik had dus niet het basisartikel in zijn geheel gelezen. Dus ik neig naar een onverenigbaarheid van Office. Waarschijnlijk supplementen die anno 2013 nog niet bestaan.

2 likes

Hallo
Ik kom terug nadat ik aan de kant van mijn documentmanager heb willen testen en dus denk ik dat uw probleem te maken heeft met uw sleutel.
Ik was vergeten het begin van de sleutel die overeenkomt met de naam van mijn bedrijf te plaatsen en ik had deze actieve fout x.
Waarschijnlijk hetzelfde voor u, u moet alle sleutels nemen die door SW worden verzonden, die normaal gesproken als volgt worden gecodeerd: Bedrijfsnaam : swdocmgr_general-00000-{31 keer}

Hallo

Ik heb een soortgelijk project om SW-eigenschappen van EXCEL te wijzigen.
Omdat alle jongens in mijn bedrijf hetzelfde Excel-sjabloon moeten kunnen gebruiken:

  • Kunnen we hetzelfde doen zonder de SW-toets in te voeren?
  • Zo niet, als ik mijn sleutel gebruik, werkt deze dan voor andere werkstations/medewerkers?

Bij voorbaat dank.

JnO

Hallo;

Ik zou zeggen dat het allemaal afhangt van de omvang van de eigenschappen die moeten worden gewijzigd...
Technisch gezien is het mogelijk om via Excel + Macro VBA te gaan, maar het gebruik van een gemeenschappelijk sjabloon lijkt mij "merkwaardig" in het kader van wijzigingen.
(Zie zelfstudie: Microsoft Excel gebruiken met de SolidWorks API - SOLIDWORKS API, PDM API, Onshape FeatureScript, Onshape API Training en Services)
(in het Engels)

Voor Document Manager-sleutels:
Eén sleutel per werkstation (die bij elke update van de Solidworks-versie moet worden bijgewerkt)

Ik zou je meer verwijzen naar tools zoals "Integratie" (Visiativ) of "Cad+" ( xarial.com) of #TASK (Centrale Innovatie), want zelfs als je in de kom moet spugen, is de algehele productiviteitswinst in de meeste gevallen aanzienlijk.

Vriendelijke groeten.

3 likes

Ik heb inderdaad een ietwat specifieke behoefte. We werken samen, maar aan verschillende projecten.
Ik heb een tool gemaakt om stuklijsten uit SW te exporteren in een Excel-bestand dat automatisch wordt geopend en macro's bevat om de stuklijst voor aankopen te reorganiseren.
We komen vaak eigenschappenfouten tegen bij het herlezen van Excel-bestanden, en elke keer dat je de 3D opnieuw moet openen om enkele eigenschappen te wijzigen en de 3D up-to-date te houden, daarom wil ik de eigenschappen rechtstreeks vanuit dit Excel-bestand wijzigen.

Van wat ik begrijp, ben ik genoodzaakt om de Document Manager-sleutels te gebruiken om te voorkomen dat ik SW moet openen, en je hebt er een per gebruiker nodig. Dus mijn Excel-bestand zal de sleutel voor elke gebruiker in een specifieke map moeten tekenen.

Bedankt voor deze informatie en een goed weekend!

1 like

Hallo
Nee. Eén sleutel is genoeg. Het gaat om je app.
Dit is een van de algemene belangen van deze API. Hiermee kunt u toegang krijgen tot de eigenschappen van SW-documenten op werkstations zonder de software en dus zonder licentie.
Ik heb een hulpprogramma ontwikkeld om de kenmerken van SW-elementen in ons ERP te rapporteren in de vorm van een Excel-invoegtoepassing. Het wordt zonder problemen op verschillende werkstations in het bedrijf ingezet.
U hoeft alleen maar van plan te zijn om de API en licentie bij te werken telkens wanneer SW wordt gewijzigd.
Fijne dag.

2 likes

Bevestigt u @remrem ?
Omdat ik ervoor koos om NIET aan de slag te gaan met de Document Manager, naar aanleiding van de reactie van onze reseller Solidworks, die het tegenovergestelde beweerde!
(aan de andere kant zijn zij degenen die het @Zozo_mp station hebben geïnstalleerd (hij zal het begrijpen) :crazy_face: (let op: ik heb de Smiley die zichzelf door het hoofd schiet niet gevonden)... dus ik heb nu twijfels.)

Vriendelijke groeten.

Ja.
Heeft u uw sleutel ontvangen?
Kun je een test doen op een pc zonder SW?
Ik heb geen gemakkelijke toegang tot een pc zonder SW.