Comment stocker une variable (rapide)

Bonjour à tous
je ne suis pas expert loin de là en VBA mais j’aime bien l’outil
j’ai écrit un bout de code avec différents morceaux de macro pour avoir une numérotation auto de mes pièces
je mémorise le compteur dans une cellule d’un fichier Excel que je copie, que j’incrémente et que je colle dans le presse-papier
techniquement cela fonctionne
mais le temps d’exécution est plutôt long, car j’ouvre le fichier Excel, j’écris, je sauve et je le referme
je me posais la question s’il n’y avait pas possibilité de stocker la valeur de mon compteur ailleurs pour que ce soit plus rapide
en cherchant sur le net, j’ai vu que l’on pouvait stocker des infos dans un fichier ini mais le code ne fonctionne pas avec Solidworks
avez-vous des idées pour stoker la valeur de mon compteur (4 caractères 1234)
je me posais la question s’il n’y avait pas moyen de stocker ce compteur dans le fichier macro .swp directement
qu’en pensez vous
merci
JC.

Pour info le compteur Smartproperties de Visiativ utulise le xml.
Voici un exemple pour stocké les option d’un userform (checkbox)
Pour cela dans référence cocher Microsoft XML, v3,0 (version suivant 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

Pour le créer depuis la macro la fonction:

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

Mon userform pour récupérer les options stockés dans le fichier xml

'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 à adapter à ton besoin,
Au niveau rapidité on ne s’aperçoit pas de l’écriture / lecture.

2 « J'aime »

Super merci, je vais me pencher dessus, je vous tiens informé
JC

1 « J'aime »

Bonjour, et bienvenue.
Ton but est de pouvoir retrouver l’état de ton compteur après avoir par exemple éteint l’ordi et reprendre 3 jours plus tard ? Ou simplement le temps d’une session ? Ou autre ?

Selon le besoin, il me semble qu’un objet Collection déclaré doit être dé-déclaré après utilisation sinon il reste en mémoire, alors je me dis que peut-être que la collection conserve également ses valeurs. Je n’ai jamais fait le test.

1 « J'aime »

Ou bien encore partager un compteur à plusieurs? (fichier xml sur réseau)

Bonsoir, oui, je souhaite partager le compteur et oui, il faut que cela reste en mémoire après extinction de l’ordi
pour ma culture, qu’est-ce qu’un objet collection ?
merci

Pour l’objet collection :

Mais une fois SW éteint pour moi la collection disparait et l’objet collection serait différent sur chaque poste.
Le plus approprié à ton besoin me semble le Xml comme Visiativ pour leur compteur de pièce que l’on utilisait à 15-20 poste sans jamais avoir eu de soucis.
Maintenant on est passé sur la version SQL pour pouvoir obtenir un numéro même en télétravail.

Pour info, le site à partir duquel j’avais extrait le code pour le fichier Xml:

J’avais ensuite adapté le code prévu pour office grâce à ce forum et un spécialiste en vba.

1 « J'aime »