Usando o VBA para nomear uma caixa de nome de célula no Excel


2

Gostaria de percorrer as linhas de uma planilha e atribuir as caixas de nome de uma coluna (a coluna E) ao valor dessa linha em outra coluna (a coluna B).

Eu gostaria de fazer isso dessa maneira porque o princípio permanecerá o mesmo para um adendo que será feito nesse script para manutenção a longo prazo. Por exemplo, se eu fizesse isso manualmente, ativaria a célula "E2", clique na caixa de nome e digite "Coil_Width", que é o valor da célula "B2". Isso adiciona corretamente o nome ao gerenciador de nomes e posso alterar dinamicamente o valor digitando algo na barra de fórmulas dessa célula. Eu tentei atribuir através da propriedade eCell.Name = (etc), mas parece que não funciona da mesma forma para células e para a propriedade range porque recebo um erro definido pelo aplicativo (1003).

Além disso, usando o padrão

ActiveWorkbook.Names.Add Name:=bCell.Value, RefersTo:= eCell.Address()

apenas adiciona o nome ao gerenciador de nomes e define o RefersTo como "$ E $ 2" ou qualquer outra célula (o que está correto, eu acho), mas o valor também é definido como "E2" (e não pode ser alterado mesmo quando você digita manualmente um na barra de fórmulas dessa célula.Além disso, a caixa de nome para essa célula ainda é exibida como "E2".

Aqui está um exemplo de código:

For Each bCell In thisWkSht.Range("B:B").Cells
'For Each bCell In thisWkSht.Range("B:B:) - this is the changed line
If bCell.Value = "" Then
    'Do Nothing
ElseIf bCell.Value = "Variables" Then
    'Do Nothing
    'This allows me to skip the first row without much hassle
Else
    Set eCell = bCell.Offset(0, 3).Cells 
    'Set eCell = bCell.Offset(0, 3) - this is the other changed line
    eCell.Name = bCell.Value ' This line now correctly assigns the value from my
                             ' B row and column to the name of my E row cell

End If
Next

Meus resultados mostram que eu posso acessar corretamente a propriedade bcell.Value, mas ela é interrompida durante o bCell.Name.Name. Parece-me que eu deveria ser capaz de fazer algo como eCell.Name = bCell.Value ou algo semelhante, mas ainda não recebi nada além de um erro definido pelo aplicativo.

Atualmente, estou aderindo ao método de células, porque não tenho certeza de como abordar uma seleção de intervalo variável em uma instrução For Each; ou seja, eu posso entender como abordar meu bCell em todo o intervalo ("B: B"), mas não saberia como definir meu eCell para que o intervalo a que ele se referisse fosse realmente o intervalo do bCell compensado por três colunas.

Estou perdendo algo óbvio sobre essas propriedades?


Não sou especialista em VBA, mas normalmente uso o Range em vez de células para evitar algumas dores de cabeça. Você tentou trabalhar com intervalos em vez de células (por exemplo: ActiveWorkBooks.Names.Add Name: = Range ("B2"). Value, RefersToR1C1: = Range ("E2"))?
shinjijai

1
Você pode responder sua própria pergunta e, se você mesmo encontrou a solução, é recomendável fazê-lo.
Aquele cara brasileiro

Então você está dizendo que existe uma maneira de marcar a pergunta como respondida? Tentei olhar para trás na seção de edição, mas não vi uma maneira de sinalizá-la como resolvida ou algo assim. Onde eu procuro fazer isso?
NodeDawg

2
Você adicionou a resposta como edição à pergunta. Em vez disso, nos sites Stack Exchange, você deve adicionar a resposta em uma postagem separada abaixo . Não há absolutamente nada de errado em responder à sua própria pergunta, conforme descrito aqui . Você pode (em um dia ou mais) clicar na marca de seleção ao lado dessa resposta para marcar a pergunta resolvida.
Daniel Beck

Pegue sua resposta em superuser.com/posts/701056/revisions e limpe-a. Poste-o como resposta e aceite-o.
random

Respostas:


0

Tudo que você precisa é mudar esta linha:

Set eCell = bCell.Offset(0, 3).Cells 

Para isso:

Set eCell = bCell.Offset(0, 3)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.