![]() |
#1
|
|||
|
|||
![]() where i work there are a number of custom document properties in use, and they can't be sorted in the user interface - they display in the order that they were originally added this is ok for a handful of properties, but when there are a lot of them... i've put this together to recreate the custom properties, adding them in alphabetical order - i'm no expert, but i hope this helps someone! my routine: Code:
Private Sub Tools_Custom_Document_Properties_Alpha_Sort_Recreate() ' ' get all custom document properties ' sort alphabetically, delete, then recreate ' custom properties display in the order they were added ' Dim docCustomProperty As DocumentProperty Dim intDeleted As Integer, intCreated As Integer Dim arrCustomDocProps() As String Dim varCounter As Variant ReDim Preserve arrCustomDocProps(0) arrCustomDocProps(0) = "" ' get custom properties into array, then delete For Each docCustomProperty In ActiveDocument.CustomDocumentProperties ' Debug.Print docCustomProperty.Name & " value " & docCustomProperty.Value ' don't recreate 'sharepoint' type custom properties - ContentType, ContentTypeID If InStr(1, docCustomProperty.Name, "contenttype", vbTextCompare) Then ' Debug.Print "found contenttype property: " & docCustomProperty.Name Else ReDim Preserve arrCustomDocProps(UBound(arrCustomDocProps) + 1) arrCustomDocProps(UBound(arrCustomDocProps)) = docCustomProperty.Name & "^" & docCustomProperty.Value End If ' uncomment to delete the custom property ' docCustomProperty.delete intDeleted = intDeleted + 1 Next docCustomProperty ' sort custom properties alphabetically Quicksort arrCustomDocProps, LBound(arrCustomDocProps), UBound(arrCustomDocProps) ' recreate custom properties from array For varCounter = 1 To UBound(arrCustomDocProps) ' Debug.Print "item: " & varCounter & " " & arrCustomDocProps(varCounter) ' Debug.Print Split(arrCustomDocProps(varCounter), "^")(0) ' Debug.Print Split(arrCustomDocProps(varCounter), "^")(1) If InStr(1, Split(arrCustomDocProps(varCounter), "^")(0), "date", vbTextCompare) Then ' Debug.Print "found date property: " & Split(arrCustomDocProps(varCounter), "^")(0) updateCustomDocumentProperty (Split(arrCustomDocProps(varCounter), "^")(0)), (Split(arrCustomDocProps(varCounter), "^")(1)), msoPropertyTypeDate Else updateCustomDocumentProperty (Split(arrCustomDocProps(varCounter), "^")(0)), (Split(arrCustomDocProps(varCounter), "^")(1)), msoPropertyTypeString End If intCreated = intCreated + 1 Next varCounter Set docCustomProperty = Nothing Set varCounter = Nothing Erase arrCustomDocProps Debug.Print "deleted " & intDeleted & " and recreated " & intCreated & " custom document properties" End Sub Code:
Private Sub Quicksort(vArray As Variant, arrLbound As Long, arrUbound As Long) ' ' Sorts a one-dimensional VBA array from smallest to largest ' using a very fast quicksort algorithm variant. ' ' https://wellsr.com/vba/2018/excel/vba-quicksort-macro-to-sort-arrays-fast/ ' Dim pivotVal As Variant, vSwap As Variant Dim tmpLow As Long, tmpHi As Long tmpLow = arrLbound tmpHi = arrUbound pivotVal = vArray((arrLbound + arrUbound) \ 2) While (tmpLow <= tmpHi) 'divide While (vArray(tmpLow) < pivotVal And tmpLow < arrUbound) tmpLow = tmpLow + 1 Wend While (pivotVal < vArray(tmpHi) And tmpHi > arrLbound) tmpHi = tmpHi - 1 Wend If (tmpLow <= tmpHi) Then vSwap = vArray(tmpLow) vArray(tmpLow) = vArray(tmpHi) vArray(tmpHi) = vSwap tmpLow = tmpLow + 1 tmpHi = tmpHi - 1 End If Wend If (arrLbound < tmpHi) Then Quicksort vArray, arrLbound, tmpHi 'conquer If (tmpLow < arrUbound) Then Quicksort vArray, tmpLow, arrUbound 'conquer Set pivotVal = Nothing Set vSwap = Nothing End Sub Code:
Private Sub updateCustomDocumentProperty(strPropertyName As String, varValue As Variant, docType As Office.MsoDocProperties) ' ' updates custom document property, creates it if it doesn't exist ' ' https://stackoverflow.com/questions/14863250/how-to-add-a-documentproperty-to-customdocumentproperties-in-excel ' On Error Resume Next ActiveDocument.CustomDocumentProperties(strPropertyName).Value = varValue If Err.Number > 0 Then ActiveDocument.CustomDocumentProperties.Add _ Name:=strPropertyName, _ LinkToContent:=False, _ Type:=docType, _ Value:=varValue End If End Sub |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
![]() |
andiekit | Word | 13 | 03-18-2021 07:02 AM |
![]() |
NicoleJones | Word VBA | 3 | 03-10-2021 08:43 PM |
![]() |
kschmidt | Word VBA | 7 | 02-04-2019 03:09 PM |
![]() |
thedr9wningman | Word VBA | 3 | 01-20-2014 05:56 PM |
![]() |
NicBodkin | Word | 8 | 05-05-2011 09:09 AM |