Korzystanie z menedżera dokumentów

Witam

Zaczynam używać menedżera dokumentów do pobierania właściwości solidworks w pliku programu Excel.
W tej chwili mam do czynienia z 2 problemami.
Chciałbym, aby niektóre właściwości były pisane dosłownie, inne niż nazwa właściwości
przykład tutaj, chciałbym mieć wartość w kg lub g, tak samo dla właściwości takich jak " nazwa pliku " itp
image

Chciałbym też mieć rozwijane menu bez nadpisywania mojej formuły
Przykład: Mogę zaktualizować indeks wersji za pomocą menu rozwijanego. Wiem, że za pomocą polecenia substitute można kopiować i wklejać, aby zaktualizować wartości, ale to wszystko.
image

Jeśli ktoś ma jakieś sugestie, jestem za.

Musisz odzyskać oszacowaną wartość nieruchomości, a nie wartość nieruchomości

2 polubienia

Witam

Dziękuję za odpowiedź, czy ma Pan/Pani więcej szczegółów na temat tego, jak postępować?

Dziękuję.

Opublikuj swój kod (oczywiście bez klucza) lub część kodu, której dotyczy problem.
Osobiście nie znam menedżera dokumentów, ale obliczona wartość lub błąd wartości jest taki sam w API oprogramowania. W zależności od Twojego kodu doradzimy.

'**********************
"Prawa autorskie(C) 2022 Xarial Pty Limited
'Odniesienie: makro programu Excel do zarządzania właściwościami niestandardowymi w plikach SOLIDWORKS
'Licencja: Licencja
'**********************

Const SW_DM_KEY As String = "KLUCZ"

Sub main()
Koniec subwoofera

Funkcja ConnectToDm() jako 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

Zakończ funkcję

Funkcja 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

Zakończ funkcję

Funkcja publiczna GETSWPRP(nazwa_pliku jako ciąg, prpNames jako wariant, opcjonalnie confName jako ciąg = "") jako wariant

Dim swDmApp As SwDocumentMgr.SwDMApplication
Dim swDmDoc As SwDocumentMgr.SwDMDocument10

próbować_:
W przypadku błędu 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_

wrestling_:
Debug.Print Err.Description
Err.Raise Err.Number, Err.Source, Err.Description
w końcu_:
jezeli nie swdmdoc to nic to nic
swDmDoc.CloseDoc
Zakończ jeżeli:

Zakończ funkcję

Funkcja publiczna SETSWPRP(nazwa_pliku jako ciąg, prpNames jako wariant, prpVals jako wariant, opcjonalna nazwa pliku jako ciąg = "")

Dim swDmApp As SwDocumentMgr.SwDMApplication
Dim swDmDoc As SwDocumentMgr.SwDMDocument10

próbować_:
W przypadku błędu 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_

wrestling_:
Debug.Print Err.Description
Err.Raise Err.Number, Err.Source, Err.Description
w końcu_:
jezeli nie swdmdoc to nic to nic
swDmDoc.CloseDoc
Zakończ jeżeli:

Zakończ funkcję

Funkcja prywatna RangeToArray(vRange As Variant) Jako wariant

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

Zakończ funkcję

Przepraszam, nie wiem zbyt wiele o menedżerze dokumentów i nie mogę znaleźć odpowiedzi. Z drugiej strony, co do pozostałych, uważa, że temat jest rozwiązany, ponieważ wybrałeś mnie jako najlepszą odpowiedź, więc jest niewielka szansa na uzyskanie innej odpowiedzi na ten temat.

1 polubienie

Witam
Nie używam tego menedżera dokumentów, ale mogę mieć ścieżkę, więc po utworzeniu tej właściwości masowej, zrekonstruowaniu i zapisaniu części,

Jeśli nadal nie działa, w Twoim odwołaniu znajduje się ta notatka


Może to nie być możliwe przy użyciu używanych funkcji!
Za pomocą metody (GetMassProperties (ISwDMConfiguration)) jest to możliwe

Funkcją, która jest problematyczna, jest GETSWPRP, a dokładniej, jeśli się nie mylę:
swDmConf.GetCustomProperty
Zobacz, aby zastąpić go na:
Metoda GetAllCustomPropertyNamesAndValues (ISwDMConfiguration4)
Zobacz tutaj funkcje:
https://help.solidworks.com/2021/english/api/swdocmgrapi/SolidWorks.Interop.swdocumentmgr~SolidWorks.Interop.swdocumentmgr.ISwDMConfiguration4~GetAllCustomPropertyNamesAndValues.html
lub na przechwycie, w którym zaznaczyłem część dla ocenianej wartości: