Filtrar datos de un libro sin abrirlo.

07/10/2003 - 17:34 por bernalko | Informe spam
Dispongo de una tabla excel donde cada linea contiene los datos de un
Boletín. En la columna 'E' se encuentra la provincia asociada a dicho
Boletin.
Debo de filtrar o seleccionar aquellos Boletines -filas- cuya
provincia -columna E- se encuentre dentro del conjunto de 9 provincias
que me pertenece -prov1, prov2,prov9-
Entendiendo que una provincia puede tener asociado más de un Boletin o
ninguno.
Desearía llevar esa seleccion a un nuevo libro, donde debe encontrarse
la macro que nos ocupa.

1ª pregunta:
¿Puede realizarse la operacion sin abrir el libro origen de los datos
-Boletines-?
2ª pregunta:
¿Puedo realizar un 'filtrado' -son 9 provincias- o debo utilizar un
metodo alternativo?

Toda sugerencia sera bienvenida ;)
Gracias y saludos a todos.

-Bernalko-

Preguntas similare

Leer las respuestas

#1 pepito
07/10/2003 - 19:14 | Informe spam
Si utilizas filtro tienes que abrir el libro. Creo que se puede hacer
(filtrar con 9 condiciones) utilizando el filtro avanzado. Léete la ayuda
'filtrar utilizando criterios avanzados' especialmente el apartado 'mas de
dos conjuntos de condiciones por columna'.

Sin 'abrir' el libro tendrías que hacerlo mediante programa y en ese caso
podrías grabar el resultado en otro libro.




escribió en el mensaje
news:
Dispongo de una tabla excel donde cada linea contiene los datos de un
Boletín. En la columna 'E' se encuentra la provincia asociada a dicho
Boletin.
Debo de filtrar o seleccionar aquellos Boletines -filas- cuya
provincia -columna E- se encuentre dentro del conjunto de 9 provincias
que me pertenece -prov1, prov2,prov9-
Entendiendo que una provincia puede tener asociado más de un Boletin o
ninguno.
Desearía llevar esa seleccion a un nuevo libro, donde debe encontrarse
la macro que nos ocupa.

1ª pregunta:
¿Puede realizarse la operacion sin abrir el libro origen de los datos
-Boletines-?
2ª pregunta:
¿Puedo realizar un 'filtrado' -son 9 provincias- o debo utilizar un
metodo alternativo?

Toda sugerencia sera bienvenida ;)
Gracias y saludos a todos.

-Bernalko-
Respuesta Responder a este mensaje
#2 Héctor Miguel
10/10/2003 - 17:29 | Informe spam
Hola, Bernalko !

¿Puede realizarse la operacion sin abrir el libro origen de los datos -Boletines-?



==> implica CONOCER 'de donde' y 'a donde' va la informacion :-))
==> puedes usar:
ADO (ActiveX Data Objects)
DAO (Data Access Objects)
El metodo "ExecuteExcel4Macro"

¿Puedo realizar un 'filtrado' -son 9 provincias- o debo utilizar un metodo alternativo?



==> Desastres pregunto alguna ocasion acerca de 'trabajar' con libros cerrados
[creo que] te sera posible adaptar las sugerencias de acuerdo a lo que planteas aqui

te 'pego' [un fragmento de] la consulta y la respuesta.

Saludos,
Héctor.

consulta ==> ... quisiera hacer en el libro cerrado ... lo que hago con un libro abierto: trabajar rangos (etc.) ...
... como me parece que hay demasiado, lo que más me urge sería:
- buscar en el libro cerrado un código y haciendo Offset(0,3) sumarle una cantidad a lo que haya.
- copiar una línea entera, o un rango, al final del libro cerrado
- traer una celda, una línea, o un rango de un libro cerrado



respuesta => Vamos por partes :-))
Lo de "escribir" en libros cerrados... (estoy "trabajando" en ello) ... PACIENCIA :-))
Lo de "tomar" datos de libros cerrados, después de algunas investigaciones "parece" que resulta más "recomendable"
ADO (ActiveX Data Objects) que DAO (Data Access Objects), así que...
_______
Opción 1: Tomar datos desde un libro cerrado (UNA REFERENCIA A LA VEZ con el método ExecuteExcel4Macro)
==> Primer paso, "Una Función" (es una manera muy "versátil") ...
Function ExtraerDeArchivo( _
ByVal DelDirectorio As String, _
ByVal DelArchivo As String, _
ByVal DeLaHoja As String, _
ByVal DeLaReferencia As String)
Dim TomarDe As String
If Right(DelDirectorio, 1) <> "\" Then DelDirectorio = DelDirectorio & "\"
TomarDe = "'" & DelDirectorio & "[" & DelArchivo & "]" & DeLaHoja & "'!" & _
Range(DeLaReferencia).Range("a1").Address(, , xlR1C1)
ExtraerDeArchivo = ExecuteExcel4Macro(TomarDe)
End Function

