Hoe een variabele op te slaan (snel)

Hoi allemaal
Ik ben geen expert, verre van dat in VBA, maar ik hou van de tool
Ik heb een stuk code geschreven met verschillende stukjes macro om een automatische nummering van mijn onderdelen te hebben
Ik onthoud de teller in een cel van een Excel-bestand dat ik kopieer, verhoog en plak in het klembord
Technisch werkt het
maar de uitvoeringstijd is vrij lang, omdat ik het Excel-bestand open, schrijf, opsla en weer sluit
Ik vroeg me af of er niet de mogelijkheid was om de waarde van mijn meter ergens anders op te slaan, zodat deze sneller zou zijn
tijdens het zoeken op het net, zag ik dat je informatie kon opslaan in een INI-bestand, maar de code werkt niet met Solidworks
Heeft u ideeën voor het opslaan van de waarde van mijn teller (4 tekens 1234)
Ik vroeg me af of er geen manier was om deze teller rechtstreeks in het macro .swp-bestand op te slaan
Wat denk je
Bedankt
JC.

Ter informatie: de Smartproperties-teller van Visiativ maakt gebruik van xml.
Hier is een voorbeeld van hoe je de opties van een userform kunt opslaan (checkbox)
Om dit in referentie te doen, controleert u Microsoft XML, v3.0 (volgende versie Office)

Code du main:
    sPathXML = Environ("USERPROFILE") & "\.SaveMacroSldworks\"
    sPathNameXML = sPathXML & nomfichierXML
    Debug.Print sPathXML & nomfichierXML
        
    'On vérifie si le dossier de sauvegarde existe sinon création 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

Om het van de macro te maken, de functie:

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

Mijn gebruikersformulier om de opties op te halen die in het xml-bestand zijn opgeslagen

'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

Code om aan te passen aan uw behoeften,
Qua snelheid merk je niets van het schrijven/lezen.

2 likes

Geweldig bedankt, ik zal ernaar kijken, ik zal je op de hoogte houden
JC

1 like

Hallo en welkom.
Uw doel is om de status van uw meter te kunnen vinden na het uitschakelen van bijvoorbeeld de computer en 3 dagen later verder te gaan? Of gewoon voor een sessie? Of iets anders?

Afhankelijk van de behoefte lijkt het mij dat een gedeclareerd collectieobject na gebruik moet worden gededeclareerd, anders blijft het in het geheugen hangen, dus ik denk dat de collectie misschien ook zijn waarden behoudt. Ik heb de test nooit gedaan.

1 like

Of een meter delen met meerdere personen? (XML-bestand via netwerk)

Goedenavond, ja, ik wil de meter delen en ja, deze moet in het geheugen blijven nadat ik de computer heb uitgeschakeld
Wat is voor mijn cultuur een collector's item?
Bedankt

Voor het collectieobject:

Maar zodra SW voor mij is uitgeschakeld, verdwijnt de collectie en zou het verzamelingsobject op elke post anders zijn.
Het meest geschikt voor uw behoefte lijkt mij de XML zoals Visiativ voor hun muntenteller die we op 15-20 stations gebruikten zonder ooit problemen te hebben gehad.
Nu zijn we overgestapt op de SQL-versie om ook bij telewerken een nummer te kunnen krijgen.

Ter info, de site waarvan ik de code voor het Xml-bestand heb geëxtraheerd:

Ik had toen de code gepland voor het kantoor aangepast dankzij dit forum en een vba-specialist.

1 like