excel-vba
実際のCustomDocumentProperties
サーチ…
前書き
CustomDocumentProperties(CDP)を使用するのは、同じワークブック内で比較的安全な方法でユーザー定義の値を格納するのに適していますが、保護されていないワークシートに関連するセル値を単純に表示することは避けてください*)。
注:CDPはBuiltInDocumentPropertiesに匹敵する別のコレクションを表しますが、固定コレクションの代わりに独自のユーザー定義プロパティー名を作成することができます。
*)または、隠れたまたは「非常に隠れた」ブックに値を入力することもできます。
新しい請求書番号を整理する
請求書番号を増やして値を保存することは頻繁に行われます。 CustomDocumentProperties(CDP)を使用すると、同じブック内に比較的安全な方法でそのような数値を格納することはできますが、保護されていない作業シートに関連するセル値を単純に表示することは避けてください。
追加のヒント:
また、隠しワークシートやいわゆる「非常に隠れた」ワークシートに値を入力することもできます( xlVeryHiddenシートの使用を参照してください)。もちろん、外部ファイル(例:iniファイル、csvまたは他のタイプ)またはレジストリ。
コンテンツの例 :
以下の例は、
- 次の請求書番号を設定して返す関数NextInvoiceNo、
- InvoiceのCDPを完全に削除するDeleteInvoiceNoプロシージャ、
- すべての名前を含む完全なCDPコレクションをリストする手順showAllCDP。 VBAを使用していない場合は、ワークブックの情報を使用してリストすることもできます。プロパティ[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
エンドサブ
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
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow