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

2

Eu gostaria de percorrer linhas em 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 fazê-lo desta maneira porque o princípio permanecerá o mesmo para um adendo que será feito para este script para manutenção a longo prazo. Por exemplo, se eu fosse fazê-lo manualmente, eu iria ativar a célula "E2" e 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 eu posso alterar dinamicamente o valor, digitando algo na barra de fórmulas para essa célula. Eu tentei atribuir através da propriedade eCell.Name = (etc), mas parece que não funciona o mesmo para as células como para a propriedade range porque eu 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 configura o RefersTo para "$ E $ 2" ou qualquer célula (o que é correto eu acho), mas o valor também é definido como "E2" (e não pode ser alterado mesmo quando digitar manualmente um valor na barra de fórmulas para essa célula. Além disso, a caixa de nome dessa célula ainda é mostrada como "E2".

Aqui está um código de exemplo:

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 posso acessar corretamente a propriedade bcell.Value, mas ela quebra 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, mantenho o método de células porque não sei como abordar uma seleção de intervalo em mudança em uma instrução For Each; Ou seja, eu posso entender como endereçar meu bCell para ser sobre todo o intervalo ("B: B"), mas eu não sei como definir meu eCell para que o intervalo que se refere foi realmente o intervalo do bCell compensado por três colunas.

Estou faltando algo óbvio sobre essas propriedades?

    
por NateDawg 13.01.2014 / 15:52

1 resposta

0

Tudo o que você precisa é alterar esta linha:

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

Para isso:

Set eCell = bCell.Offset(0, 3)
    
por 20.01.2014 / 22:09