En este grupo En todos

Foro de Excel



VBA: Primera fila disponible

Armando
Foro excel emagister
Escrito por Armando Montes
el 14/11/2010

Hola amigos, alguien puede decirme porque estos 2 codigos funcionan exactamente igual?
Gracias
Sub Alta()
With Sheet1. Range("A65536"). End(xlUp)
. Offset(1, 0) = Sheet2. Range("B6")
. Offset(1, 1) = Sheet2. Range("C6")
End With
With Sheet2. Range("A65536"). End(xlUp)
. Range("A2") = Sheet2. Range("B6")
. Range("C2") = Sheet2. Range("F6")
End With
End Sub

Armando Montes
Foro excel emagister
Escrito por Armando Montes
el 14/11/2010

Abraham, ojala puedas borrar los duplicados que meti no se como, gracias.

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 14/11/2010

Hola! Armando. Cuando dices:

- "... 2 códigos..."

¿Te refieres a los dos bloques With-End With?

Saludos, Cacho.

Armando Montes
Foro excel emagister
Escrito por Armando Montes
el 14/11/2010

Si, especialmente el segundo

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 14/11/2010

La propiedad Range está siempre asociada al contexto en el que se utiliza.
Considera las siguientes líneas incluídas en un módulo común:
____________________________

Range("B2") = "Prueba1"
ActiveSheet. Range("B3") = "Prueba2"
Range("B4"). Range("C2") = "Prueba3"
ActiveSheet. Range("B5"). Range("C2") = "Prueba4"
____________________________

Veamos:
Range("B2") = "Prueba1"

Ésto es equivalente a:
ActiveSheet. Range("B3") = "Prueba2"

Así es como -normalmente- lo utilizamos y aquí no hay problemas. Sin embargo:

Range("B4"). Range("C2") = "Prueba3"

refiere a la celda D5.
En este último caso, el Range("C2") asume que Range("B4") es "su" A1

Del mismo modo:
ActiveSheet. Range("B5"). Range("C2") = "Prueba4"

es equivalente al anterior y refiere a D6.
____________________________

De paso aclaremos que si esas mismas 4 líneas se encontrasen en el módulo de una hoja (Hoja1 por ejemplo) y nuestra hoja activa es otra (Hoja2, por ejemplo), lo anterior cambia:

Range("B2") = "Prueba1"
Aquí referimos a la Hoja1 (aunque esté seleccionada la Hoja2)

ActiveSheet. Range("B3") = "Prueba2"
Aquí referimos a la Hoja2

Range("B4"). Range("C2") = "Prueba3"
Aquí referimos a la Hoja1 (aunque esté seleccionada la Hoja2)

ActiveSheet. Range("B5"). Range("C2") = "Prueba4"
Aquí referimos a la Hoja2

¿Se entendió este lío?
Saludos, Cacho.

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 14/11/2010

A tenor de lo expuesto, Armando, fijate que encontré en la ayuda del VBA una "perlita":




¿Te das cuenta que la parte resaltada es una frase errónea pues ello no es cierto si el código está colocado en el módulo de una hoja y tenemos seleccionada otra?...

Saludos, Cacho.

Armando Montes
Foro excel emagister
Escrito por Armando Montes
el 14/11/2010

Gracias, lo analizare.
El efecto se me presento accidentalmente y me sorprendio que funcionara como offset.

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 14/11/2010

Hola amigos:

Aunque muchas personas tienen la costumbre colocar rutinas (sub) en los modulos de las hojas, esto no es lo idoneo (pierden funcionalidad), ya que dichos modulos son de "Clase" (justamente de dichas hojas). ¿Que es lo que ocurre entonces respecto a lo ultimo que menciona Cacho? Pues la ayuda del VBA de Excel (aunque ciertamente si hay errores - algunos reconocidos por Microsoft) hace referencia al uso "normal" de un llamado abreviado del objeto "ActiveSheet" (justamente desde un modulo "normal" o la "ventana inmediato").

Si dicha rutina esta en el modulo de clase de una hoja, pues este objeto ya no es "ActiveSheet" sino justamente dicha hoja. ¿Se entiende? Siendo asi, mas que una "Perlita" o error de la ayuda es, digamos, no totalmente precisa (asumen que todos saben usan los modulos "normales" para sus rutinas)

Abraham

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 14/11/2010

Por un lado, y para complementar la idea, aprovecho a comentar que las siguientes cuatro líneas son equivalentes:

Range("E5") = "Prueba1"
Range("B3"). Offset(2, 3) = "Prueba2"
Range("B3"). Range("D3") = "Prueba3"
Range("B3"). Cells(3, 4) = "Prueba4"

________________________________

Por otro lado, y como miembro activo del conspicuo "Club de Admiradores de insertar códigos en los módulos de las hojas" (lo llamamos "Club", nomás), te preguntamos, Abraham: ¿Por qué mencionas "pérdida de funcionalidad"?.

