UniversoExcelForo

Respuesta a consultas.
Fecha de creación: 09.Abril.2012

Fundadores: Wibly,Tyno,Servando,Sakkar,Rosendo2,RMaximo,Railar,Mcoronel,Ioyama,Igtelo,Hugotron,Drochar,Dedos,Alberto,Adolfo

No se pueden hacer consultas de Excel o VBA por mensaje privado.
Utiliza el botón buscar del foro y te ahorras tiempo para obtener "ayuda".

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje [Página 1 de 1.]

Edmund8


Hola a todos Very Happy :
Por favor, alguien quien me pueda dar una mano, en VBA para excel, tal como lo indico en el título.
En un proyecto, tarea de mi escuela, quisiera que al ingresar se vea únicamente el MENÚ, es decir que tenga ocultas todas las hojas excepto una.  Luego cuando seleccione una hoja formulario ésta se muestre y finalmente cuando grabe los datos, éstos puedan guardarse sin problema en la correspondiente tabla oculta.
La idea es cuando el usuario intente ver hojas ocultas en la forma tradicional, éste no tenga acceso fácilmente.
Adjunto archivo de muestra de lo que he estado haciendo hasta el momento.
De antemano muy agradecido...!!
Salu2 cordiales.!!!!
Archivos
ProyB.xlsm
Ocultar y desocultar protegidas hojas VBA
No tienes los permisos para descargar los archivos.
(68 KB)

tyno


Hola Edmund8.
Paso tu archivo con un par de macros que hice que cumplen con tu pedido. Desde luego esta macro la aplique para una sola Hoja a modo de ejemplo.

En primer lugar hice para que se oculten todas las Hojas (menos la Hoja MENÚ) de manera total, es decir que no se puedan ver con la opción de Mostrar Hojas. Esto se logra mediante un código de macro que esta en ThisWorkbook que al iniciar el archivo oculta las Hojas como lo he explicado. Por este motivo la única Hoja que vas a poder acceder a parte de MENÚ es  la Hoja de ForPROVEEDORES, el resto de las Hojas las vas a ver después de crear las macros que faltan, lo cual te explico a continuación:

Entonces, las macros que hice trabajan con la Hoja ForPROVEEDORES y PROVEEDORES. En la Hoja MENÚ con el botón PROVEEDORES vas a visualizar la Hoja ForPROVEEDORES y luego que cargues los datos, con el botón Guardar, los registros se graban en la Hoja PROVEEDORES. Por ultimo, cuando salgas de la Hoja ForPROVEEDORES esta se oculta nuevamente.

Lo que vas a tener que adaptar para el resto de las Hojas es:
En cada botón de la Hoja MENÚ, que corresponde a las otras Hojas ocultas, vas a tener implementar el mismo código que esta en el botón PROVEEDORES adaptando las referencias y nombres que correspondan.
En cada botón Guardar, de cada Hoja, vas a tener que adaptar el código que hice en el botón Guardar de la Hoja PROVEEDORES, para que los datos se guarden en las Hoja que correspondan.
Por último vas a tener que copiar y adaptar el código que esta en la Hoja ForPROVEEDORES a cada Hoja, dicho código es para ocultar la Hoja al salir de cada una de ellas, en este caso sería la Hoja ForPROVEEDORES
Private Sub Worksheet_Deactivate()
With Sheets("ForPROVEEDORES")
.Visible = xlSheetVeryHidden
End With
End Sub

Saludos
Archivos
ProyB.xlsm
No tienes los permisos para descargar los archivos.
(90 KB)

Edmund8


Hola Tyno:
Muy, pero muy, muy muy agradecido por compartir tus conocimientos.!!
El ejemplo funciona tal como lo necesito.
Tan solo algo que observé en el código que copia de la hoja ForProveedores y los traslada a PROVEEDORES, sinceramente es muy sofisticado para mi nivel porque apenas estoy iniciando; y mi maestro no me creería que yo lo hice a no ser de que se lo pueda explicar con propiedad.
Hace lo mismo que el que hice, sin embargo tu diseño extra resumido y obviamente en cuanto a tiempo de ejecución debe ser rapidísimo.
Si no es mucho molestar y abusar de tu valioso tiempo que me lo pudieras explicar para que lo pueda adaptar a las demás hojas que funcionan como Formularios ya que algunas varían mucho; y así cuando me examinen sabré cómo hacerlo.
Bendiciones y mucho éxitos!!!

tyno


No se si el código que hice es más rápido que el que tenías anteriormente, si es más resumido:

With Sheets("PROVEEDORES")
x = 3
rw = .Range("a1:a1000000").Find("").Row
For a = 0 To 4
.Cells(rw, a + 1) = Cells(x, 4)
x = x + 2
Next a
End With

donde:

x=3 
Esta variable "x" (puede ser cualquier letra o texto) le he asignado el valor inicial 3 porque los datos a copiar de la Hoja ForPROVEEDORES comienzan en la la fila 3 (D3), o sea que x nos sirve como una referencia para más adelante.

rw = .Range("a1:a1000000").Find("").Row
Aquí a la variable "rw" (puede ser cualquier letra o texto) se le asigna el valor de fila (Row) de la primer celda vacía ("")  en en el rango A1:A10000 (Range("a1:a10000")) de la Hoja PROVEEDORES.  Esto se logra mediante el método Find (encontrar) el cual siempre busca la primer coincidencia especificada en un rango.

