Makro Eigenschaften aus .txt lesen

Hallo

Ich würde gerne wissen, ob jemand ein Makro hat, mit dem Sie die benutzerdefinierten Eigenschaften eines Teils mit Informationen ausfüllen können, die in einer Textdatei (.txt, .ini oder andere) vorhanden sind

Ich habe diese Diskussion gefunden, aber die von  Filipe Wenceslau vorgeschlagene Lösung scheint in einer anderen Sprache als VBA geschrieben zu sein 

Ursprünglich wollte ich dies von einem Excel aus tun, aber die KeyManager-Lizenz bereitet mir Probleme

Für meinen Teil habe ich das in xml:

Option Explicit

'Ajouter la référence à MicrosoftXML v3.0

' Ajout déclaration pour vérif type de documents
Global Const nomfichierXML = "SaveMacroIndice.xml"
Global sPathXML, sPathNameXML As String
Global FileTyp          As Long
Global Source           As String
Global FichierXml       As String
Dim swApp               As Object
Dim swModel             As SldWorks.ModelDoc2
Dim swPart              As SldWorks.PartDoc
Dim swAssembly          As SldWorks.AssemblyDoc
Dim Designation         As String
Dim Compteur            As String
Dim OldIndice           As String
Global Indice           As String
Dim Filename            As String
Dim Filepath            As String
Dim File                As String
Dim Extension           As String
Dim path                As String
Dim fso                 As Object
Dim bRet                As Boolean
Dim PathMep             As String
Dim swCustProp          As CustomPropertyManager
Dim swDocType           As Variant
Dim fileerror           As Long
Dim filewarning         As Long
Dim doc                 As SldWorks.ModelDoc2



Sub main()
    Set swApp = Application.SldWorks
    
    sPathXML = Environ("USERPROFILE") & "\.SaveMacroSldworks\"
    sPathNameXML = sPathXML & nomfichierXML
    Debug.Print sPathXML & nomfichierXML
        
    'On vérifie si le dossier de sauvegarde existe sinon crétion de ce dossier
    If Dir(sPathXML, vbDirectory + vbHidden) = "" Then
        Debug.Print "Création du dossier: " & sPathXML
        MkDir sPathXML
    End If
    FichierXml = sPathXML & nomfichierXML
    Debug.Print "Fichier xml:" & FichierXml
    
' on affiche le useforms
UserformOptionsMacro.Show

End Sub

'Ci dessous le userform pour la lecture:
'Initialisation du formulaire
Private Sub UserForm_Initialize()

    
    'position du userform par rapport à la fenêtre (1= centré/fenêtre 2= centré écran, 3=angle en haut à gauche)
    'Me.StartUpPosition = 0
    Me.StartUpPosition = 2 - CenterScreen
    'UserformOptionsMacro.Left = Activewindow.Left + Activewindow.Width / 2 - UserformOptionsMacro.Width / 2
    'initialisation du userform
    CommandButtonExec.SetFocus
      
    'On parcours le fichier xml pour récupérer les valeures sauvegardées.
    Debug.Print "Fichier xml:" & FichierXml
    If Dir(FichierXml) = "" Then
        Debug.Print "Pas de fichier xml trouvé -> les valeures par défaut seront sélectionnées"
        CheckBoxLectureSeule = True
        CheckBoxCouleur = True
        CheckBoxDesignation = True
        CheckBoxCacherPlan = True
        CheckBoxCacherPièce = True
        CheckBoxRevision = False
    
    Else
        Debug.Print "Fichier xml trouvé -> les valeures sauvegardées seront sélectionnées"
        Dim oXML As MSXML2.DOMDocument
        Dim oNode As MSXML2.IXMLDOMNode
        Set oXML = New MSXML2.DOMDocument
        oXML.async = False
        oXML.Load FichierXml
        For Each oNode In oXML.documentElement.childNodes
            For Each osubnode In oNode.childNodes
                Debug.Print "   - " & oNode.baseName, "=" & osubnode.Text
                If oNode.baseName = "CheckBoxLectureSeule" Then CheckBoxLectureSeule = osubnode.Text
                If oNode.baseName = "CheckBoxCouleur" Then CheckBoxCouleur = osubnode.Text
                If oNode.baseName = "CheckBoxDesignation" Then CheckBoxDesignation = osubnode.Text
                If oNode.baseName = "CheckBoxCacherPlan" Then CheckBoxCacherPlan = osubnode.Text
                If oNode.baseName = "CheckBoxCacherPièce" Then CheckBoxCacherPièce = osubnode.Text
                If oNode.baseName = "CheckBoxRevision" Then CheckBoxRevision = osubnode.Text
                
            Next
        Next
    End If
    
