Usuário com melhor resposta
Alterar nomes de intervalos pelo VBA

Pergunta
-
Pessoal, preciso criar um código que atualize todos os nomes de uma planilha quando o usuário acionar um botão.
Criei o seguinte código como exemplo, mas ele tem um problema: somente adiciona nomes aos intervalos. Se por ventura o nome precisar ser alterado (que deve ser o conteúdo de uma outra célula), o código não atualiza o nome. Podem me ajudar com algum comando que faça atualização de nomes já existentes e ao mesmo tempo a inserção de nomes que ainda não existem?
Outra pergunta: em vez de usar "Refers To R1C1", usando a metodologia R1C1, como eu consigo fazer o comando funcionar com o range normal (A2, C9, D15, etc)?
Obrigado!
Sub NomearIntervalos() RangeName = Range("C5") ActiveWorkbook.Names.Add Name:=RangeName, RefersToR1C1:="=Sheet1!R5C4:R5C7" RangeName = Range("C6") ActiveWorkbook.Names.Add Name:=RangeName, RefersToR1C1:="=Sheet1!R6C4:R6C7" RangeName = Range("C7") ActiveWorkbook.Names.Add Name:=RangeName, RefersToR1C1:="=Sheet1!R7C4:R7C7" RangeName = Range("C8") ActiveWorkbook.Names.Add Name:=RangeName, RefersToR1C1:="=Sheet1!R8C4:R8C7" End Sub
Respostas
-
-Que tal você apagar todos os nomes existentes e depois recriá-los com seu código? Ou você tem outros nomes importantes que não pode apagar?
-Ao invés de usar o parâmetro RefersToR1C1 para criar nomes definidos, use o RefersTo.
http://www.ambienteoffice.com.br - http://www.clarian.com.br
- Marcado como Resposta Cezário Rezende Abrantes sábado, 22 de outubro de 2016 14:15
-
Boa noite Cezário.
Uma forma alternativa de fazer o que precisa seria utilizar o código abaixo. Nele você pode criar quantos nomes quiser para um mesmo intervalo, mas o código para apagar só funciona se já existir um nome para o intervalo ou se você souber previamente o nome deste intervalo (melhor):
Abraço.NomeDesejado = Plan1.Range("A1").Value2 LocalParaNomear = "B1:C3"
'Para apagar o nome de um intervalo que não se conhece o nome atribuído (gera erro se não houver nenhum nome no intervalo) On Error Resume Next iNomeParaApagar = Plan1.Range(LocalParaNomear).Name.Index ThisWorkbook.Names(iNomeParaApagar).Delete 'Nomeando Plan1.Range(LocalParaNomear).Name = NomeDesejado 'Apagando um nome conhecido (melhor) NomeParaApagar = "Teste" ThisWorkbook.Names(NomeParaApagar).Delete
Filipe Magno
- Marcado como Resposta Cezário Rezende Abrantes sábado, 22 de outubro de 2016 14:15
Todas as Respostas
-
-Que tal você apagar todos os nomes existentes e depois recriá-los com seu código? Ou você tem outros nomes importantes que não pode apagar?
-Ao invés de usar o parâmetro RefersToR1C1 para criar nomes definidos, use o RefersTo.
http://www.ambienteoffice.com.br - http://www.clarian.com.br
- Marcado como Resposta Cezário Rezende Abrantes sábado, 22 de outubro de 2016 14:15
-
Boa noite Cezário.
Uma forma alternativa de fazer o que precisa seria utilizar o código abaixo. Nele você pode criar quantos nomes quiser para um mesmo intervalo, mas o código para apagar só funciona se já existir um nome para o intervalo ou se você souber previamente o nome deste intervalo (melhor):
Abraço.NomeDesejado = Plan1.Range("A1").Value2 LocalParaNomear = "B1:C3"
'Para apagar o nome de um intervalo que não se conhece o nome atribuído (gera erro se não houver nenhum nome no intervalo) On Error Resume Next iNomeParaApagar = Plan1.Range(LocalParaNomear).Name.Index ThisWorkbook.Names(iNomeParaApagar).Delete 'Nomeando Plan1.Range(LocalParaNomear).Name = NomeDesejado 'Apagando um nome conhecido (melhor) NomeParaApagar = "Teste" ThisWorkbook.Names(NomeParaApagar).Delete
Filipe Magno
- Marcado como Resposta Cezário Rezende Abrantes sábado, 22 de outubro de 2016 14:15
-
Boa tarde!
Muito obrigado pelas sugestões. Juntei as ideias dos dois e meu código ficou assim (e está funcionando perfeitamente):
Sub AtualizarNCM() ThisWorkbook.Activate Sheets("NCM Groups").Activate For Linha = 3 To Sheets("NCM Groups").UsedRange.Rows.Count IntervaloApagar = "D" & Linha & ":M" & Linha On Error Resume Next NomeApagar = Range(IntervaloApagar).Name.Index ThisWorkbook.Names(NomeApagar).Delete Next ThisWorkbook.Activate Sheets("NCM Groups").Activate For Linha = 3 To Sheets("NCM Groups").UsedRange.Rows.Count If Range("C" & Linha).Value = "" Then GoTo Continuar NomeAdicionar = Range("C" & Linha).Value On Error Resume Next Sheets("NCM Groups").Range("D" & Linha & ":M" & Linha).Name = NomeAdicionar Continuar: Next MsgBox ("NCMs atualizadas com sucesso!"), vbInformation End Sub
Abraço!!