Filtro avanzado y posterior selección de celdas en Excel

28/08/2007 - 21:28 por miguel p | Informe spam
Estimados compañeros:
Habiendo llevado a cabo un filtro avanzado
a partir del cual queda filtrada en todos los casos una fila del archivo, ¿
como puedo lograr la selección de una celda determinada de dicha fila
introduciendo códigos de Visual Basic en la macro que maneja dicho filtro?
Desde ya, muchas gracias.

Miguel
No te des por vencido

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
31/08/2007 - 06:10 | Informe spam
hola, miguel !

1) segun los codigos que expones [y si no me equivoco] lo que consigues al ejecutar ambos es +/- lo siugiente:
a) primera macro para aplicar filtros avanzados y *obtener* EL MISMO DATO por el que preguntas en la celda 'A7'
b) seleccionar la fila resultante [columna A] para copiar EL MISMO DATO consultado [pero ahora] en la celda 'F1'
c) segunda macro para ejecutar una de tres posibles [sub]macros segun el contenido de las celdas 'E1' y 'G1'

2) si del rango de los criterios [A6:A7] la celda 'A7' *toma* su dato [aleatorio] desde *otra celda relacionada*...
y al final de cuentas es EL MISMO DATO que devuelve el filtro avanzado [suponiendo que el aleatorio siempre existira]
[pregunta]: por que usar CUATRO celdas para un solo dato ?
-> (a) la *relacionada* (b) la de los criterios 'A7' (c) la del filtro (d) depositar el resultado en 'F1'

3) en el siguiente ejemplo, estoy *suponiendo* que la celda *relacionada* fuera la celda 'C1' [por una variable llamada "x"]
y estoy usando otra variable para el *tipo* de macro-factura [A, B o C] que se ejecutaria segun contenido de 'E1' y 'G1'

-> es probable/seguro/... que todavia se pudiera *adelgazar* [y agilizar] el codigo si comentas despues de probar el siguiente:
NOTA: deberas dejar *libre* la columna A [es decir, al no usar filtros avanzados NO se requiere el rango de criterios: A6:A7]

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Sub Factura_Clientes()
Dim Tipo As String, x As String
Tipo = "c"
x = "c1" ' <= cambia por la celda *relacionada* REAL que *alimentaba* a la celda 'A7' <= OJO '
Worksheets("clientes").Select
Range("f1").ClearContents
If Application.CountIf(Range("a:a"), Range(x)) = 0 _
Then MsgBox "No hay registro para el cliente: " & Range(x): Exit Sub
Range("f1") = Range("a:a").Find(Range(x))
If Range("e1") = "RI" Then Tipo = IIf(Range("g1") = "RI", "a", "b")
Application.Run "facturación.xls!factura" & Tipo
End Sub

__ la consutla original __
... los codigos de las macros y algunas aclaraciones...
Sub Clientes_PrepBusq()
Sheets("CLIENTES").Select
Range("A11:K506").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A6:A7"), Unique:=False
End Sub

En la celda A7 introduzco, en forma aleatoria y desde otra celda relacionada con esta
el Codigo de Cliente que quiero seleccionar.

Una vez efectuado el filtrado, selecciono manualmente la celda con el Codigo del Cliente y ejecuto la siguiente macro.