De hecho, y en muchos casos, hasta es más práctico manejarlo así...

Saludos, Cacho.

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 15/11/2010

Estimado presidente del "Club de Admiradores de insertar códigos en los módulos de las hojas":

En este tutorial, en el punto 7, explican algunas de las cuestiones.

https://www.recursosvisualbasic.com. Ar/htm/tutoriales/c1-creacion-de-clases. Htm

Yo agregaria a eso, cosas muy pequeñas (pero que quizas importen por el tiempo), como hacer el llamado a esas rutinas:

Call nombredelmodulodelahoja. Nombremacro

A comparacion de las rutinas de modulos "normales":

Call nombremacro

OTra en el mismo campo (tiempo), seria el usar dichas rutinas para hacer cambios cualquier hoja, ya que no pueden :( solo pueden hacerlo en la propia hoja o en la que puntualmente indican.

Cosas pequeñas (desde mi punto de vista), pero que son notorias

Saludos al club :p

Abraham

Armando Montes
Foro excel emagister
Escrito por Armando Montes
el 15/11/2010

La recomendacion que mas he leido es que si el codigo no tiene que ver con los eventos especificos de la hoja o libro, debe colocarse en un modulo.
Incluso he visto algunos codigos que colocados en el modulo de la hoja ocasionan problemas y no lo hacen al estar en un modulo.

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 15/11/2010

No soy Presidente del Club, mi estimado amigo Abraham, sino -y sólo- un socio caracterizado.
Sin perjuicio de ello, te anticipo que solicitaré convocar una urgente reunión a su Comisión Directiva a fin de evaluar los siguientes puntos:

a) El tutorial al que refieres es sobre "Visual Basic" y no sobre "Visual Basic for Application" (VBA), que es el nombre "fino" de las macros de Excel.
Conviniendo que son "primos-hermanos" (más hermanos que primos), varias de las consideraciones del punto 7 parecen avalar la solidez de nuestro Club. Por ejemplo:

-> "... Los datos de un módulo de clase existen por separado para cada instancia de la clase..."
¿En qué momento un código como el que estamos viendo en este debate crea varias instancias? Como -entiendo- que tenemos una sola instancia, entonces no hay diferencia alguna con un módulo común.

-> "... Los datos de cada instancia de un módulo de clase se crean cuando se crea el objeto y se destruyen cuando se destruye el objeto..."
Pero como el objeto ( ¿La hoja? ) no se destruye, tampoco aquí tenemos una diferencia.

b) El tema "tiempos" es indiscutible... Siempre y cuando el proceso contemple centenares de llamadas a subrutinas ubicadas en los módulos de alguna hoja.
De no ser así, me parece que dispensar un par de milisegundos adicionales a una macro puede ser "tolerado" aún por el usuario más impaciente.

Te comento , Amigo, que Nuestro Club no es sectario ni excluyente. Consideramos que la convivencia de ambas opciones fomenta sólidos vínculos y genera beneficios mutuos.

Por ejemplo:
-> Las funciones personalizadas requieren ser desarrolladas en un módulo común
-> También tiene mayor sentido declarar una variable "Public" en un módulo común

De modo que, postulamos en nuestra benemérita Institución: entre los blancos y los negros... ¡Hay grises!

Saludos, Cacho.

P.D.
Los formularios de ingreso al Club se pueden retirar de Jue a Mié, en el horario de 23 a 22:59.

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 15/11/2010

Armando:
Coincido totalmente contigo en la primera parte de lo que comentas (eventos de la hoja).

En cuanto a lo de los "supuestos" problemas, no tienes más que mirar las cuatro sencillas líneas que te he mostrado y de las que comento su diferente acción según que tipo de módulo las contenga. Ello -interpreto- no es un problema: es un funcionamiento diferente que solamente debemos reconocer y contemplar.

Sin embargo convendrás conmigo que:
-> Si hemos desarrollado un largo código que contempla -por ejemplo- las consideraciones que hemos analizado aquí, y que -además-
-> Funciona perfectamente,

diría que estamos hablando más de gustos y de usos y costumbres que de fundamentos técnicos, como -por ejemplo- los señalados por Abraham, ¿No?

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 15/11/2010

Pues, como dije al incio y aclare despues, las funcionalidad y tiempo que se pierde al usar los modulos de las hojas para rutinas (Sub) son mi principal observacion, y aunque realmente no son importantes para cosas pequeñas y/o puntuales (como bien dice Cacho), si eres desarrolllador y/o programador, les aseguro que lo que menciona Armando "si el codigo no tiene que ver con los eventos especificos de la hoja o libro, debe colocarse en un modulo" es (casi) un principio basico.

