Indicação do valor de propriedade de documento personalizada na célula planilha Excel 2007

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

Pergunta

Eu criei um programa que cria e preenche uma propriedade de documento personalizada em um arquivo pasta de trabalho Excel 2007. No entanto, eu não tenho sido capaz de mostrar o valor da propriedade em uma célula da planilha. No Word 2007 você pode apenas selecionar "Inserir -> Quick Parts -> Campo ..." e usar o campo DocProperty para mostrar o valor do campo personalizado em um documento. No entanto, eu não encontrei uma função semelhante no Excel 2007.

Alguém sabe como exibir o valor de uma propriedade de documentos personalizada em uma célula da planilha Excel? Eu preferiria uma solução semelhante à solução Word 2007 mencionado acima. Eu prefiro não usar um código de macro / custom para isso.

Foi útil?

Solução

Infelizmente eu acredito que você precisa usar uma função definida pelo usuário. Adicionar um novo módulo VBA para sua pasta de trabalho e adicionar esta função:

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

A chamada para as forças Application.Volatile a célula a ser atualizado em cada recálculo garantindo que ele vai pegar mudanças nas propriedades do documento.

Outras dicas

O equivalente no Excel seria via fórmula e eu não acho que é possível extrair uma propriedade documento sem código. Não há funções nativas para escolher as propriedades do documento. (Uma alternativa poderia ser a de armazenar informações na pasta de trabalho / planilha Nomes, que são acessíveis através de fórmula)

Em VBA você teria que criar uma função de algo como:

Public Function CustomProperty(ByVal prop As String)

    CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)

End Function

e, em seguida, chamá-lo em uma fórmula com =CustomProperties("PropertyName").

Há outro ponto sutil. dependências de fórmulas apenas se referem a outras células; esta fórmula depende de uma propriedade personalizada. Se você atualizar o CustomProperty envolvendo fórmula personalizada propriedade de um pré-existente não será atualizado automaticamente. A célula terá de ser re-avaliados manualmente ou toda a pasta forçada através de um recalc. Sua melhor chance seria fazer a função volátil, o que significa que a fórmula seria recalc'd em cada mudança de célula -. Mas isso ainda significa que você só obter uma atualização se uma célula foi alterado

Selecione a célula que você deseja extrair Mudar o nome da célula para alguns útil. De "B1" para "Project_Number". Abra "Propriedades Avançar", clique na guia "Custom". Digite um nome para a nova propriedade. clique em "Link para conteúdo" a seleccionar o nome da célula da atração "Valor" lista para baixo.

Eu gostaria de poder levar cerdit mas eu encontrei a resposta on-line: http: // pdmadmin. com / 2012/03 / exibindo-custom-propriedade valores-em-excel-usando-a-chamada-range /

Você pode vincular um intervalo nomeado para uma propriedade personalizada, mas, em seguida, a propriedade personalizada reflete o valor da [primeira célula na] gama. É efetivamente somente leitura; você pode alterar o conteúdo da célula para atualizar a propriedade, mas não o contrário.

Eu sei que você quer evitá-lo, mas se você quiser usar o valor da propriedade em uma fórmula, você vai ter que criar uma função de planilha personalizada a fazê-lo.

Eu tenho experimentado os mesmos problemas de outras pessoas têm. Então eu vou tentar cobrir exaustivamente como eu abordou-o.

Em primeiro lugar, você não tem outra opção do que escrever uma função destina-se a obter o que você colocar em um costume ou built-in propriedade e fazer a célula "problema" para apontar para que desta forma:

=yourPropertyGettingFunctionName(PropertyName)

PropertyName sendo uma string referindo-se ao nome do costume / built-in propriedade cujo valor você quer ser mostrado na célula.

A função poderia ser escrito (como anteriormente sugerido) como:

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

para uma propriedade interna, ou 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 já mencionado, incluindo Application.Volatile permitirá uma atualização semi-automática conteúdo da célula.

No entanto, isso coloca um problema por conta própria: sempre que você abrir o seu arquivo Excel, todas as células que usam essa relação será atualizada e, pelo tempo que você saia do arquivo, Excel irá pedir sua permissão para atualizá-lo , não importa se você fez introduzir qualquer mudança nele ou não, porque o próprio Excel fez.

No meu grupo de desenvolvimento, usamos Subversion como um sistema de controle de versão. No caso de você inadvertidamente atingido "update" na saída, SVN vai notar isso e na próxima vez que você quiser confirmar as alterações, o arquivo excel será incluído no pacote.

Então eu decidi usar tudo na mão para fazer o que eu precisava e evitar, ao mesmo tempo, este efeito de auto-update eu não queria.

Isso significa usar intervalos nomeados em combinação com a propriedade acessando função / s. Dado o fato de que não pode esperar que os arquivos antigos para ter provisão para minhas novas necessidades, eu escrevi essa função:

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

Ela permite uma seleção adequada da célula de destino. Ao atribuir valores a uma propriedade (digamos que "Autor", que passa a ser um built-in um), eu também atualizar o valor armazenado no intervalo nomeado, e pode escrever em uma célula:

=Author

se acontecer de eu ter definido um intervalo nomeado "Autor" e encheu sua célula "A1", com o valor de propriedade interna "Autor", que eu preciso para ter actualizado para os nossos próprios fins de rastreamento externo.

Isso tudo não aconteceu durante a noite. Espero que possa ser de alguma ajuda.

Eu usei isso para extrair as propriedades do SharePoint (com base na resposta 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top