==> Segundo paso, "cómo llamarla" ...
Sub ExtraerUnDato()
Dim Ruta As String, Archivo As String, Hoja As String, Referencia As String, Mensaje as String
Ruta = "C:\Mis documentos": Archivo = "Pruebas.xls": Hoja = "Hoja3": Referencia = "b25"
Mensaje = " Directorio: " & Ruta & vbCr & _
" Archivo: " & Archivo & vbCr & _
" Hoja: " & Hoja & vbCr & _
"Referencia: " & UCase(Referencia) & vbCr & _
"Lectura de la referencia al libro NO ABIERTO:"
MsgBox Mensaje & vbCr & ExtraerDeArchivo(Ruta, Archivo, Hoja, Referencia)
End Sub
_______
Opción 2: Tomar datos desde un libro cerrado (UNA O VARIAS CELDAS A LA VEZ usando ADO)
==> MUY IMPORTANTE: Deberás establecer una referencia en el proyecto VBA (Herramientas -> Referencias...)
a la biblioteca de objetos ==> Microsoft ActiveX Data Objects x.x Library
==> Primer paso, "la Función" ...
Function TomarDatosDeArchivoCerrado(ArchivoDeOrigen As String, HojaDeDatos As String, RangoDeDatos As String, Títulos As Boolean)
Dim ConectarCon As ADODB.Connection, Ejecutar As ADODB.Command, HDR As String, _
Registros As ADODB.Recordset, Reg_n As Integer, Campo As Integer
Set ConectarCon = New ADODB.Connection
If Títulos = True Then HDR = "Yes" Else HDR = "No"
ConectarCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ArchivoDeOrigen & ";" & _
"Extended Properties=""Excel 8.0;" & _
"IMEX=1;" & _
"HDR=" & HDR & ";"";"
Set Ejecutar = New ADODB.Command
Ejecutar.ActiveConnection = ConectarCon
If HojaDeDatos = "" _
Then Ejecutar.CommandText = "SELECT * from `" & RangoDeDatos & "`" _
Else Ejecutar.CommandText = "SELECT * from `" & HojaDeDatos & "$" & RangoDeDatos & "`"
Set Registros = New ADODB.Recordset
Registros.Open Ejecutar, , adOpenKeyset, adLockOptimistic
If Registros.RecordCount > 1 Or Registros.Fields.Count > 1 _
Then MsgBox "Seleccionados..." & vbCr & _
Registros.Fields.Count & " campos (columnas) de " & vbCr & _
Registros.RecordCount & " registros (renglones)." _
Else MsgBox "Selección de UN registro unicamente."
Registros.MoveFirst
Do While Not Registros.EOF And Campo <= Registros.Fields.Count - 1
For Campo = 0 To Registros.Fields.Count - 1
For Reg_n = 1 To Registros.RecordCount
MsgBox "En el campo " & Campo + 1 & " {" & Registros.Fields(Campo).Name & "}" & vbCr & _
"Valor del registro " & Reg_n & ": " & Registros.Fields(Campo).Value
Registros.MoveNext
Next: Registros.MoveFirst: Next: Loop: ConectarCon.Close
Set ConectarCon = Nothing: Set Registros = Nothing: Set Ejecutar = Nothing
End Function

==> Segundo paso, "cómo llamarla"
==> Tiene dos "formas" (seleccionas la que necesites en el cuadro de mensaje):
==> usando el nombre de la hoja y el rango de datos, ó sólo una referencia a un rango con nombre ...
Sub ExtraerVariosDatos()
Dim Forma As VbMsgBoxResult
Forma = MsgBox("Selecciona la forma de consulta al archivo externo..." & vbCr & _
" SI = Usar Hoja y Rango de celdas" & vbCr & _
" NO = Usar Nombres (en rangos)", _
vbYesNo + vbQuestion, "Forma de consulta")
If Forma = vbYes _
Then TomarDatosDeArchivoCerrado "C:\Mis documentos\Pruebas.xls", "Hoja3", "a21:c25", False _
Else TomarDatosDeArchivoCerrado "C:\Mis documentos\Pruebas.xls", "", "NombreRango", False
End Sub

En esta segunda opción, el primer MsgBox "te dice" cuantas columnas y renglones tiene el rango ("de algo servirá")
y el segundo MsgBox "te dice" los valores que contiene cada celda en el rango (puedes cambiar los MsgBox por ... ??? )

Oops, creo que ya me excedí "un poquitín" :-)). Dejaremos los comentarios para después, ¿OK?
Respuesta Responder a este mensaje
#3 bernalko
13/10/2003 - 21:28 | Informe spam
Creo, Hector, que esta vez me has dejado KO ~X)

Voy a necesitar una excedencia en el trabajo para asimilar esta info.
Vamos a ver si recapitulando:

Opción 1: Tomar datos desde un libro cerrado (UNA REFERENCIA A LA VEZ con el método ExecuteExcel4Macro)



Con el 1er metodo puedo extraer una celda del libro cada vez. Lo cual
implica de antemano conocer el origen y el destino de dicho dato.

Opción 2: Tomar datos desde un libro cerrado (UNA O VARIAS CELDAS A LA VEZ usando ADO)
==> MUY IMPORTANTE: Deberás establecer una referencia en el proyecto VBA >Herramientas -> Referencias...)



Con el 2ª metodo (ADO) puedo extraer varios valores simultaneamente. Y
aquí empiezan mis dudas:

Then Ejecutar.CommandText = "SELECT * from `" & RangoDeDatos & "`" _
Else Ejecutar.CommandText = "SELECT * from `" & HojaDeDatos & "$" &



Utilizo el metodo SELECT * etc etc.
¿Estamos hablando de una instrucción SQL? O es un espejismo mio?

Si es asi, entonces podre 'filtrar' mediante SELECT unicamente
aquellos registros que me interesen ¿NO?

Por otro lado, debo indicar el 'rango' donde se encuentran los datos
en la hoja origen. Si este rango es variable, ¿no puedo indicarle que
filtre el 'UsedRange' de la hoja?

Nos vemos, (:-)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida