excel-vba
CustomDocumentProperties en la práctica
Buscar..
Introducción
El uso de CustomDocumentProperties (CDP) es un buen método para almacenar valores definidos por el usuario de una manera relativamente segura dentro del mismo libro de trabajo, pero evitando mostrar valores de celdas relacionadas simplemente en una hoja de trabajo desprotegida *).
Nota: los CDP representan una colección separada comparable a BuiltInDocumentProperties, pero permiten crear sus propios nombres de propiedad definidos por el usuario en lugar de una colección fija.
*) Alternativamente, puede ingresar valores también en un libro de trabajo oculto o "muy oculto".
Organizando nuevos números de factura.
Incrementar un número de factura y guardar su valor es una tarea frecuente. El uso de CustomDocumentProperties (CDP) es un buen método para almacenar dichos números de una forma relativamente segura dentro del mismo libro de trabajo, pero evitando mostrar valores de celdas relacionadas simplemente en una hoja de trabajo desprotegida.
Sugerencia adicional:
Alternativamente, puede ingresar valores también en una hoja de cálculo oculta o incluso en una hoja de cálculo "muy oculta" (consulte Uso de las hojas xlVeryHidden . Por supuesto, también es posible guardar datos en archivos externos (por ejemplo, archivo ini, csv o cualquier otro tipo) o el registro.
Contenido de ejemplo :
El siguiente ejemplo muestra
- una función NextInvoiceNo que establece y devuelve el siguiente número de factura,
- un procedimiento DeleteInvoiceNo, que elimina completamente la factura CDP, así como
- un procedimiento showAllCDPs que enumera la colección completa de CDP con todos los nombres. Si no utiliza VBA, también puede enumerarlos a través de la información del libro: Información | Propiedades [DropDown:] | Propiedades Avanzadas | Personalizado
Puede obtener y configurar el siguiente número de factura (último no más uno) simplemente llamando a la función mencionada anteriormente, devolviendo un valor de cadena para facilitar la adición de prefijos. "InvoiceNo" se usa implícitamente como nombre de CDP en todos los procedimientos.
Dim sNumber As String
sNumber = NextInvoiceNo ()
Código de ejemplo:
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