Macros "colandose" en libros ajenos

03/07/2006 - 00:28 por klomkbock | Informe spam
Hola de nuevo a todos

Hoy me ha surjido una duda, que no estoy muy seguro de saber explicar. Voy
a intentarlo a ver si me la podeis aclarar.

Mientras estaba trabajando/trasteando por el editor de vba con varios
libros abiertos, pero probando codigo en solo uno de ellos que uso para
las pruebas, al ejecutar un procedimiento con un argumento que hace
referencia al nombre de una hoja ( hj as String) le he pasado el nombre
"Hoja1". Con este nombre me ha funcionado bien muchas veces pero hoy me ha
dado 'indice fuera del intervalo'. He supuesto que era por tener otros
libros abiertos con "Hoja1" y he convertido el argumento al tipo
"Worksheet", para evitar el riesgo de que le pueda ocurrir a terceros.

La duda esta en que creia que el alcance de la variable se limitaba al
libro contenedor, aun estando declarado como public. ¿o a lo mejor es asi
y el error se ha debido a otra causa?. Preferia usar una variable string
pensando en la memoria ocupada ¿o quizas no sea demasiado gravoso el uso
de una variable objeto?

Bueno como veis ya son dos dudas (mas ...), si me las podeis aclarar os lo
agradezco.

Un saludo y hasta pronto.
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
03/07/2006 - 03:01 | Informe spam
hola, Ivan !

... trabajando/trasteando... con varios libros abiertos, pero... codigo en solo uno de ellos... para las pruebas
... un procedimiento... que hace referencia al nombre de una hoja (hj as String) le he pasado el nombre "Hoja1"
... me ha funcionado bien muchas veces pero hoy me ha dado 'indice fuera del intervalo'.
He supuesto que era por tener otros libros abiertos con "Hoja1" y he convertido el argumento al tipo "Worksheet"
para evitar... que le pueda ocurrir a terceros.
... creia que el alcance de la variable se limitaba al libro contenedor, aun estando declarado como public.
... o a lo mejor es asi y el error se ha debido a otra causa?
... usar una variable string pensando en la memoria ocupada o quizas no sea demasiado gravoso el uso de una variable objeto?



1) estoy suponiendo que el codigo hace una referencia del tipo Worksheets("hoja1") -etc. etc.etc.- [asi que creo que]
el error es -precisamente- por que el 'otro' libro [estando activo]... NO tiene una hoja que se llame "Hoja1"

2) 'piensa' en los 'objetos-child' de acuerdo a sus 'objetos-parent' [me explico]...

a) si quieres 'afectar' la celda 'A1'... usando la 'simple' expresion -> Range("a1")...
1) ASUME... la celda 'A1' de la hoja 'activa' [cualquiera que sea el libro 'activo']
2) REQUIERE... que la hoja 'activa' del libro 'activo' SEA una hoja de calculo [no de graficos]

b) si requieres 'afectar' la celda 'A1' de una hoja en especifico... puedes 'calificar' su 'objeto-parent' +/- como sigue:
-> Worksheets("Hoja25").Range("a1") solo 'observa' que la expresion anterior...
1) ASUME... que el libro 'activo' SI TIENE una hoja que se llame "hoja25"

c) si quieres 'afectar' la celda 'A1' de una hoja especifica Y de un libro en particular [checa los objetos-parent]...
1) haciendo referencia al nombre de cualquier libro abierto en la sesion...
-> Workbooks("Un libro abierto.xls").Worksheets("Una hoja de calculo existente").Range("a1")
2) haciendo referencia a las hojas del libro que contiene la macro en ejecucion...
-> ThisWorkbook.Worksheets("Una hoja de calculo existente").Range("a1")
3) usando los 'codename' de los objetos hoja del libro que contiene la macro en ejecucion...
-> Hoja25.Range("a1")

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 klomkbock
03/07/2006 - 03:46 | Informe spam
Hola de nuevo, Hector Miguel

Acabo de responderte en el otro hilo y me iba acostar (ya toca) pero al
ver esta nueva respuesta no queria hacerlo sin agradertela.

Supongo que a veces me obceco un poco, porque es logico que si se puede
actuar con codigo sobre otros libros abiertos para hacer casi cualquier
cosa, el codigo pueda actuar sobre el activo aunque pertenezca a otro
libro, sobre todo si no se ha definido claramente su 'objeto parent', como
tu mismo me aclaras.

De todas formas, cuando el libro este terminado, sera practicamente
imposible que las macros actuen sin ser el libro 'pater' el activo. Aun
asi, y salvo que el uso de objetos pudiera ralentizar mucho, quizas lo
mejor sea asegurarse el parentesco. O como mas o menos tu indicas, le
podria incluir otro argumento string para el nombre del libro (Wbk as
string). Lo que no se es si habria mucha diferencia en cuanto a
eficacia/peso/velocidad.

En cualquier caso muchas gracias y hasta mañana.
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida