excel-vba
CustomDocumentProperties на практике
Поиск…
Вступление
Использование CustomDocumentProperties (CDP) - хороший метод для хранения определенных пользователем значений относительно безопасным способом в пределах одной рабочей книги, но избегая показывать связанные значения соты просто в незащищенном рабочем листе *).
Примечание. CDP представляют собой отдельную коллекцию, сопоставимую с BuiltInDocumentProperties, но позволяют создавать собственные имена свойств пользователя, а не фиксированную коллекцию.
*) Кроме того, вы можете вводить значения также в скрытую или «очень скрытую» книгу.
Организация новых номеров счетов
Частая задача - увеличение номера счета и сохранение его стоимости. Использование CustomDocumentProperties (CDP) - хороший метод для хранения таких чисел относительно безопасным способом в пределах одной рабочей книги, но избегая показывать связанные значения соты просто на незащищенном рабочем листе.
Дополнительный намек:
Кроме того, вы можете вводить значения также в скрытом листе или даже в так называемом «очень скрытом» листе (см. Использование xlVeryHidden Sheets . Конечно, можно сохранять данные также во внешние файлы (например, ini-файл, csv или любой другой тип) или реестра.
Пример содержимого :
Пример ниже показывает
- функция NextInvoiceNo, которая устанавливает и возвращает следующий номер счета-фактуры,
- процедура DeleteInvoiceNo, которая полностью удаляет CDP счета-фактуры, а также
- процедура showAllCDPs перечисляет полную коллекцию CDP со всеми именами. Не используя VBA, вы также можете перечислить их через информацию о книге: Info | Свойства [DropDown:] | Дополнительные свойства | изготовленный на заказ
Вы можете получить и установить следующий номер счета (последний нет плюс один), просто вызвав вышеупомянутую функцию, возвращая строковое значение, чтобы облегчить добавление префиксов. «InvoiceNo» неявно используется как имя CDP во всех процедурах.
Dim sNumber As String
sNumber = NextInvoiceNo ()
Пример кода:
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