Bearbeiten von Eigenschaften aus Excel für Solidworks mit der Dokument-Manager-API

Hallo;
Ich möchte die Eigenschaften meiner Solidworks-Projekte mit Excel ändern, dafür habe ich daran gedacht, die Solidworks " Dokumentmanager " API zu verwenden.
Also habe ich einen vorhandenen Code angepasst, um ihn verwenden zu können, aber leider habe ich einen Fehler in einer Funktion der Bibliothek " SolidWorks Dokumentenmanager " für den ich keine Lösung finden kann.

" Eine ActiveX-Komponente kann kein Objekt erstellen "

Die fragliche Position:

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

Mit SwDmDoc = Nichts

hier ist der Code (PS: der Code benötigt einen persönlichen Lizenzschlüssel, den ich Ihnen nicht zeigen kann)

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:

Vielen Dank im Voraus

Hallo
Da es sich um Funktionen handelt, müssen Sie sie in der Main-Prozedur aufrufen, da Sie sonst nur einen leeren Wert für die Variable SwDmDoc haben können. Andernfalls müssen Sie auch den ReadOnly-Status verwalten, da Sie sonst die Eigenschaften nicht ändern können.

Hallo;
Ich stimme @Cyril zu und werde auch hinzufügen, um zu überprüfen, ob Sie die Referenz laden:
SwDocumentMgr 2022-Typbibliothek
(2022 = aktuelle Solidworks Version)

Herzliche Grüße.

2 „Gefällt mir“

Hallo Cyril.f und Maclane,

Vielen Dank für Ihr Feedback, es fällt mir schwer zu verstehen, was Sie mit " rufen Sie sie im Hauptverfahren an" meinen.
Ich habe versucht, sie aufzurufen, indem ich Folgendes tue: Aufruf + Name meiner Funktion oder einfach durch Eingabe des Namens meiner Funktion (Beispiel: OpenDocument) und es gibt mir einen Fehler:

Können Sie mir ein Beispiel für Ihre Erklärung geben?

Vielen Dank im Voraus

Hallo
Sie müssen die opendocument-Funktion mit den erwarteten Argumenten aufrufen, entweder wenn ich keinen Fehler mache, eine Zeile dieses Typs:

OpenDocument(connecttodm(),FilePath,true)

Sie müssen eine Verbindung mit der Lizenz herstellen, um die API zu verwenden, den Pfad zur Zieldatei angeben und true oder false festlegen, damit die Datei schreibgeschützt ist oder nicht.

Vielen Dank für Ihre Hilfe, aber es funktioniert immer noch nicht, meine Funktion " OpenDocument " wird bereits in meiner GETSWPRP-Funktion aufgerufen und wenn ich sie in die Hand nehme, ändert sich nichts.

Der Pfad, docty, readonly sowie der oppenDocErr sind gut informiert, aber ich bekomme trotzdem die Fehlermeldung " An ActiveX component cannot create an object "

Ich habe gesehen, dass es von der Kompatibilität zwischen meinem Excel und Solidworks (32 Bit und 64 Bit) kommen könnte.
Glaubst du, dass ich dieses VBA-Projekt weiterführen kann oder hängt es nicht von mir ab, sondern vom System

Herzliche Grüße

Können Sie Ihren vollständigen Code einfügen, den ich testen kann? (natürlich ohne Schlüssel)

Ein Screenshot Ihrer geladenen Bibliotheken wäre ebenfalls willkommen.
Ich vermute einen Mangel an:
Microsoft ActiveX-Datenobjekte ... Bibliothek
und
Microsoft ActiveX-Datenobjekte, Datensatzgruppe ... Bibliothek

