Tudo o que você precisa é alterar esta linha:
Set eCell = bCell.Offset(0, 3).Cells
Para isso:
Set eCell = bCell.Offset(0, 3)
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?
Tags microsoft-excel vba