crear macro para busquedas repetitivas

26/09/2006 - 19:50 por wichy | Informe spam
Quisiera crear una macro para un libro de Excel, la cual me devolviera, tras
clickar un boton, los resultados de una misma fecha (que puede ser
repetitiva). Si además hubiera posibilidad de que directamente filtrara y
mostrara solo las filas donde encuentra esa fecha, seria ideal.

Gracias

Preguntas similare

Leer las respuestas

#11 Ivan
04/10/2006 - 17:45 | Informe spam
Hola wichi

no soy muy bueno explicando, pero voy a intentarlo: (voy a hacerlo como
si no supieras nada, espero que no te moleste, pero mas vale)

1º.- haz una copia del libro con el que vayas a trabajar, para evitar
problemas->. Con el
cerrado(el libro), copialo a otra carpeta y (te recomiendo) cambiale,
al menos un poco, el nombre.Y ahora abres este ultimo para hacer las
pruebas con el, y no arriesgar el original.

2º.-una vez abierto, haz doble click en la pestaña de la hoja (abajo
a la izq., seguramente se llamara "Hoja1") donde tengas la tabla que
mencionas y cambia el nombre por el de -> Fechas (tal cual esta
escrito), cuando te manejes un poco y lo comprendas, puedes poner el
nombre que desees y cambiarlo en el codigo (->Worksheets("Fechas")).

3º.-abre el editor de Visual Basic para Aplicaciones -> Herramientas
-> Macros -> Editor de visual Basic <-> o simplemente -> Alt + F11