Es ist möglich, dass dies auch auf einen Fehler beim Kopieren Ihres Document Manager-Schlüssels zurückzuführen ist.
VB akzeptiert nicht mehr als 1023 Zeichen in einer Zeile.
(Die Unterteilung muss in der Form "Text, dann Leerzeichen , dann Unterstrich, dann Zeilenumbrüche, dann der Rest des Textes..." erfolgen.

Herzliche Grüße.

3 „Gefällt mir“

Hallo @Cyril.f und @Maclane,
Vielen Dank für Ihre Antwort
Mein 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



Mein Schlüssel ist in dieser Form:

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

Die 2 Bibliotheken fehlen, aber das behebt den Fehler nicht:
image

Herzliche Grüße.

Hallo

Ich bin heute weg, ich werde morgen sehen, ob ich Zeit habe, wenn noch niemand da war

1 „Gefällt mir“

Hallo
Es scheint mir, dass "Microsoft Excel 15.0 Object Library" der Version 2013 von Excel entspricht, die, wenn dies tatsächlich der Fall ist, nicht mit dem Solidworks 2021 kompatibel ist, das Sie anscheinend haben.
Herzliche Grüße

3 „Gefällt mir“

Hallo;
Der erwähnte Fehler ist hier auskommentiert (ActiveX...).

Herzliche Grüße.

3 „Gefällt mir“

Hallo
Ich hatte also den grundlegenden Artikel nicht vollständig gelesen. Ich tendiere also zu einer Inkompatibilität von Office. Wahrscheinlich Nahrungsergänzungsmittel, die es 2013 noch nicht gibt.

2 „Gefällt mir“

Hallo
Ich komme zurück, nachdem ich auf meiner Dokumentenmanager-Seite testen wollte, und ich denke, dass Ihr Problem mit Ihrem Schlüssel zusammenhängt.
Ich hatte vergessen, den Anfang des Schlüssels einzufügen, der dem Namen meines Unternehmens entspricht, und ich hatte diesen aktiven Fehler x.
Wahrscheinlich das Gleiche für Sie, Sie müssen den gesamten von SW übertragenen Schlüssel nehmen, der normalerweise wie folgt codiert ist: Firmenname :swdocmgr_general-00000-{31 mal}

Hallo

Ich habe ein ähnliches Projekt, um SW-Eigenschaften aus EXCEL zu ändern.
Da alle Jungs in meinem Unternehmen in der Lage sein müssen, dieselbe Excel-Vorlage zu verwenden:

  • Können wir das Gleiche tun, ohne die SW-Taste einzugeben?
  • Wenn nicht, wenn ich meinen Schlüssel verwende, funktioniert er dann auch für andere Workstations/Mitarbeiter?

Vielen Dank im Voraus.

JnO

Hallo;

Ich würde sagen, dass alles vom Umfang der zu ändernden Eigenschaften abhängt...
Technisch ist es möglich, Excel + Makro VBA zu durchlaufen, aber die Verwendung einer gemeinsamen Vorlage erscheint mir im Zusammenhang mit Änderungen "merkwürdig".
(Siehe Tutorial: Verwenden von Microsoft Excel mit der SolidWorks API - SOLIDWORKS API, PDM API, Onshape FeatureScript, Onshape API Training and Services)
(in englischer Sprache)

Für Document Manager-Schlüssel:
Ein Schlüssel pro Arbeitsstation (der bei jedem Solidworks Versionsupdate aktualisiert werden muss)

Ich würde Sie eher auf Tools wie "Integration" (Visiativ) oder "Cad+" ( xarial.com) oder #TASK (Central Innovation) verweisen, denn selbst wenn man ins Becken spucken muss, ist der Produktivitätsgewinn insgesamt in den meisten Fällen erheblich.

Herzliche Grüße.

3 „Gefällt mir“

Ich habe in der Tat ein etwas spezifisches Bedürfnis. Wir arbeiten zusammen, aber an unterschiedlichen Projekten.
Ich habe ein Tool zum Exportieren von Stücklisten aus SW in einer Excel-Datei erstellt, die sich automatisch öffnet und Makros enthält, um die Stückliste für Einkäufe neu zu organisieren.
Beim erneuten Lesen von Excel-Dateien stoßen wir häufig auf Eigenschaftsfehler, und jedes Mal müssen Sie die 3D erneut öffnen, um einige Eigenschaften zu ändern und die 3D auf dem neuesten Stand zu halten, deshalb möchte ich die Eigenschaften direkt aus dieser Excel-Datei ändern.

Soweit ich weiß, bin ich gezwungen, die Document Manager-Schlüssel zu verwenden, um zu vermeiden, dass ich SW öffnen muss, und Sie benötigen einen pro Benutzer. Meine Excel-Datei muss also den Schlüssel für jeden Benutzer in einem bestimmten Ordner zeichnen.

Vielen Dank für diese Informationen und ein schönes Wochenende!

1 „Gefällt mir“

Hallo
Nein. Ein Schlüssel genügt. Es geht um Ihre App.
Dies ist eines der wichtigsten Interessen dieser API. Es ermöglicht Ihnen, ohne Software und damit ohne Lizenz auf die Eigenschaften von SW-Dokumenten auf Arbeitsplätzen zuzugreifen.
Ich habe ein Dienstprogramm entwickelt, um die Eigenschaften von SW-Elementen in unserem ERP in Form eines Excel-Add-Ins zu melden. Es wird problemlos auf mehreren Arbeitsplätzen im Unternehmen eingesetzt.
Sie müssen nur planen, die API und die Lizenz jedes Mal zu aktualisieren, wenn die SW geändert wird.
Schönen Tag.

2 „Gefällt mir“

Bestätigen Sie @remrem ?
Weil ich mich entschieden habe, NICHT mit dem Dokumentenmanager zu beginnen, nachdem unser Wiederverkäufer Solidworks das Gegenteil behauptet hatte!
(Auf der anderen Seite sind sie diejenigen, die die @Zozo_mp Station installiert haben (er wird es verstehen) :crazy_face: (Anmerkung: Den Smiley, der sich selbst in den Kopf schießt, habe ich nicht gefunden)... also habe ich jetzt Zweifel.)

Herzliche Grüße.

Ja.
Haben Sie Ihren Schlüssel erhalten?
Kann man einen Test auf einem PC ohne SW durchführen?
Ich habe keinen einfachen Zugang zu einem PC ohne SW.