Eu estou usando o Excel 2013. No meu código eu me refiro eu tenho que manipular dados típicos em uma planilha do Excel. Por exemplo:
**Names**
Ann
Jim
Tom
Liz
Eu não quero incluir um +1 no meu código ao se referir a células específicas dentro do meu conjunto de dados.
Ou seja, para obter "Ann" eu prefiro usar
Cells(1,1)
do que
Cells (1+1,1)
Então eu defino um intervalo excluindo os cabeçalhos:
Set R = Range(Cells(2,1),Cells(5,1)
E agora esta afirmação se refere a "Ann"
R.Cells(1,1)
Em seguida, quero me referir a um "subrange" dentro do meu alcance R:
R.Range(R.Cells(2,1), R.Cells(3,1))
Mas, surpreendentemente, agora, em vez do esperado "Jim" e "Tom" (segunda a terceira células da minha gama R), Recebo "Ann" e "Jim" (segundo a terceiro no Folha de Excel).
Alguém pode fornecer algumas dicas sobre o que estou perdendo aqui?
obrigado
Respostas:
1 para resposta № 1Este é um caso clássico de não passar o parentesco herdado. o Cells
dentro R.Range(Cells(2,1), Cells(3,1))
não tenho idéia de que eles pertencem a R
então eles padrão para o Propriedade do ActiveSheet que pode ou não ser a planilha que R
está ligado (mais problemas com um Subscrito fora do intervalo erro).
with R
debug.print .Range(.Cells(2,1), .Cells(3,1)).address
end with
o Com ... End With statement é a maneira mais fácil de passar o parentesco herdado. Observe que .Cells
e não Cells
é usado para passar a referência. Também poderia ser escrito como,
debug.print R.Range(R.Cells(2,1), R.Cells(3,1)).address
Sub amostra:
Sub Unexpected_result_with_Range_and_Cells()
Dim R As Range
Set R = Range(Cells(2, 1), Cells(5, 1))
Debug.Print R.Address
Debug.Print R.Cells(1, 1).Value
With R
Debug.Print .Range(.Cells(2, 1), .Cells(3, 1)).Address
Debug.Print .Cells(2, 1).Value
Debug.Print .Cells(3, 1).Value
End With
End Sub
Resultados da janela Imediata do VBE:
$A$2:$A$5
Ann
$A$4:$A$5
Jim
Tom