4ª.-ahora estaras en el editor de VBA(si no esta maximizado,
maximizalo por comodidad).
Seguramente tendras una ventana pq. a la izq. con un titulo parecido a
esto:"Proyect-VBAproyect", si no es asi -> menu Ver -> Explorador de
proyectos < -> o simplemente -> Ctrl + R.
En esta ventana selecciona el nombre del Libro (pondra algo asi:
"VBAProyect(El nombre que hayas puesto al libro)" y ve al menu ->
Insertar -> 'Modulo' (ojo-<"Modulo" a secas, no "Modulo de clase").se
te abra abierto una ventana en blanco, seguramente con el titulo
Modulo1

5º.-copia el codigo que te pongo a continuacion y pegalo en la ventana
del Modulo1. OJO con dos cosas

duplicada, si es asi borra una de las dos.

que no quepa en el ancho del editor del foro, aunque voy a tratar de
evitarlo, si ves que te da error, revisalo a ver si ves un punto donde
la 'frase' se haya podido saltar de linea indebidamente (tendrias que
usar la intuicion) y si no lo ves, manda otro post con lo que te pueda
estar pasando.

6º.-vuelve a excel, haz click con el boton derecho en una barra de
menus y en el desplegable elige ->'Personalizar'.-> En la pestaña
,Comandos' ->elige 'Macros' de la lista de la izq.-> despues arrastra
el boton que aparece en la lista de la dcha.(una especie de 'sol'
sonriente) a una barra de menus y sueltalo alli, -> en la ventana
'Personalizar' clicka 'Modificar seleccion' , -> del desplegable que
aparece elige 'Asignar macro', -> en la nueva ventana selecciona
"CambiaVista" -> Acepta y cierra la ventana 'Personalizar


Ahora aprieta el nuevo boton y a ver que ocurre.(te aparecera un cuadro
en el que debes introducir la fecha que quieres buscar, en formato
fecha, pej- 4/10/06 o 4-10-06 o el que hayas uasado en la hoja-> OJo se
supone que la fecha esta sola en una celda
wichy ha escrito:

OJO-> pon este codigo, los anteriores preveian hasta la columna"z",
este de momento busca hasta la columna "DZ".

Option Explicit
Dim Busca As Boolean
Sub CambiaVista()
If Busca = False Then BuscarCita2 Else _
MostrarTodo
End Sub
Sub BuscarCita2()
Dim fiB As Integer, coB As Single
Dim lt As String, Esta As Boolean
Dim Celda As Range, Fecha As String
Application.ScreenUpdating = False
With Worksheets("Fechas")
.Rows.Hidden = False
Fecha = InputBox("Escribe la fecha a buscar")
If Fecha = "" Then Exit Sub
For fiB = 1 To .[a65536].End(xlUp).Row
Esta = False
For coB = 1 To .UsedRange.Columns.Count
If coB < 27 Then
lt = Chr(64 + coB)
ElseIf coB > 26 And coB < 53 Then
lt = "a" & Chr(64 + (coB - 26))
ElseIf coB > 52 And coB < 79 Then
lt = "b" & Chr(64 + (coB - 52))
ElseIf coB > 78 And coB < 105 Then
lt = "c" & Chr(64 + (coB - 78))
ElseIf coB > 104 And coB < 131 Then
lt = "d" & Chr(64 + (coB - 104))
End If
If .Range(lt & fiB) = CDate(Fecha) Then
Esta = True: Exit For
End If
Next
If Esta = False Then .Range(lt & fiB) _
.EntireRow.Hidden = True
Next
End With
Busca = True
Application.ScreenUpdating = True
End Sub
Sub MostrarTodo()
Dim Celda As Range
Application.ScreenUpdating = False
Worksheets("Fechas").Rows.Hidden = False
Busca = False
Application.ScreenUpdating = True
End Sub

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#12 AnSanVal
04/10/2006 - 22:22 | Informe spam
En un caso asi (si entendí bien), debería mostrar para la fecha 4/10, las
filas 2 (S) y 4 (W).

... S T U
V W ... AA
1 ... FECHA COMENTARIO SEGUIMIENTO FECHA ...
FECHA
2 ... 4/10 texto texto
3 ... 8/10 texto texto
4 ... 4/9 texto texto
4/10 ...

Si estoy en lo cierto (y no utilizando código VBA), podrias utilizar una
columna auxiliar que chequee si en la fila existe una coincidencia con la
fecha buscada, poniendo cero en caso negativo. Para ello puedes utilizar
p.e.:
=SI(O(S2=fecha;W2=fecha;AA2=fecha;etc);1;0)
Copias/Pegas hacia abajo hasta donde necesites y filtras por esa columna
auxiliar.

Saludos desde Tenerife.

"wichy" escribió en el mensaje
news:
Hola AnSanVa:

A ver si soy capaz de describirte la organización de la hoja

Como te decia en cada fila va incluido un cliente con sus datos generales
(entre la columna A y hasta la columna Q). Datos referentes a direccion,
telefonos, correos, web, persona de contacto etc.

A partir de la columna S,T y U y en saltos de 3 columnas incluyo (FECHA DE
CONTACTO, COMENTARIO, Y SI PRECISA SEGUIMIENTO). Este formato se repite
nuevamente en la columna W,C y Y, y asi repetitivamente dejando una
columna
de separacion entre cada uno de los grupos de 3.

El interés es que me filtre los datos y me muestre solo las filas que
contengan la fecha del dia (hoy). Tengo incluida una celda con la formula
"HOY()" y mediante un formato condicional me las resalta en otro color
cuando
coincide en las diferentes columnas (lo cual me facilita el localizarlas).
El
problema es que la hoja se va haciendo grande y cada vez es más
complicado.
Actualmente hay datos hasta las columnas CI, CJ y CK, y va en aumento.

Espero haber podido aclarar la situación

Muchas gracias
Respuesta Responder a este mensaje
#13 wichy
06/10/2006 - 14:52 | Informe spam
"AnSanVal" escribió:

En un caso asi (si entendí bien), debería mostrar para la fecha 4/10, las
filas 2 (S) y 4 (W).

... S T U
V W ... AA
1 ... FECHA COMENTARIO SEGUIMIENTO FECHA ...
FECHA
2 ... 4/10 texto texto
3 ... 8/10 texto texto
4 ... 4/9 texto texto
4/10 ...

Si estoy en lo cierto (y no utilizando código VBA), podrias utilizar una
columna auxiliar que chequee si en la fila existe una coincidencia con la
fecha buscada, poniendo cero en caso negativo. Para ello puedes utilizar
p.e.:
=SI(O(S2=fecha;W2=fecha;AA2=fecha;etc);1;0)
Copias/Pegas hacia abajo hasta donde necesites y filtras por esa columna
auxiliar.

Saludos desde Tenerife.





Hola AnSanVal:

Es una muy buena solución, sencilla y práctica, y funciona perfectamente.

Muchisimas gracias por tu ayuda.

Tienes un nuevo amigo en Valencia
Respuesta Responder a este mensaje
#14 wichy
06/10/2006 - 15:46 | Informe spam
"Ivan" escribió:

Hola wichi

no soy muy bueno explicando, pero voy a intentarlo: (voy a hacerlo como
si no supieras nada, espero que no te moleste, pero mas vale)

1º.- haz una copia del libro con el que vayas a trabajar, para evitar
problemas->. Con el
cerrado(el libro), copialo a otra carpeta y (te recomiendo) cambiale,
al menos un poco, el nombre.Y ahora abres este ultimo para hacer las
pruebas con el, y no arriesgar el original.

2º.-una vez abierto, haz doble click en la pestaña de la hoja (abajo
a la izq., seguramente se llamara "Hoja1") donde tengas la tabla que
mencionas y cambia el nombre por el de -> Fechas (tal cual esta
escrito), cuando te manejes un poco y lo comprendas, puedes poner el
nombre que desees y cambiarlo en el codigo (->Worksheets("Fechas")).

3º.-abre el editor de Visual Basic para Aplicaciones -> Herramientas
-> Macros -> Editor de visual Basic <-> o simplemente -> Alt + F11

4ª.-ahora estaras en el editor de VBA(si no esta maximizado,
maximizalo por comodidad).
Seguramente tendras una ventana pq. a la izq. con un titulo parecido a
esto:"Proyect-VBAproyect", si no es asi -> menu Ver -> Explorador de
proyectos < -> o simplemente -> Ctrl + R.
En esta ventana selecciona el nombre del Libro (pondra algo asi:
"VBAProyect(El nombre que hayas puesto al libro)" y ve al menu ->
Insertar -> 'Modulo' (ojo-<"Modulo" a secas, no "Modulo de clase").se
te abra abierto una ventana en blanco, seguramente con el titulo
Modulo1

5º.-copia el codigo que te pongo a continuacion y pegalo en la ventana
del Modulo1. OJO con dos cosas

duplicada, si es asi borra una de las dos.

que no quepa en el ancho del editor del foro, aunque voy a tratar de
evitarlo, si ves que te da error, revisalo a ver si ves un punto donde
la 'frase' se haya podido saltar de linea indebidamente (tendrias que
usar la intuicion) y si no lo ves, manda otro post con lo que te pueda
estar pasando.

6º.-vuelve a excel, haz click con el boton derecho en una barra de
menus y en el desplegable elige ->'Personalizar'.-> En la pestaña
,Comandos' ->elige 'Macros' de la lista de la izq.-> despues arrastra
el boton que aparece en la lista de la dcha.(una especie de 'sol'
sonriente) a una barra de menus y sueltalo alli, -> en la ventana
'Personalizar' clicka 'Modificar seleccion' , -> del desplegable que
aparece elige 'Asignar macro', -> en la nueva ventana selecciona
"CambiaVista" -> Acepta y cierra la ventana 'Personalizar


Ahora aprieta el nuevo boton y a ver que ocurre.(te aparecera un cuadro
en el que debes introducir la fecha que quieres buscar, en formato
fecha, pej- 4/10/06 o 4-10-06 o el que hayas uasado en la hoja-> OJo se
supone que la fecha esta sola en una celda
wichy ha escrito:

OJO-> pon este codigo, los anteriores preveian hasta la columna"z",
este de momento busca hasta la columna "DZ".

Option Explicit
Dim Busca As Boolean
Sub CambiaVista()
If Busca = False Then BuscarCita2 Else _
MostrarTodo
End Sub
Sub BuscarCita2()
Dim fiB As Integer, coB As Single
Dim lt As String, Esta As Boolean
Dim Celda As Range, Fecha As String
Application.ScreenUpdating = False
With Worksheets("Fechas")
.Rows.Hidden = False
Fecha = InputBox("Escribe la fecha a buscar")
If Fecha = "" Then Exit Sub
For fiB = 1 To .[a65536].End(xlUp).Row
Esta = False
For coB = 1 To .UsedRange.Columns.Count
If coB < 27 Then
lt = Chr(64 + coB)
ElseIf coB > 26 And coB < 53 Then
lt = "a" & Chr(64 + (coB - 26))
ElseIf coB > 52 And coB < 79 Then
lt = "b" & Chr(64 + (coB - 52))
ElseIf coB > 78 And coB < 105 Then
lt = "c" & Chr(64 + (coB - 78))
ElseIf coB > 104 And coB < 131 Then
lt = "d" & Chr(64 + (coB - 104))
End If
If .Range(lt & fiB) = CDate(Fecha) Then
Esta = True: Exit For
End If
Next
If Esta = False Then .Range(lt & fiB) _
.EntireRow.Hidden = True
Next
End With
Busca = True
Application.ScreenUpdating = True
End Sub
Sub MostrarTodo()
Dim Celda As Range
Application.ScreenUpdating = False
Worksheets("Fechas").Rows.Hidden = False
Busca = False
Application.ScreenUpdating = True
End Sub

Un saludo y hasta pronto
Ivan




Hola Ivan:

No solo no me molesta, sino que es totalmente cierto, comparado con vuestros
conociemientos.

La macro funciona a las mil maravillas, y la explicación es perfecta.
Muchisimas gracias.

Dos ultimos detalles y no te molesto más.

1 - En el libro tengo editadas varias hojas con su nombre ya definido (creo
que ese era el motivo de que no me funcionara en el primer intento. Cambiaba
la palabra "fecha" por el nombre de todo el libro y no por el que tenia en la
pestaña inferior). ¿Existe la posibilidad de incluir una instrucción para que
me valga en todas las hojas?. Entiendo que tendria que cambiar el nombre que
ya tengo asignado, igual que he hecho con una de ellas para ver el
funcionamiento. Actualmente hay cuatro hojas dentro del libro e irá en
aumento.

2 - Esta segunda es más prescindible. Dentro de cada hoja tengo asignada una
celda en el que me muestra la fecha del dia (mendiante la formula "HOY()"),
concretamente la $E$6(siempre la misma en todas las hojas del libro). ¿Hay
posibilidad de que en la busqueda se redirija a esa celda y evitar el poner
la fecha?. Como te digo, carece de importancia, pero evitaria tener que
teclear cada vez la fecha.

Repito mi agradecimiento a vuestro interés.

Un saludo
Respuesta Responder a este mensaje
#15 Ivan
07/10/2006 - 01:36 | Informe spam
Hola wichi

el codigo 'BuscarCitas' que te pongo al final, busca en la hoja activa
(Activesheet) del libro, da lo mismo como se llame (puedes volver a
poner el que tubieras) las 'citas' con la fecha actual, la del dia de
busqueda (para el codigo no hace falta que pongas la fecha en ningun
sitio). Te pongo tambien otro 'BuscarPorFecha' que tambien busca en la
hoja activa, pero por la fecha que introduzcas en cuadro de dialogo. Ya
que esta, tambien puede serte util para buscar en el 'pasado'.

estan ampliados para buscar hasta la columna "EZ"

por otro lado te comento que si preves tener muchos registros quizas
sea un poco lento. Te comento mas o menos mis pruebas hechas con las
columnas de la "A" a la "DZ" llenas de datos:(131 columnas)

'bastante rapido'




estoy haciendo pruebas con filtros, que son mucho mas rapidos, pero
estoy atorado. Si preves miles de filas, comentalo y, si logro hacerme
con los filtros, que me suelen llevar por el camino de la amargura, te
lo envio.

un saludo y hasta pronto
Ivan

Los codigos-->
(por cierto, los otros llevaban bastante 'chatarra' que se me paso
quitar)
Sub CitasHoy()
Dim fiB As Integer, coB As Single
Dim lt As String, NoEsta As Boolean
Busca = False
With ActiveSheet
If .UsedRange.Columns.Count < 19 Then Exit Sub
Application.ScreenUpdating = False
.Rows.Hidden = False
For fiB = 1 To .[a65536].End(xlUp).Row
NoEsta = True
For coB = 19 To .UsedRange.Columns.Count Step 3
If coB < 27 Then
lt = Chr(64 + coB)
ElseIf coB > 26 And coB < 53 Then
lt = "a" & Chr(64 + (coB - 26))
ElseIf coB > 52 And coB < 79 Then
lt = "b" & Chr(64 + (coB - 52))
ElseIf coB > 78 And coB < 105 Then
lt = "c" & Chr(64 + (coB - 78))
ElseIf coB > 104 And coB < 131 Then
lt = "d" & Chr(64 + (coB - 104))
ElseIf coB > 130 And coB < 157 Then
lt = "e" & Chr(64 + (coB - 130))
End If
If .Range(lt & fiB) = Date Then
NoEsta = False: Exit For
End If
Next
.Range(lt & fiB).EntireRow.Hidden = NoEsta
Next
End With
Busca = True
Application.ScreenUpdating = True
End Sub


Sub MostrarTodo()
Dim Celda As Range
Application.ScreenUpdating = False
ActiveSheet.Rows.Hidden = False
Busca = False
Application.ScreenUpdating = True
End Sub


Sub BuscarPorFecha()
Dim fiB As Integer, coB As Single
Dim lt As String, NoEsta As Boolean
Dim Fecha As String
Busca = False
With ActiveSheet
If .UsedRange.Columns.Count < 19 Then Exit Sub
Application.ScreenUpdating = False
.Rows.Hidden = False
Fecha = InputBox("Escribe la fecha a buscar")
If Fecha = "" Then Exit Sub
For fiB = 1 To .[a65536].End(xlUp).Row
NoEsta = True
For coB = 19 To .UsedRange.Columns.Count Step 3
If coB < 27 Then
lt = Chr(64 + coB)
ElseIf coB > 26 And coB < 53 Then
lt = "a" & Chr(64 + (coB - 26))
ElseIf coB > 52 And coB < 79 Then
lt = "b" & Chr(64 + (coB - 52))
ElseIf coB > 78 And coB < 105 Then
lt = "c" & Chr(64 + (coB - 78))
ElseIf coB > 104 And coB < 131 Then
lt = "d" & Chr(64 + (coB - 104))
ElseIf coB > 130 And coB < 157 Then
lt = "e" & Chr(64 + (coB - 130))
End If
If .Range(lt & fiB) = CDate(Fecha) Then
NoEsta = False: Exit For
End If
Next
.Range(lt & fiB).EntireRow.Hidden = NoEsta
Next
End With
Busca = True
Application.ScreenUpdating = True
End Sub
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida