
Gostaria que o nome de um intervalo nomeado no Excel fosse dinâmico (em oposição ao próprio intervalo!). Gostaria de saber se/como posso definir um nome de intervalo usando uma fórmula ou célula de referência, para que o nome mude quando o conteúdo da célula de referência for alterado.
Por exemploSe eu escrever uma lista em uma coluna e escrever o título da lista no topo da coluna assim:
A
1 *Colours*
2 Red
3 Yellow
4 Blue
E então nomeie o intervalo de células da lista (A2:A4) após o título da lista (A1), quero que o nome do intervalo mude automaticamente se o título de uma lista for alterado (ou seja, Nome do intervalo = A1 e o o nome muda se o conteúdo de A1 for alterado).
Informação extrasobre meu caso específico: estou usando intervalos nomeados para criar várias listas suspensas dependentes e dinâmicas em uma planilha do Excel que pode ser usada por outra pessoa. Está tudo configurado para que, se o usuário quiser adicionar itens às listas existentes (na planilha de listas de suporte), as listas suspensas (na planilha da tabela principal) mudem automaticamente. No entanto, meu próximo desafio é facilitar ao usuário a adição de novas listas. Meu plano é disponibilizar colunas de lista sobressalentes (na planilha de listas de suporte) já configuradas para que, quando preenchida, se transforme automaticamente em uma lista suspensa (na planilha da tabela principal). Todas as fórmulas de validação de dados (usando intervalos nomeados) são configuradas para criar as listas suspensas na planilha da tabela principal. A etapa que falta é a nomeação automática dos intervalos da lista assim que o usuário insere um novo título de lista. Minhas fórmulas de validação de dados precisam usar intervalos nomeados porque as listas suspensas mostradas na tabela principal dependem das seleções anteriores dos usuários.
Eu ficaria muito grato por qualquer dica!
Responder1
Isto pressupõe que o valor em A1 será inserido em vez de definido por uma fórmula. Insira a seguinte macro de evento na área de código da planilha:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim str As String
str = Range("A1").Text
If Intersect(Range("A1"), Target) Is Nothing Then Exit Sub
Dim n As Name
For Each n In ActiveWorkbook.Names
If n.RefersTo = "=Sheet1!$A$2:$A$4" Then
n.Delete
End If
Next n
ActiveWorkbook.Names.Add Name:=str, RefersTo:="=Sheet1!$A$2:$A$4"
End Sub
Por ser um código de planilha, é muito fácil de instalar e automático de usar:
- clique com o botão direito no nome da guia próximo à parte inferior da janela do Excel
- selecione Ver código - isso abre uma janela VBE
- cole o material e feche a janela do VBE
Se você tiver alguma dúvida, primeiro experimente em uma planilha de teste.
Se você salvar a pasta de trabalho, a macro será salva com ela. Se você estiver usando uma versão do Excel posterior a 2003, deverá salvar o arquivo como .xlsm em vez de .xlsx
Para remover a macro:
- abra as janelas VBE como acima
- limpar o código
- feche a janela do VBE
Para saber mais sobre macros em geral, consulte:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
e
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
Para saber mais sobre macros de eventos (código de planilha), consulte:
http://www.mvps.org/dmcritchie/excel/event.htm
As macros devem estar habilitadas para que isso funcione!
EDITAR#1:
para usar A1 e B1 como nome, basta substituir:
str = Range("A1").Text
com:
str = Range("A1").Text & Range("B1").Text