Entonces .Range("a1:a1000000").Find("").Row  quiere decir: encontrar (Find), en el rango A1:A10000  (Range("a1:a10000")), una celda vacía ("") y devolver el valor de fila (Row) de dicha celda vacía.

For a = 0 To 4
Este bucle For Next va de 0 a 4 porque tenemos que recorrer 5 celdas o campos con datos en la Hoja ForPROVEEDORES los que corresponden a NIT, NOMBRE, DIRECCIÓN, TELÉFONO, MAIL.

.Cells(rw, a + 1) = Cells(x, 4)
Aquí se igualan las celdas de la Hoja de destino, o sea PROVEEDORES con las celdas con datos de la Hoja ForPROVEEDORES.
Observa que la variable a del bucle For Next en el primer término esta en las columnas .Cells(rw, a + 1) lo cual va a hacer que por cada ciclo del bucle la referencia se desplace una columna hacia la derecha conforme avanza el bucle. También notarás que a la variable a le sumo 1 porque el valor inicial de la misma es 0, esto porque no se puede hacer referencia a una celda (Cells) cuya columna es 0, no existe la columna 0, siempre comienza de la columna 1 o A. En realidad esto no es necesario que quede expresado de esta manera, el bucle tendría que haber sido:

With Sheets("PROVEEDORES")
x = 3
rw = .Range("a1:a1000000").Find("").Row
For a = 1 To 5
.Cells(rw, a) = Cells(x, 4)
x = x + 2
Next a
End With

Sucede que en el momento en que estaba probando la macro, decidí asignar el valor inicial 0 para la variable a porque pensé que podría utilizar dicha variable para hacer referencia a las celdas con datos de la Hoja ForPROVEEDORES, luego me olvidé de modificarlo, pero esto no afecta en nada los resultados. Así que si vas a utilizar este bucle lo mejor es que quede expresado como lo indiqué arriba.


Continuando, por el contrario en el segundo término he utilizado la variable "x" (la cual tenía el valor 3 inicial) para las filas Cells(x, 4) luego esta misma variable incrementa su valor en +2 por cada ciclo del bucle For Next, por esto esta linea x = x + 2, esto tiene que ser así porque en la Hoja ForProveedores las celdas con datos están salteadas con una fila intermedia D3, D5, D7, D9, D11. Entonces en primer lugar x vale 3, en el segundo ciclo del bucle se suma 2 a x por lo tanto x pasa a valer 5, luego vuelve a sumar 2 y x pasa a valer 7... y así hasta que se completa el bucle For Next.

Cualquier cosa más puntual me avisas. Saludos

Edmund8


Gracias por tu fineza de apartar un valioso tiempo para explicar a detalle el bucle.

Quise poner en práctica tu código con la hoja ForINGRESOS debido a que ésta mostraba más complicaciones, al ver que estaba muy enredada, dispuse hacerla en dos grupos únicamente, sin embargo posiblemente mi lógica no es la correcta, pues no funcionó:

With Sheets("INGRESOS")
x = 3
rw = .Range("a1:a1000000").Find("").Row
For a = 1 To 5
.Cells(rw, a) = Cells(x, 4)
x = x + 2
Next a
End With

With Sheets("INGRESOS")
y = 3
rw = .Range("f1:f1000000").Find("").Row
For b = 6 To 12
.Cells(rw, b) = Cells(x, 11)
x = x + 2
Next b
End With

Nuevamente te molesto con que me puedas corregir lo que hice.  Adjunto el archivo con la hoja en mención modificada.  Espero con ésto cerrar este tema y continuar con otro de la serie.
Saludos!!!
Archivos
ProyB2.xlsm
No tienes los permisos para descargar los archivos.
(74 KB)

Igtelo


Hola Edmund / Tyno, un abrazo.

Aquí de metiche... Jejeje. Ahora si exploto, Tyno: Si con la explicación tan detallada y clara que haz hecho no se entiende, entonces ya no se que vaya ha suceder en éste foro...

Saludos
Ignacio Téllez
P.d: Por favor copialo y pásalo al subforo de "Tutoriales"

tyno


Hola Edmund8, saludos nacho.
Bueno, vamos a procurar que esto llegue al punto de explosión ya que costó bastante armar el foro, jejeje .
Estuve mirando la Hoja ForINGRESO y veo que los campos de datos por un lado están en dos columnas diferentes y por otro no guardan un espacio de celdas uniforme, por ejemplo entre le campo Nombre y Nº de Factura hay dos celdas vacías de separación con lo cual ya no serviría de mucho el código que vimos en principio. Para resolver esto llevaría hacer un macro un poco más compleja, ahora si el tema de tu archivo Edmund8  es un trabajo para tu escuela y no tienes mucha idea de macro creo que no te ayudaría de mucho hacer algo que no entiendas.
Lo que se me ocurre es que re diseñes los datos en las Hojas formularios de manera que te queden en una misma columna y separados solo por una celda vacía con esto vas a poder adaptar el código de macro que te he explicado anteriormente. O sea, la idea es arreglarse con las herramientas que uno tiene y sabe manejar, en este caso el código de macro que ya viste para la Hoja PROVEEDORES.

Saludos

Edmund8


Reitero mi más sincero agradecimiento Tyno, disculpen los inconvenientes en el foro.

Hasta pronto!

Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.