excel - necesario - que es el check in online
Es el.en.Rango necesario cuando está definido por.Cells? (3)
La respuesta parece ser: solo si el código se encuentra en un objeto de hoja de trabajo.
Sospecho firmemente que esto se debe a que los objetos de la Hoja de trabajo son los únicos que son extensibles y tienen una función de
Range
.
Cuando se llama a
Range
desde una Hoja de trabajo, la función
Range
ese objeto tiene alcance.
Cuando el código se encuentra en ThisWorkbook o en un módulo o clase de usuario, la función
Range
con el alcance disponible más cercano es el objeto
Range
global (suponiendo, por supuesto, que no haya una función
Range
definida por el usuario).
Ese está vinculado a la
Application
, que
debe
resolverlo en función de los parámetros pasados y reenviar la llamada a la hoja de trabajo correcta.
Es ampliamente aceptado que esta no es la "mejor práctica".
dim rng as range
with thisworkbook ''<~~ possibly set an external workbook
with .worksheets("sheet1")
set rng = .range(cells(2, 1), cells(rows.count, 1).end(xlup))
end with
end with
Las dos propiedades Range.Cells que definen el alcance del objeto Range se establecerán de manera predeterminada en la propiedad ActiveSheet . Si esto no es Sheet1 (definido como .Parent en la .Parent With ... End With ), la asignación fallará con,
Run-tim error ''1004'': Application-defined or object-defined error
Solución: use
.Cells
no
Cells
.
Caso cerrado.
Pero...
Es el
.
es necesario en esta definición de
objeto Range
cuando ambas propiedades
Range.Cells
heredan la propiedad de la hoja de trabajo
.Parent
que se define en la
instrucción With ... End With
?
¿Cómo puede esto?
dim rng as range
with thisworkbook ''<~~ possibly set an external workbook
with .worksheets("sheet1")
'' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
set rng = .range(.cells(2, 1), .cells(rows.count, 1).end(xlup)) ''<~~ .range
end with
end with
debug.print rng.address(0, 0, external:=true)
... ser diferente de esto,
dim rng as range
with thisworkbook ''<~~ possibly set an external workbook
with .worksheets("sheet1")
'' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup)) ''<~~ range not .range
end with
end with
debug.print rng.address(0, 0, external:=true)
Usamos
.range
cuando los parámetros que definen el alcance del rango son ambiguos;
por ejemplo
.range([A1])
La celda
A1
podría ser de cualquier hoja de trabajo y por defecto será la
propiedad ActiveSheet
sin la
.
.
Pero, ¿por qué necesitamos hacer referencia al elemento primario de un objeto de rango cuando el ámbito que lo define ha hecho referencia a su hoja de cálculo principal?
Mi opinión es ligeramente diferente aquí.
SÍ es obligatorio. No siempre puede controlar desde dónde puede ejecutar el código el usuario.
Por favor considere estos pocos casos de prueba
GUIÓN
El libro de trabajo tiene 2 hojas de trabajo. Hoja1 y Hoja2
PRUEBA 1 (Ejecutando desde un módulo)
Ambos códigos dan el mismo resultado
PRUEBA 2 (Ejecutando desde un área de código de Hoja de Hoja1)
Ambos códigos dan el mismo resultado
TEST 3 (Ejecutando desde un área de código de Sheet2)
''~~> This code fails
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))
Obtendrá un error de
Application Defined or Object defined
Y, por lo tanto, siempre es aconsejable calificar adecuadamente sus objetos para que el código pueda ejecutarse desde cualquier lugar
No, el
no se requiere donde las referencias de celda dentro de los corchetes están calificadas, a menos que el código esté en un módulo de
Worksheet
.
Dicho esto, es más rápido ejecutar
set rng = .range(.cells(...), .cells(...))
que ejecutar
set rng = range(.cells(...), .cells(...))
así que incluye el
.
hace algo bueno
Para un módulo de
Worksheet
, el
.
es requerido.