Indicação do valor de propriedade de documento personalizada na célula planilha Excel 2007
-
13-09-2019 - |
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.
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