excel-vba
CustomDocumentProperties i praktiken
Sök…
Introduktion
Att använda CustomDocumentProperties (CDP) är en bra metod för att lagra användardefinierade värden på ett relativt säkert sätt i samma arbetsbok, men att undvika att visa relaterade cellvärden helt enkelt i ett oskyddat arbetsblad *).
Obs: CDP: er representerar en separat samling som är jämförbar med BuiltInDocumentProperties, men tillåter att skapa användardefinierade egna namn i stället för en fast samling.
*) Alternativt kan du ange värden också i en dold eller "mycket dold" arbetsbok.
Organisera nya fakturanummer
Att öka ett fakturanummer och spara dess värde är en vanlig uppgift. Att använda CustomDocumentProperties (CDP) är en bra metod för att lagra sådana nummer på ett relativt säkert sätt i samma arbetsbok, men att undvika att visa relaterade cellvärden helt enkelt i ett oskyddat arbetsblad.
Ytterligare tips:
Alternativt kan du ange värden också i ett doldt kalkylblad eller till och med ett så kallade "mycket dolda" kalkylblad (se Använda xlVeryHidden Sheets . Naturligtvis är det möjligt att spara data också till externa filer (t.ex. ini-fil, csv eller någon annan typ) eller registret.
Exempel på innehåll :
Exemplet nedan visar
- en funktion NextInvoiceNo som anger och returnerar nästa fakturanummer,
- en procedur DeleteInvoiceNo, som raderar fakturan CDP helt, liksom
- en procedurvisningAlla CDP: er som visar hela CDP: s samling med alla namn. Om du inte använder VBA kan du också lista dem via arbetsboksinformation: Info | Egenskaper [DropDown:] | Avancerade egenskaper | Beställnings
Du kan få och ställa in nästa fakturanummer (sist nr plus ett) helt enkelt genom att ringa ovan nämnda funktion, returnera ett strängvärde för att underlätta att lägga till prefix. "InvoiceNo" används implicit som CDP-namn i alla procedurer.
Dim sNumber As String
sNumber = NextInvoiceNo ()
Exempelkod:
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
Avsluta under
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