> 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 seleccion de una celda determinada de dicha fila
> introduciendo codigos de Visual Basic en la macro que maneja dicho filtro?
si necesitas alguna propuesta mas... *concreta*... sera necesario que expongas detalles mas... *precisos* ;)
si solo quieres saber +/- *por donde* tirar la macro... usa alguna [o varias] de las siguientes
- indicale al codigo cual es la relacion entre la fila de la *determinada celda* y los titulos y/o el rango con el filtro avanzado
- confirma que existan datos que cumplan con el/los criterio/s aplicado/s
- revisa cuantas areas [y filas en cada area] resultan despues de aplicado el filtro
- selecciona la *determinada celda* ANTES de que muestres el rango sin filtros aplicados
- toma en cuenta que el rango que se reporta para los filtros avanzados es el rango al que lo aplicas [determinado o columna completa]
- etc. etc. etc.
saludos,
hector.
--
Saludos desde Tenerife (Islas Canarias).
"miguel p" <pic...@hotmail.com> escribió en el mensaje
news:C2DE00B8-6603-4FC4...@microsoft.com...
1) Utilizo una primera macro que lleva a cabo un filtrado avanzado, mediante
la inserción aleatoria del código del cliente a seleccionar en la celda
correspondiente del Rango de Criterios, lo cual permite filtrar el registro
correspondiente a dicho cliente. Una vez llevado a cabo el filtrado, no queda
seleccionada ninguna celda del registro. Por lo expuesto en el párrafo
anterior, debo seleccionar manualmente la celda correspondiente a Código del
Cliente y ejecutar una segunda macro que traslada la información de ciertos
campos a otro sector de la Hoja.
2) De acuerdo a lo anterior, el procedimiento abarca dos macros y una
selección manual.
3) Las macros que utilizo son una combinación del procedimiento habitual de
creación de macros sumado a la incorporación de códigos en Visual Basic que
mejorar el rendimiento de la planilla.
Con el objeto de mejorar el procedimiento, me interesaría conocer si es
posible incorporar a las macros códigos que posibiliten la activación
automática de la celda de Código del Cliente en la fila (registro) obtenida a
partir del filtro, de manera tal que hagan innecesaria la selección manual,
lo que traería aparejado la simplificación de tareas, ya que sería posible
utilizar tan sólo una macro para obtener igual resultado.
Agradezco desde ya la ayuda que puedas prestarme y te hago llegar mi
afectuoso saludo.
--
Miguel - Córdoba (R.A.)
"Héctor Miguel" escribió:
> Se trata de un archivo de Clientes... en una Hoja... con varias columnas... la primera Codigo del Cliente.
> El objetivo es lograr informacion referida a un campo de un cliente determinado.
> Para ello utilizo el siguiente procedimiento:
> ... una primera macro... un filtrado avanzado... insercion aleatoria del codigo del cliente... en...el Rango de Criterios
> ... llevado a cabo el filtrado... debo seleccionar manualmente la celda correspondiente a Codigo del Cliente
> ... ejecutar una segunda macro que traslada la informacion de ciertos campos a otro sector de la Hoja...
si expones los codigos de ambas macros, es posible que se pueda *aligerar* el procedimiento...
-> SIN que exista la *necesidad* de seleccionar alguna celda y [probablemente] SIN efectuar filtros avanzados ;)
-> solo se necesita conocer [de preferencia, +/- exactamente] -> referencias a celdas/rangos/hojas/... -nombres- de:
- el rango de tu listado
- como [y/o de donde] se obtiene el criterio *aleatorio*
- cuales con los *ciertos campos/columnas* que se van a trasladar
- cual es el *otro sector* de la hoja [y donde se debe poner el resultado]
saludos,
hector.
Sub Clientes_PrepBusq()
'
' Clientes_PrepBusq Macro
' Macro grabada el 18/04/2006 por Diego
'
' Acceso directo: CTRL+i
'
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 Código de Cliente que quiero seleccionar.
Una vez efectuado el filtrado, selecciono manualmente la celda con el Código
del Cliente y ejecuto la siguiente macro.
Sub SelecClientes()
'
' SelecClientes Macro
' Macro grabada el 20/08/2007 por Miguel
'
' Acceso directo: Ctrl+Mayús+S
'
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 "Facturación.xls!FacturaA"
Else
If usuario = "RI" And cliente <> "RI" Then
Application.Run "Facturación.xls!FacturaB"
Else
If usuario <> "RI" Then
Application.Run "Facturación.xls!FacturaC"
End If
End If
End If
Selection.Copy
End Sub
El contenido de la celda F1 es la posición del Usuario ante el I.V.A.(RI,
RNI, M)
El contenido de la celda G1 es la posición del Cliente ante el I.V.A.(RI,
RNI, M, CF)
El contenido de la celda F1 es la posición del Usuario ante el I.V.A.(RI,
RNI, M)
--
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)
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 __
> 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.