Ah, sobre la explicacion del enlace que envie, recuerden que puse "algunas de las cuestiones" :) ya que aunque son casi iguales, pues VB no es lo mismo que VBA (me gusta lo de primos hermanos)

Abraham

PD: El formulario (de horario negativo ) esta en Excel o en otro lenguaje?

Armando Montes
Foro excel emagister
Escrito por Armando Montes
el 15/11/2010

Me da gusto ver que este debate ha sido uno de los pocos que merecen el titulo de debate ya que la mayoria son solo consultas, razon por la que me gusta mas el itulo original de temas, creo que asi le llamaban antes.

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 15/11/2010

A modo de resumen mencionaré parte del informe que he de elevar a la Comisión Directiva de nuestro "Club", para su aprobación e incorporación a Estatutos:
______________________

1º) No hay -prácticamente- diferencia alguna entre las macros residentes en módulos comunes y las residentes en módulos de hojas. Sino y sólo algunos detalles menores a los que hay que prestar atención.
______________________

2º) Las eventuales pérdidas de tiempo que "originaría" (dicho ésto en potencial) un código residente en el módulo de una hoja, muchas veces son fácilmente evitables. Por ejemplo: si desde un módulo común llamamos a un código residente en una hoja deberíamos:

Call nombredelmodulodelahoja. Nombremacro
(como lo explicara el Master Abraham)

Pero si todo el código (el "código llamador" y el "código llamado") residen en la propia hoja, entonces el Call sería el estandar:

Call nombremacro
(y "adiós" pérdida de tiempo)

______________________

3º) Finalmente expondré una teoría "técnico-sicológica" que justificaría las dos afirmaciones:

a) "... Funcionalidad y tiempo que se pierde al usar los modulos de las hojas... " (Abraham)

b) "... La recomendacion que mas he leido es que si el codigo no tiene que ver con los eventos especificos de la hoja o libro, debe colocarse en un modulo común... " (Armando)

Mi teoría se intitula: "Volver del Futuro".

Queda dicho que "casi" no hay diferencias entre las opciones que hemos analizado.

Pero si -un día- pegamos el "salto técnico" (vamos hacia el "Futuro") desde VBA a VB encontraremos que VB manipula "casi" cualquier cosa con las mismas técnicas por igual, quedando el Excel como una aplicación más de entre todas ellas.

VB y VBA se parecen mucho... ¡Pero no son lo mismo! , y en VB no tenemos, en general, hojas pues las "hojas" son propias del Excel.

Y aquí es donde se basa mi tesis: en VB valen TODAS las afirmaciones de Abraham y de Armando.
Luego: ¿Qué ocurre si volvemos del Futuro hacia el VBA, hacia las macros del Excel?

¿Qué es más práctico y sencillo para un programador? ¿Quitarse el "CD mental" del VB y colocarse el de VBA (con todos sus detalles particulares y diferenciados) ó utilizar en ambos ambientes de programación el mismo "CD mental"?...

La respuesta es obvia y ello sustentaría -con amplitud- la teoría "Volver del Futuro".

c) ¿Que le resta -entonces- a un "Excel-maníaco" sin pretenciones de desarrollador ni de programador profesional? Pues: evitar leer -de este debate- más allá del quinto mensaje, ¿No?

Saludos, mis amigos.
Cacho.

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 15/11/2010

Jejejejejej :)

Abraham

Escrito por Romulo Benitez Zavaleta
el 18/04/2012

Hola A todos Mi Nombre es Romulo y deseo que me puedan decir de como puedo hacer de que la impresion que uno genere por codigo salga de manera directa en la impresora he tratado de usar este fragmento de codigo y sale error

Sub ImpCabeceraImpresora()
printer. Print Tab(1); "Operacion "; Tab(11); "REPORTES DE ENTREGAS"; Tab(79); "MAPA :"; Tab(88); "UserForm9. Fmr"
printer. Print ; Tab(1); "Sistema :"; Tab(12); "P.C.P. "; Tab(79); "Fecha:"; Tab(88); Date
printer. Print ; String(98, "-")
printer. Print ; Tab(1); "Servicio"
printer. Print ; Tab(4); "OP"; Tab(9); "Modelo"; Tab(59); "Marca"; Tab(67); "Cant"; Tab(74); "Fecha"; Tab(85); "Fecha"; Tab(94); "Dur"
printer. Print ; Tab(67); "Cort"; Tab(74); "INI"; Tab(85); "FIN"
printer. Print ; String(98, "-")
End Sub

Gracias

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 19/04/2012

Supongo, Rómulo, que ya habrás advertido que tu consulta NINGUNA relación tiene con el tema que fue abordado en este debate.

A tenor de lo expuesto te sugiero:

-> Abrir un nuevo debate;
-> Exponer allí tu inquietud;
-> Subir al Foro un libro de muestra que incluya el código en cuestión

Saludos, Cacho R.