Indicación del valor de propiedad de documento personalizada en Excel celda de la hoja 2007

StackOverflow https://stackoverflow.com/questions/1124294

Pregunta

He creado un programa que crea y llena una propiedad de documento personalizada en un archivo de libro de Excel 2007. Sin embargo no he sido capaz de mostrar el valor de esta propiedad en una celda de la hoja. En Word 2007 sólo se puede seleccionar "Insertar -> Elementos rápidos -> campo ..." y utilice el campo DocProperty para mostrar el valor del campo personalizado en un documento. Sin embargo no he encontrado una función similar en Excel 2007.

¿Alguien sabe cómo mostrar el valor de una propiedad de documento personalizada en una celda de hoja de cálculo de Excel? Yo preferiría una solución similar a la solución de Word 2007 se ha mencionado anteriormente. preferiría no utilizo un código de macro / personalizado para esto.

¿Fue útil?

Solución

Por desgracia creo que es necesario utilizar una función definida por el usuario. Añadir un nuevo módulo de VBA para su libro y añadir esta función:

Function DocumentProperty(Property As String)
  Application.Volatile
  On Error GoTo NoDocumentPropertyDefined
  DocumentProperty = ActiveWorkbook.BuiltinDocumentProperties(Property)
  Exit Function
NoDocumentPropertyDefined:
  DocumentProperty = CVErr(xlErrValue)
End Function

La llamada a Application.Volatile obliga a la célula que se actualiza en cada nuevo cálculo asegurar que va a recoger a los cambios en las propiedades del documento.

Otros consejos

El equivalente en Excel sería a través de la fórmula y no pensar que es posible extraer una propiedad de documento sin código. No hay funciones nativas de seleccionar las propiedades del documento. (Una alternativa podría ser para almacenar información en libro de trabajo / hoja de cálculo nombres, que son accesibles a través fórmula)

En VBA habría que crear una función algo como:

Public Function CustomProperty(ByVal prop As String)

    CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)

End Function

y luego llamar en una fórmula con =CustomProperties("PropertyName").

Hay otro punto sutil. dependencias fórmula sólo se refieren a otras células; esta fórmula depende de una propiedad personalizada. Si actualiza la propiedad personalizada que implica un CustomProperty fórmula pre-existentes no se actualizará automáticamente. La célula tendrá que ser re-evaluado manualmente o todo el libro forzado a través de un recalc. Su mejor oportunidad sería hacer la función volátil, lo que significa que la fórmula se recalc'd en cada cambio de celda -., Pero esto aún significa que sólo recibe una actualización si una célula se ha cambiado

Seleccione la celda que desea extraer Cambiar el nombre de la célula para algunas útiles. De "B1" a "PROJECT_NUMBER". Abrir "Avance Propiedades", haga clic en la pestaña "Personalizado". Introduzca un nombre para la nueva propiedad. haga clic en "Enlace al contenido" seleccione el nombre de la célula del "Valor" en la lista desplegable.

Me gustaría poder tomar cerdit pero he encontrado la respuesta en línea: http: // pdmadmin. / 2012/03 / COM mostrando-custom-propiedad-valores-en-excel-usando-a-alcance llamado /

Puede vincular un rango con nombre a una propiedad personalizada, pero entonces la propiedad personalizada refleja el valor de la [primera celda de la] gama. Se eficacia de sólo lectura; se puede cambiar el contenido de la celda para actualizar la propiedad, pero no al revés.

Sé que quiere evitarlo, pero si usted desea utilizar el valor de la propiedad en una fórmula, tendrá a crear una función de hoja de encargo para hacerlo.

he experimentado los mismos problemas que otras personas tienen. Así que voy a tratar de cubrir de forma exhaustiva cómo me dirigí a él.

En primer lugar, no tiene otra opción que escribir una función destinada a conseguir lo que usted pone en una costumbre o una propiedad integrada y hacer que la célula "problema" al punto de esta manera:

=yourPropertyGettingFunctionName(PropertyName)

PropertyName siendo una cadena referencia al nombre de la costumbre / incorporado en propiedad cuyo valor desea que se muestra en la celda.

La función se puede escribir (como antes sugirió) como:

Public Function StdProp(ByVal sPropName As String) As String
    Application.Volatile
    StdProp = ActiveWorkbook.BuiltinDocumentProperties(sPropName).Value
End Function

para una propiedad integrada, o como:

Public Function UsrProp(ByVal sPropName As String) As String
    Application.Volatile
    On Error GoTo UndefinedProp
    UsrProp = ActiveWorkbook.CustomDocumentProperties(sPropName)
    GoTo Exit
UndefinedProp:
    UsrProp  = "n/a"
Exit:
End Function

Como ya se mencionó, incluyendo Application.Volatile permitirá una actualización semiautomática contenido de la celda.

Sin embargo, esto plantea un problema por sí mismo: cada vez que abra el archivo de Excel, todas las células utilizando dicha relación se actualizará y, en el momento en que salga del archivo, Excel le pedirá su permiso para actualizarlo , no importa si no introduce ningún cambio en ella o no, porque sí lo hizo Excel.

En mi grupo de desarrollo, se utiliza la subversión como un sistema de control de versiones. En caso de tocar sin querer "actualización" en la salida, SVN lo notará y la próxima vez que desee confirmar los cambios, el archivo de Excel se incluye en el paquete.

Así que decidí utilizar todo a mano para hacer lo que necesitaba y evitar, al mismo tiempo, este efecto de auto-actualización que no quería.

Esto significa que el uso de rangos con nombre en combinación con la propiedad acceso a la función / s. Teniendo en cuenta el hecho de que no puedo esperar a archivos viejos tienen provisión para mis nuevas necesidades, escribí esta función:

Private Function RangeAssign(sRange As String, sValue As String) As Integer
Dim rDest As Range
    If RangeCheck(sRange) Then
        Set rDest = Range(sRange)
    Else
        Set rDest = Application.InputBox(sMsg + vbCrLf + vbCrLf + _
            "Please, select a cell to get" + vbCrLf + _
            "the name " + sRange + " assigned", sCopyRight, Type:=8)
        rDest.Name = sRange
    End If

    rDest.Cells(1, 1).NumberFormat = "@"
    rDest.Cells(1, 1).Value = sValue

    RangeAssign = True

End Function

Además, permite una adecuada selección de la celda de destino. Al asignar valores a una propiedad (digamos "autor", que pasa a ser incorporado en uno), también se actualiza el valor almacenado en el rango con nombre, y puedo escribir en una celda:

=Author

si da la casualidad de haber definido un rango con nombre "autor" y llenó su celda "A1" con el valor de propiedad integrada "autor", que tengo que han actualizado para nuestros propios fines de seguimiento externos.

Todo esto no sucede durante la noche. Espero que pueda ser de alguna ayuda.

He utilizado este para extraer las propiedades de SharePoint (en base a la respuesta de Martin):

Public Function DocumentProperty(Property As String)
    Application.Volatile
    On Error GoTo NoDocumentPropertyDefined

    DocumentProperty = ActiveWorkbook.ContentTypeProperties(Property).Value
Exit Function

NoDocumentPropertyDefined:
    DocumentProperty = CVErr(xlErrValue)
End Function
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top