수색…


소개

CustomDocumentProperties (CDP)를 사용하면 사용자 정의 값을 동일한 작업 책에서 비교적 안전한 방법으로 저장하지만 보호되지 않은 작업 시트에 관련 셀 값을 표시하는 것을 피하는 데 좋은 방법입니다 *).

참고 : CDP는 BuiltInDocumentProperties와 비교되는 별도의 컬렉션을 나타내지 만 고정 컬렉션 대신 사용자 고유의 속성 이름을 만들 수 있습니다.

*) 또는 숨겨진 또는 "매우 숨겨진"통합 문서에도 값을 입력 할 수 있습니다.

새로운 인보이스 번호 구성

송장 번호를 증가시키고 값을 저장하는 것은 자주 수행하는 작업입니다. CustomDocumentProperties (CDP)를 사용하면 같은 수의 책에서 비교적 안전한 방법으로 번호를 저장하는 것이 좋지만 보호되지 않은 작업 시트에 관련 셀 값을 표시하지 않아도됩니다.

추가 힌트 :

또는 숨겨진 워크 시트 또는 소위 "매우 숨겨진"워크 시트에도 값을 입력 할 수 있습니다 ( xlVeryHidden 시트 사용 참조) 물론 외부 파일 (예 : ini 파일, CSV 또는 다른 유형)에도 데이터를 저장할 수 있습니다. 또는 레지스트리.

콘텐츠 예 :

아래의 예는

  • 다음 송장 번호를 설정하고 반환하는 함수 NextInvoiceNo,
  • Invoice CDP를 완전히 삭제하는 DeleteInvoiceNo 프로 시저와
  • 절차 showAllCDPs는 모든 이름으로 완전한 CDPs 콜렉션을 나열합니다. VBA를 사용하지 않고 통합 문서의 정보를 통해 VBA를 나열 할 수도 있습니다. 속성 [DropDown :] | 고급 속성 | 관습

앞에서 언급 한 함수를 호출하고 접두어 추가를 용이하게하기 위해 문자열 값을 반환하여 다음 송장 번호 (마지막 번호 + 더하기 1)를 가져 와서 설정할 수 있습니다. "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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow