excel-vba
CustomDocumentProperties dans la pratique
Recherche…
Introduction
L'utilisation de CustomDocumentProperties (CDP) est une bonne méthode pour stocker les valeurs définies par l'utilisateur de manière relativement sûre dans le même classeur, mais en évitant d'afficher simplement les valeurs de cellule associées dans une feuille de travail non protégée *).
Remarque: les CDP représentent une collection distincte comparable à BuiltInDocumentProperties, mais permettent de créer vos propres noms de propriété définis par l'utilisateur au lieu d'une collection fixe.
*) Vous pouvez également saisir des valeurs dans un classeur caché ou "très caché".
Organisation de nouveaux numéros de facture
L'incrémentation d'un numéro de facture et la sauvegarde de sa valeur sont des tâches fréquentes. L'utilisation de CustomDocumentProperties (CDP) est une bonne méthode pour stocker ces nombres de manière relativement sûre dans le même classeur, tout en évitant d'afficher simplement les valeurs de cellule associées dans une feuille de travail non protégée.
Conseil supplémentaire:
Vous pouvez également saisir des valeurs dans une feuille de calcul masquée ou même dans une feuille de calcul dite "très cachée" (voir Utilisation de feuilles xlVeryHidden . Bien sûr, il est également possible de sauvegarder des données dans des fichiers externes (fichier ini, csv ou tout autre type). ou le registre.
Exemple de contenu :
L'exemple ci-dessous montre
- une fonction NextInvoiceNo qui définit et renvoie le numéro de facture suivant,
- une procédure DeleteInvoiceNo, qui supprime complètement la facture CDP, ainsi que
- une procédure showAllCDPs répertoriant la collection CDPs complète avec tous les noms. Sans VBA, vous pouvez également les lister via les informations du classeur: Info | Propriétés [DropDown:] | Propriétés avancées | Douane
Vous pouvez obtenir et définir le numéro de facture suivant (dernier pas plus un) simplement en appelant la fonction mentionnée ci-dessus, en renvoyant une valeur de chaîne afin de faciliter l'ajout de préfixes. "FactureNo" est implicitement utilisé comme nom CDP dans toutes les procédures.
Dim sNumber As String
sNumber = NextInvoiceNo ()
Exemple de code:
Option Explicit
Sub Test()
Dim sNumber As String
sNumber = NextInvoiceNo()
MsgBox "New Invoice No: " & sNumber, vbInformation, "New Invoice Number"
End Sub
Function NextInvoiceNo() As String
' Purpose: a) Set Custom Document Property (CDP) "InvoiceNo" if not yet existing
' b) Increment CDP value and return new value as string
' Declarations
Dim prop As Object
Dim ret As String
Dim wb As Workbook
' Set workbook and CDPs
Set wb = ThisWorkbook
Set prop = wb.CustomDocumentProperties
' -------------------------------------------------------
' Generate new CDP "InvoiceNo" if not yet existing
' -------------------------------------------------------
If Not CDPExists("InvoiceNo") Then
' set temporary starting value "0"
prop.Add "InvoiceNo", False, msoPropertyTypeString, "0"
End If
' --------------------------------------------------------
' Increment invoice no and return function value as string
' --------------------------------------------------------
ret = Format(Val(prop("InvoiceNo")) + 1, "0")
' a) Set CDP "InvoiceNo" = ret
prop("InvoiceNo").value = ret
' b) Return function value
NextInvoiceNo = ret
End Function
Private Function CDPExists(sCDPName As String) As Boolean
' Purpose: return True if custom document property (CDP) exists
' Method: loop thru CustomDocumentProperties collection and check if name parameter exists
' Site: cf. http://stackoverflow.com/questions/23917977/alternatives-to-public-variables-in-vba/23918236#23918236
' vgl.: https://answers.microsoft.com/en-us/msoffice/forum/msoffice_word-mso_other/using-customdocumentproperties-with-vba/91ef15eb-b089-4c9b-a8a7-1685d073fb9f
' Declarations
Dim cdp As Variant ' element of CustomDocumentProperties Collection
Dim boo As Boolean ' boolean value showing element exists
For Each cdp In ThisWorkbook.CustomDocumentProperties
If LCase(cdp.Name) = LCase(sCDPName) Then
boo = True ' heureka
Exit For ' exit loop
End If
Next
CDPExists = boo ' return value to function
End Function
Sub DeleteInvoiceNo()
' Declarations
Dim wb As Workbook
Dim prop As Object
' Set workbook and CDPs
Set wb = ThisWorkbook
Set prop = wb.CustomDocumentProperties
' ----------------------
' Delete CDP "InvoiceNo"
' ----------------------
If CDPExists("InvoiceNo") Then
prop("InvoiceNo").Delete
End If
End Sub
Sub showAllCDPs()
' Purpose: Show all CustomDocumentProperties (CDP) and values (if set)
' Declarations
Dim wb As Workbook
Dim cdp As Object
Dim i As Integer
Dim maxi As Integer
Dim s As String
' Set workbook and CDPs
Set wb = ThisWorkbook
Set cdp = wb.CustomDocumentProperties
' Loop thru CDP getting name and value
maxi = cdp.Count
For i = 1 To maxi
On Error Resume Next ' necessary in case of unset value
s = s & Chr(i + 96) & ") " & _
cdp(i).Name & "=" & cdp(i).value & vbCr
Next i
' Show result string
Debug.Print s
End Sub