End Sub

Lautet lautet:

Schreiben:

Sub CreationCompleteXML() 'Création du fichier xml de sauvegardes des paramètres du menu options
    Dim oXML As Object
    Dim oNode As Object
    Dim root As Object
    Dim elem As Object
    Dim rel As Object
 
    Set oXML = New MSXML2.DOMDocument
    Set oNode = oXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859-1""")
    oXML.appendChild oNode
    
    With oXML.appendChild(oXML.createElement("OPTIONS"))
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxLectureSeule"))
            .Text = IIf(UserformOptionsMacro.CheckBoxLectureSeule.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxCacherPièce"))

             .Text = IIf(UserformOptionsMacro.CheckBoxCacherPièce.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxCacherPlan"))
            .Text = IIf(UserformOptionsMacro.CheckBoxCacherPlan.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxDesignation"))
            .Text = IIf(UserformOptionsMacro.CheckBoxDesignation.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxCouleur"))
            .Text = IIf(UserformOptionsMacro.CheckBoxCouleur.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
        .appendChild oXML.createTextNode(vbTab)
        With .appendChild(oXML.createElement("CheckBoxRevision"))
            .Text = IIf(UserformOptionsMacro.CheckBoxRevision.Value = 0, "False", "True")
        End With
        .appendChild oXML.createTextNode(vbCrLf)
    End With

    oXML.Save FichierXml
End Sub

 

Ich habe auch diesen Codeausschnitt, den ich in einer CSV-Datei schreiben kann.

Für den Leseteil lasse ich euch ein wenig recherchieren, es ist möglich, aber ich habe nichts zur Hand:

'*** Macro à utiliser dans un assemblage afin de récuperer dans le bloc note un fichier texte avec la liste de toutes les pièces exclus de la nomenclature***



Sub main()

Dim swModel                     As SldWorks.ModelDoc2

Dim swPart                      As SldWorks.PartDoc

Dim bRet                        As Boolean

Dim MyPath                      As String

Dim MyFolder                    As String

 

Set swApp = Application.SldWorks
Set Assembly = swApp.ActiveDoc
Set myAsy = Assembly
Set swModel = swApp.ActiveDoc

 



'**********Chemin d'export MEP**********
'*******Récup chemin existant***********

MyFolder = CurDir$
Debug.Print "Current Folder = " & MyFolder

soutputfile = MyFolder & "\Exclu.txt"
Debug.Print soutputfile



Set fso = CreateObject("Scripting.FileSystemObject")

'On créer le fichier .txt

Set FileList = fso.CreateTextFile(soutputfile, 8, -2)

    
myCmps = myAsy.GetComponents(False)

'On boucle sur tous lec composants
For i = 0 To UBound(myCmps)
Set myCmp = myCmps(i)
'On écrit le nom de chaque pièce ou assemblage excle de la nomenclature
If myCmp.ExcludeFromBOM Then
FileList.Write myCmp.Name2 & vbCrLf
End If
Next i

 

Oder noch einmal:

https://www.codestack.net/solidworks-api/document/assembly/components/export-positions/

Oder auch:

https://chandoo.org/forum/threads/how-to-read-data-from-a-csv-file-and-write-the-same-in-the-active-worksheet-using-macro.37896/

In der Hoffnung, Sie auf den richtigen Weg für Ihre Bedürfnisse gebracht zu haben.

1 „Gefällt mir“

Danke sbadenis

Ich versuche, Ihren ersten Code zu ändern, um ihn an meine Bedürfnisse anzupassen.

Im Moment wird der Code bei Dim oXML As MSXML2 angehalten. DOMDocument: Ein nicht definierter benutzerdefinierter Typ.

Das Formular wird noch nicht geöffnet. Besteht der Zweck des Formulars darin, die XML-Datei auszuwählen? Ich persönlich möchte kein Dialogfeld, alles muss automatisch passieren. Ich bevorzuge es, den Pfad der xml in das Makro zu schreiben

Nein, mein Code hat mir eine Frage gestellt, aber sie ist in meinem Code.

Haben Sie den Verweis auf MicrosoftXML 3.0 hinzugefügt?

 

Ansonsten fand ich dieses Beispiel getestet und genehmigt:

'   Add a reference to Microsoft Scripting Runtime (click Tools > References > Browse > C:\windows\system32\scrrun.dll.


Sub ecrire()
    'Exemple XML attribute:   <Counter name="Incrementing0" Version="1" id="Incrementing0" Auto="0" AutoName="" type="1" RangeCounter="False" RangeDate="23/12/2019">

    Dim swApp As SldWorks.SldWorks
    Dim sPathName As String
    Dim fso As Scripting.FileSystemObject
    Dim XMLfile As Scripting.TextStream

    Set swApp = Application.SldWorks
    sPath = Environ("USERPROFILE") & "\Essai\"
    sPathName = sPath & "Essai.xml"
    Debug.Print sPathName
    
    'On vérifie si le dossier existe sinon on le créé
    If Dir(sPath, vbDirectory + vbHidden) = "" Then
    'If Dir(sPath) = "" Then
    Debug.Print "Création du dossier: " & sPath
    MkDir sPath
    End If


    
    'sPathName = sPathName + ".xml"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set XMLfile = fso.CreateTextFile(sPathName, True, -1)

    XMLfile.WriteLine "<OPTIONS>"
            XMLfile.WriteLine "    <Option 1=" & Chr(34) & True & Chr(34) & ">"
            XMLfile.WriteLine "    <Option 2=" & Chr(34) & True & Chr(34) & ">"
            XMLfile.WriteLine "    <Option 3=" & Chr(34) & False & Chr(34) & ">"
    XMLfile.WriteLine "</OPTIONS>"
    XMLfile.Close

End Sub

Sub lire()

    Dim swApp As SldWorks.SldWorks
    Dim sPathName As String
    Dim fso As Scripting.FileSystemObject
    Dim XMLfile As Scripting.TextStream

    Set swApp = Application.SldWorks

    sPath = Environ("USERPROFILE") & "\Essai\"
    sPathName = sPath & "Essai.xml"

    
    Set fso = CreateObject("Scripting.FileSystemObject")
    'Ajouter la gestion d'erreur si fichier introuvable
    Set XMLfile = fso.OpenTextFile(sPathName, ForReading, True, TristateFalse)
    
    'Read till the end
    Do Until XMLfile.AtEndOfStream
     Debug.Print "Printing line " & XMLfile.Line
     Debug.Print XMLfile.ReadLine 'Print a line from the file

Loop
XMLfile.Close


End Sub

Redigieren:

Der Zweck dieser XML-Datei für mich bestand genau darin, ein Dialogfeld mit verschiedenen gespeicherten  Optionen zu haben, abhängig von der Wahl der Anpassung des "Benutzers"

 

EDIT: Das ursprüngliche Thema, das mich dazu gebracht hat, das 1. Makro und die obigen Tests zu schreiben:

https://www.lynkoa.com/forum/solidworks/macro-vba-pour-ecrire-et-lire-un-fichier-xml

Ich habe xml3 aktiviert, und jetzt steckt es ein wenig weiter fest, nach CommandButtonExec.SetFocus im Benutzerformular : Fehler 424: Objekt erforderlich

In der Tat ist mein Ziel möglicherweise zu weit von diesem Makro entfernt, um es zu ändern. Wenn jemand anderes etwas anderes zu bieten hat, bleibt das Thema offen.

 

Lassen Sie sich einfach von den letzten 2 macrso inspirieren, lesen und schreiben Sie im obigen Beitrag, es ist funktional und es wird nichts anderes benötigt.

Danach kann das xml-Format mit einigen Suchen in csv oder xls oder einem anderen Format geändert werden.

Für meinen Gebrauch passte mir das xml sehr gut. Abhängig von Ihren Bedürfnissen sollten Sie in der Lage sein, diese letzten 2  Makros anzupassen

Schreiben Sie, wer Sie erstellen, das Verzeichnis, wenn es nicht vorhanden ist, die Datei Essai.xml und wer die 3 Optionen für meinen Fall schreibt (zu testen und dann durch Ihre Werte zu ersetzen)

Anschließend können Sie das Vorhandensein der Datei und ihres Inhalts überprüfen.

Wenn Sie dann auf Play drücken, werden die in der XML-Datei enthaltenen Zeilen per Debuggen angezeigt.

Schließlich hängt es natürlich von der Datenmenge und der Form ab, die Sie in Ihrer Datei speichern möchten, für Ihre Verwendung ist xml möglicherweise nicht am besten geeignet.

Nun, ich glaube, es geht über mein Niveau.

Das XML passt mir gut, da diese Datei von einer Web-App erstellt wird.

In der xml gibt es zwischen 10 und ... Angenommen, es handelt sich um eine Zeile von maximal 40 mit einem benutzerdefinierten Eigenschaftsnamen und einem numerischen Wert für jede Eigenschaft.

Die benutzerdefinierten Eigenschaften sind bereits in meinem SW-Dokument vorhanden, das Makro muss den Wert basierend auf XML aktualisieren, ohne dass eine Validierung durch den Benutzer erforderlich ist (wir gehen davon aus, dass die XML-Datei an der im Makro angegebenen Stelle vorhanden ist)

Bei Null anfangen, wie viel (kellenvoll) Arbeitszeit kann eine solche Entwicklung in Anspruch nehmen?

Es hängt alles von Ihrem Niveau ab.

Ich für meinen Teil, auch als Anfänger, würde sagen, zwischen 3 Stunden und 1 Tag ungefähr.

Ich vermute, dass der XML-Code von der Web-App erstellt wird.

Sie müssen also nur die XML-Datei lesen, alle Variablen abrufen und in einem Array speichern, z. B. müssen Sie das Teil oder die Baugruppe mit den wiederhergestellten Eigenschaften ändern.

Teilen Sie Ihren Code für jede gewünschte Funktion auf, und versuchen Sie dann, ihn zusammenzusetzen. Am Anfang ist es kompliziert und nach und nach kommen wir dorthin.

Handelt es sich bei den Eigenschaften um benutzerdefinierte oder konfigurationsspezifische Eigenschaften?

Wenn du ein Anfänger bist, dann kann man mich als ignorant bezeichnen. Variable, Deklaration, Array-Schleife... Ich verstehe nichts. Tutorials für Einsteiger suche ich vergeblich.
Dies gilt für benutzerdefinierte Eigenschaften.

Für alles, was Tutorials mit Tutorials in Excel beginnen, um Variablen, Schleifen, Arrays zu lernen...

Ich für meinen Teil habe vor 2-3 Jahren mit dem begonnen, der sehr gut zum Erlernen der Grundlagen von VBA geeignet ist:

https://www.excel-pratique.com/fr/vba/

Für Solidworks und die VBA gibt es diese Seite (auf Englisch, aber verständlich):

https://thecadcoder.com/vba/vba-Introduction/

Für Ihr Makro posten Sie uns ein Beispiel für eine XML-Datei und ein Teil (Wenn Sie Ihr Teil schützen möchten, posten Sie ein Beispiel mit den gleichen Eigenschaften, auch wenn die Form nichts damit zu tun hat)

Und ich werde sehen, ob ich Zeit habe, wenn es kompliziert ist. Wenn du es versuchst, kannst du es nicht. Fangen Sie klein an und Sie werden Fortschritte machen und wenn nötig können Sie hier Fragen stellen.

1 „Gefällt mir“

Vielen Dank für das VBA XLS-Tutorial. Ich hätte nicht gedacht, dass ich so viele Dinge lernen würde, die auch in sw sind. Es ist die grundlegende Grammatik, die mir gefehlt hat. Und das ist erst der Anfang!

Soll ich zurückgehen;)

Hallo nochmal

Ich habe ein wenig an den Links gearbeitet und mit dem einfachsten angefangen: 4 Zeilen in einem Excel.

Hier ist mein Code

Sub main()

Dim swApp       As SldWorks.SldWorks
Dim swModel     As SldWorks.ModelDoc2
Dim retval      As String
' dim ajouté selon https://www.lynkoa.com/en/forum/mod%C3%A9lisation-volumique-3d/lecture-dune-valeur-dans-excel-via-sw-et-r%C3%A9cup%C3%A9ration-dune-r%C3%A9f%C3%A9rence
Dim xlApp           As Excel.Application
Dim xlWB            As Excel.Workbook
Dim exSheet         As Excel.Worksheet
Dim i               As Integer



'On ouvre l'aplication Excel
Set xlApp = New Excel.Application
xlApp.Visible = False


'On ouvre le fichier Excel
Set xlWB = xlApp.Workbooks.Open("C:\Users\nouveau\Documents\Patrons_sur_mesure\Test_macros\Edit Custom Properties.xlsx")
Set exSheet = xlWB.ActiveSheet
xlApp.Visible = False



Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

retval = swModel.DeleteCustomInfo(Cells(1, 1))
retval = swModel.AddCustomInfo2(Cells(1, 1), swCustomInfoText, Cells(1, 2))
retval = swModel.DeleteCustomInfo(Cells(2, 1))
retval = swModel.AddCustomInfo2(Cells(2, 1), swCustomInfoText, Cells(2, 2))
retval = swModel.DeleteCustomInfo(Cells(3, 1))
retval = swModel.AddCustomInfo2(Cells(3, 1), swCustomInfoText, Cells(3, 2))
retval = swModel.DeleteCustomInfo(Cells(4, 1))
retval = swModel.AddCustomInfo2(Cells(4, 1), swCustomInfoText, Cells(4, 2))


'fermeture de Excel
xlWB.Close
xlApp.Quit

Set exSheet = Nothing
Set xlWB = Nothing
Set xlApp = Nothing


End Sub

Es funktioniert ziemlich. Das Makro liest die ersten 4 Zeilen, löscht die Eigenschaft, falls sie bereits vorhanden ist, und erstellt sie mit den Werten im Array neu. Die Öffnung des Bildes ist unsichtbar, sie scheint sich am Ende zu schließen.

ABER, von Zeit zu Zeit, bekomme ich den Laufzeitfehler 1004: Die 'selection'-Methode des Objekts '_Global' schlug gerade fehl, als wir begannen, auf die Eigenschaften der SW-Datei zu reagieren. Ich verstehe nicht, woher das kommt.

Manchmal ist es eine andere Fehlermeldung. Manchmal bleibt die Excel-Datei schreibgeschützt hängen. Kurz gesagt, es ist nicht stabil.

Meine nächsten Verbesserungen werden darin bestehen, eine Schleife zu erstellen, um alle nicht leeren Zeilen der Excel-Tabelle zu verarbeiten, und eine Version dieses Makros zu erstellen, die in die Excel-Datei integriert werden soll, um eine "manuelle" Methode zum Aktualisieren von Eigenschaften zu erhalten.

Ohne die Excel-Datei und einen Teil, auch leer, aber mit den gewünschten Eigenschaften, ist es kompliziert zu beantworten.

Zu diesem Fehler gibt es einen Hinweis:

https://fr.teamaftermarket.com/303-vba-1004-error

Vielleicht zeigen Sie auf eine leere oder nicht vorhandene Zelle. Oder dieser Fehler 1004, wenn er SW zugewiesen wird, kann auf eine nicht vorhandene Eigenschaft zurückzuführen sein und daher nicht gelöscht werden können. Es wäre gut, tiefer zu graben, um zu verstehen, warum.

Andernfalls können Sie, um es zu ignorieren, in der vorherigen Zeile ein "On error next" hinzufügen, was hilfreich sein könnte.

Wenn es einen Fehler in der Zeile erkennt, die auf den nächsten Fehler folgt, ignoriert es die fehlerhafte Zeile und fährt mit der nächsten fort.

2 Links zu dieser Bestellung:

https://docs.microsoft.com/fr-fr/dotnet/visual-basic/language-reference/statements/on-error-statement

https://www.educba.com/vba-on-error-resume-next/

Weitere Informationen zum Debuggen des Makros finden Sie auch in diesem Thema:

https://www.lynkoa.com/forum/3d/incomprehension-exportation-fichier-excel?page=1