excel-vba
CustomDocumentProperties in der Praxis
Suche…
Einführung
Die Verwendung von CustomDocumentProperties (CDPs) ist eine gute Methode, um benutzerdefinierte Werte relativ sicher im selben Arbeitsbuch zu speichern, wobei jedoch vermieden wird, verwandte Zellenwerte einfach in einem ungeschützten Arbeitsblatt anzuzeigen *).
Hinweis: CDPs stellen eine separate Collection dar, die mit BuiltInDocumentProperties vergleichbar ist. Sie können jedoch benutzerdefinierte Eigenschaftsnamen anstelle einer festen Collection erstellen.
*) Alternativ können Sie Werte auch in einer verborgenen oder "sehr versteckten" Arbeitsmappe eingeben.
Neue Rechnungsnummern organisieren
Das Erhöhen einer Rechnungsnummer und das Speichern ihres Wertes ist eine häufige Aufgabe. Die Verwendung von CustomDocumentProperties (CDPs) ist eine gute Methode, um solche Zahlen auf relativ sichere Weise innerhalb desselben Arbeitsbuchs zu speichern, wobei jedoch vermieden wird, verwandte Zellwerte einfach in einem ungeschützten Arbeitsblatt anzuzeigen.
Zusätzlicher Hinweis:
Alternativ können Sie Werte auch in ein verstecktes Arbeitsblatt oder sogar in ein sogenanntes "very hidden" Arbeitsblatt eingeben (siehe Verwenden von xlVeryHidden Sheets . Selbstverständlich können Sie Daten auch in externen Dateien speichern (z. B. ini-Datei, csv oder einem anderen Typ) oder die Registry.
Beispielinhalt :
Das Beispiel unten zeigt
- eine Funktion NextInvoiceNo, die die nächste Rechnungsnummer einstellt und zurückgibt,
- eine Prozedur DeleteInvoiceNo, die den Rechnungs-CDP vollständig löscht, sowie
- Eine Prozedur showAllCDPs, in der die gesamte CDPs-Sammlung mit allen Namen aufgeführt ist. Wenn Sie VBA nicht verwenden, können Sie sie auch über die Informationen der Arbeitsmappe auflisten: Info | Eigenschaften [DropDown:] | Erweiterte Eigenschaften | Brauch
Sie können die nächste Rechnungsnummer (die letzte keine plus eine) erhalten und festlegen, indem Sie einfach die oben genannte Funktion aufrufen und einen Zeichenfolgenwert zurückgeben, um das Hinzufügen von Präfixen zu erleichtern. "InvoiceNo" wird in allen Verfahren implizit als CDP-Name verwendet.
Dim sNumber As String
sNumber = NextInvoiceNo ()
Beispielcode:
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