Sub SelecClientes()
Sheets("CLIENTES").Select
Selection.Copy
Range("F1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
cliente = Range("G1").Value
usuario = Range("E1").Value
If usuario = "RI" And cliente = "RI" Then
Application.Run "Facturacion.xls!FacturaA"
Else
If usuario = "RI" And cliente <> "RI" Then
Application.Run "Facturacion.xls!FacturaB"
Else
If usuario <> "RI" Then
Application.Run "Facturacion.xls!FacturaC"
End If
End If
End If
Selection.Copy
End Sub

El contenido de la celda F1 es la posicion del Usuario ante el I.V.A.(RI, RNI, M)
El contenido de la celda G1 es la posicion del Cliente ante el I.V.A.(RI, RNI, M, CF)
El contenido de la celda F1 es la posicion del Usuario ante el I.V.A.(RI, RNI, M)
Respuesta Responder a este mensaje
#7 miguel p
01/09/2007 - 16:58 | Informe spam
Hola Héctor Miguel.

De acuerdo a tus últimas indicaciones, confeccioné la macro. Ésta no
funciona en mi PC, señalando error “No se encontró el archivo: VBA5.DLL”.
Seguramente, porque no tengo instalado Visual en forma correcta.
Encaré el tema desde otro punto de vista, utilizando “BUSCAR”, donde
introduje algunas modificaciones:

Introduje una variable P
Cambié la estructura de búsqueda: donde decía Cells.Find(What:=”..” ahora
dice Cells.Find(What:=P

P = Range("A9").Value
Cells.Find(What:=P, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext,
MatchCase:= _
False).Activate
ActiveCell.Offset(0, 3).Select
Selection.Copy
Range (“F1”).Select

En la celda A9 se van introduciendo aleatoriamente los códigos de cliente
que se quieren seleccionar para facturar.
La macro busca en la columna correspondiente el código del cliente, se
desplaza hasta el campo condición ante el I.V.A. del cliente seleccionado (Se
encuentra 3 columnas a la derecha) y traslada el valor seleccionado a F1,
donde pega dicho valor.
De acuerdo a las condiciones ante el I.V.A. de usuario y cliente, elige
automáticamente Factura “A”, “B” o “C”.

Como podrás aprecias, mis “Alquimias” carecen de nivel técnico.
Agradezco nuevamente tus reiteradas atenciones y te hago llegar mi cordial
saludo

Miguel - Córdoba (R.A.)


"Héctor Miguel" escribió:

hola, miguel !

1) segun los codigos que expones [y si no me equivoco] lo que consigues al ejecutar ambos es +/- lo siugiente:
a) primera macro para aplicar filtros avanzados y *obtener* EL MISMO DATO por el que preguntas en la celda 'A7'
b) seleccionar la fila resultante [columna A] para copiar EL MISMO DATO consultado [pero ahora] en la celda 'F1'
c) segunda macro para ejecutar una de tres posibles [sub]macros segun el contenido de las celdas 'E1' y 'G1'

2) si del rango de los criterios [A6:A7] la celda 'A7' *toma* su dato [aleatorio] desde *otra celda relacionada*...
y al final de cuentas es EL MISMO DATO que devuelve el filtro avanzado [suponiendo que el aleatorio siempre existira]
[pregunta]: por que usar CUATRO celdas para un solo dato ?
-> (a) la *relacionada* (b) la de los criterios 'A7' (c) la del filtro (d) depositar el resultado en 'F1'

3) en el siguiente ejemplo, estoy *suponiendo* que la celda *relacionada* fuera la celda 'C1' [por una variable llamada "x"]
y estoy usando otra variable para el *tipo* de macro-factura [A, B o C] que se ejecutaria segun contenido de 'E1' y 'G1'

-> es probable/seguro/... que todavia se pudiera *adelgazar* [y agilizar] el codigo si comentas despues de probar el siguiente:
NOTA: deberas dejar *libre* la columna A [es decir, al no usar filtros avanzados NO se requiere el rango de criterios: A6:A7]

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Sub Factura_Clientes()
Dim Tipo As String, x As String
Tipo = "c"
x = "c1" ' <= cambia por la celda *relacionada* REAL que *alimentaba* a la celda 'A7' <= OJO '
Worksheets("clientes").Select
Range("f1").ClearContents
If Application.CountIf(Range("a:a"), Range(x)) = 0 _
Then MsgBox "No hay registro para el cliente: " & Range(x): Exit Sub
Range("f1") = Range("a:a").Find(Range(x))
If Range("e1") = "RI" Then Tipo = IIf(Range("g1") = "RI", "a", "b")
Application.Run "facturación.xls!factura" & Tipo
End Sub

