' 
' Sub obf_SetCustomXMLPart(ByVal obf_Name As String, ByVal obf_Data As String)
'     On Error GoTo obf_ProcError
'     Dim obf_part
'     Dim obf_Data2
'     
'     obf_Data2 = "<" & obf_Name & ">" & obf_Data & "</" & obf_Name & ">"
'     
'     Set obf_part = obf_GetCustomXMLPart(obf_Name)
'     If obf_part Is Nothing Then
'         On Error Resume Next
'         Presentation.CustomXMLParts.Add (obf_Data2)
'         ActiveDocument.CustomXMLParts.Add (obf_Data2)
'         ThisWorkbook.CustomXMLParts.Add (obf_Data2)
'     Else
'         obf_part.DocumentElement.Text = obf_Data
'     End If
' obf_ProcError:
' End Sub
' 

Function obf_GetCustomXMLPart(ByVal obf_Name As String) As Object
    Dim obf_part
    Dim obf_parts
    
    On Error Resume Next
    Set obf_parts = Presentation.CustomXMLParts
    Set obf_parts = ActiveDocument.CustomXMLParts
    Set obf_parts = ThisWorkbook.CustomXMLParts
    
    For Each obf_part In obf_parts
        ' Debug.Print obf_part.SelectSingleNode("/*").BaseName
        If obf_part.SelectSingleNode("/*").BaseName = obf_Name Then
            Set obf_GetCustomXMLPart = obf_part
            Exit Function
        End If
    Next
        
    Set obf_GetCustomXMLPart = Nothing
End Function

Function obf_GetCustomXMLPartTextSingle(ByVal obf_Name As String) As String
    Dim obf_part
    Dim obf_out, obf_m, obf_n
    
    Set obf_part = obf_GetCustomXMLPart(obf_Name)
    If obf_part Is Nothing Then
        obf_GetCustomXMLPartTextSingle = ""
    Else
        obf_out = obf_part.DocumentElement.Text
        obf_n = Len(obf_out) - 2 * Len(obf_Name) - 5
        obf_m = Len(obf_Name) + 3
        If Mid(obf_out, 1, 1) = "<" And Mid(obf_out, Len(obf_out), 1) = ">" And Mid(obf_out, obf_m - 1, 1) = ">" Then
            obf_out = Mid(obf_out, obf_m, obf_n)
        End If
        obf_GetCustomXMLPartTextSingle = obf_out
    End If
End Function

Function obf_GetCustomXMLPartText(ByVal obf_Name As String) As String
    On Error GoTo obf_ProcError

    Dim obf_tmp, obf_prefix, obf_j
    Dim obf_part
    obf_prefix = "__b_"
    obf_j = 0
    
    Set obf_part = obf_GetCustomXMLPart(obf_Name & "_" & obf_j)
    While Not obf_part Is Nothing
        obf_tmp = obf_tmp & obf_GetCustomXMLPartTextSingle(obf_Name & "_" & obf_j)
        obf_j = obf_j + 1
        Set obf_part = obf_GetCustomXMLPart(obf_Name & "_" & obf_j)
    Wend
    
    If Len(obf_tmp) = 0 Then
        obf_tmp = obf_GetCustomXMLPartTextSingle(obf_Name)
    End If
    
    If Mid(obf_tmp, 1, Len(obf_prefix)) = obf_prefix Then
        If Len(obf_tmp) = Len(obf_prefix) Then
            obf_GetCustomXMLPartText = ""
        Else
            obf_GetCustomXMLPartText = Mid(obf_tmp, Len(obf_prefix) + 1)
        End If
    Else
        obf_GetCustomXMLPartText = obf_tmp
    End If
    
obf_ProcError:
End Function