__ la consutla original __
> ... los codigos de las macros y algunas aclaraciones...
> Sub Clientes_PrepBusq()
> Sheets("CLIENTES").Select
> Range("A11:K506").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
> Range("A6:A7"), Unique:=False
> End Sub
>
> En la celda A7 introduzco, en forma aleatoria y desde otra celda relacionada con esta
> el Codigo de Cliente que quiero seleccionar.
>
> Una vez efectuado el filtrado, selecciono manualmente la celda con el Codigo del Cliente y ejecuto la siguiente macro.
>
> Sub SelecClientes()
> Sheets("CLIENTES").Select
> Selection.Copy
> Range("F1").Select
> Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> False, Transpose:=False
> cliente = Range("G1").Value
> usuario = Range("E1").Value
> If usuario = "RI" And cliente = "RI" Then
> Application.Run "Facturacion.xls!FacturaA"
> Else
> If usuario = "RI" And cliente <> "RI" Then
> Application.Run "Facturacion.xls!FacturaB"
> Else
> If usuario <> "RI" Then
> Application.Run "Facturacion.xls!FacturaC"
> End If
> End If
> End If
> Selection.Copy
> End Sub
>
> El contenido de la celda F1 es la posicion del Usuario ante el I.V.A.(RI, RNI, M)
> El contenido de la celda G1 es la posicion del Cliente ante el I.V.A.(RI, RNI, M, CF)
> El contenido de la celda F1 es la posicion del Usuario ante el I.V.A.(RI, RNI, M)



Respuesta Responder a este mensaje
#8 Héctor Miguel
02/09/2007 - 01:13 | Informe spam
hola, miguel !

__ 1 __
De acuerdo a tus ultimas indicaciones, confeccione la macro. esta no funciona en mi PC
se#alando error "No se encontro el archivo: VBA5.DLL".
Seguramente, porque no tengo instalado Visual en forma correcta.



1) revisa en el editor de vba desde [menu] herramientas / referencias...
por alguna referencia establecida que pudiera estar indicada como: FALTA:xxx o MISSING:xxx

__ 2 __
Encare el tema desde otro punto de vista, utilizando "BUSCAR", donde introduje algunas modificaciones:
Introduje una variable P
Cambie la estructura de busqueda: donde decia Cells.Find(What:=".." ahora dice Cells.Find(What:=P



2) hasta aqui [practicamente] no hay *diferencias* en los codigos [solo formas y quizas alguna/s variable/s intermedia/s] :D

__ 3 __
P = Range("A9").Value
Cells.Find(What:=P, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate
ActiveCell.Offset(0, 3).Select
Selection.Copy
Range ("F1").Select
En la celda A9 se van introduciendo aleatoriamente los codigos de cliente que se quieren seleccionar para facturar.
La macro busca en la columna correspondiente el codigo del cliente
se desplaza hasta el campo condicion ante el I.V.A. del cliente seleccionado
(Se encuentra 3 columnas a la derecha) y traslada el valor seleccionado a F1, donde pega dicho valor.



3) aqui hay una diferencia *sustancial* entre mis *supuestos* y las instrucciones de tu codigo *reales* [seleccionando celdas]
a) mi supuesto era que a la celda "F1" se copiaba el dato de la celda donde se encontraba el valor buscado [por eso lo de *MISMO*]
b) tu realidad es que a la celda "F1" le trasladas el valor de 3 columnas a la derecha de la celda con el valor encontrado -?-
[creo que no tenia yo forma de adivinarlo ya que la segunda macro se ejecutaba DESPUES de seleccionar "X" celda] ;)

lo bueno es que ya has resuelto tales detalles ;)
-> solo revisa el porque de la falla en en mensaje de que no se encontro la referencia a VBA5.DLL -???-

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida