consultar tablas dbf

08/03/2005 - 17:57 por fredy | Informe spam
hola grupo...
mi necesidad es la siguiente:

tengo una tabla dbf (FUENTE)que proviene de foxpro con mas de 900.000
registros
tengo una tabla de excel la cual tengo que completar con datos de la tabla
dbf (FUENTE) la llave entre estas tablas es un numero de identificacion de
usuario y un numero de factura, los datos que tengo que extraer de (FUENTE)
para cada usuario pueden ser de cero hasta 10 datos, como puedo hacer la
consulta de FUENTE desde excel para extraer los datos de cada usuario???( mi
duda se debe a que latabla FUENTE no me la abre excel por la cantidad de
registros)

muchas gracias por su colaboracion

Preguntas similare

Leer las respuestas

#11 fredy
11/03/2005 - 21:59 | Informe spam
Manuel pero me sale un error 424 ( se requiere un objeto), sera que falta
definir alguna variable ... no se.. que podra ser?

"Manuel Romero" escribió:

Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
> Manuel y como hago esto
> "prueba el metodo copyfromrecordset del objeto range. este metodo elimina
> el bucle do"
>
> Function CopyFromRecordset()
>
> no se como implementarlo para reeemplazar
>
> Do Until rs.EOF
> Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
> Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
> Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
> Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
> rs.MoveNext
>
> cnt = cnt + 1
> Loop
>
> muchas gracias
> "Manuel Romero" wrote:
>
> > 1) coloca el application.screenupdating=false y regresalo a true cuando
el
> > proceso termine
> >
> > 2) prueba el metodo copyfromrecordset del objeto range. este metodo
elimina
> > el bucle do
> >
> > las dos opciones no son excluyentes, intenta con ambas
> >
> > "fredy" escribió en el mensaje
> > news:
> > > si eso era muchas gracias Manuel : )
> > > es posible que este proceso sea mas rapido que el de la primera opcion
que
> > > me enviaste??
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Se me olvido (siempre me pasa, no se porque)
> > > >
> > > > rs.movenext
> > > >
> > > > antes del cnt=cnt+1
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > Hola Manuel
> > > > >
> > > > > estoy utilizando el codigo que me recomendaste ( aunque el
anterior me
> > > > > funciono el de datos externos lo adapte en una macro y me genero
los
> > > > > resultados que esperaba solo que se demoro casi 12 hrs para
extraer
> > los
> > > > datos
> > > > > de 9000 registros de la fuente de 900000 registros pero
bueno...ahora
> > > > busco
> > > > > tal vez un poco de rapidez en el proceso)
> > > > >
> > > > > PRIMERA SUGERENCIA DE MANUEL
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > > Application.StatusBar = "CONSULTA " & i & " DE 8577
MATRICULA
> > " &
> > > > > MATRICULA & " FACTURA " & FACTURA
> > > > >
> > > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > > "ODBC;DSN=dBASE
> > > > >
> > > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > > "
> > > > > _
> > > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > > .CommandText = Array( _
> > > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,
> > > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona
adiciona"
> > &
> > > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA &
"')
> > AND
> > > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > > )
> > > > >
> > > > > .Name = "Consulta desde dBASE Files_13"
> > > > > .FieldNames = True
> > > > > .RowNumbers = False
> > > > > .FillAdjacentFormulas = False
> > > > > .PreserveFormatting = True
> > > > > .RefreshOnFileOpen = False
> > > > > .BackgroundQuery = True
> > > > > .RefreshStyle = xlInsertDeleteCells
> > > > > .SavePassword = True
> > > > > .SaveData = True
> > > > > .AdjustColumnWidth = True
> > > > > .RefreshPeriod = 0
> > > > > .PreserveColumnInfo = True
> > > > >
> > > > > .Refresh BackgroundQuery:=False
> > > > > End With
> > > > >
> > > > > RESULTADO
> > > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > > 117095 4 56 3000
> > > > > 117095 4 27 10408
> > > > > 117095 4 39 291
> > > > > 117095 4 28 0
> > > > > 117095 4 40 0
> > > > > 117095 4 61 3086
> > > > > 117095 4 63 -3
> > > > >
> > > > > en la nueva sugerencia me extrae datos lo que pasa es que se queda
en
> > el
> > > > loop
> > > > >
> > > > > tengo:
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > >
> > > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &
"FROM
> > > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> > "WHERE(adiciona.ADI_MATR='"
> > > > &
> > > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > > adlockoptimistic, adcmdtext
> > > > > cnt = 1
> > > > > Do Until rs.EOF
> > > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > > cnt = cnt + 1
> > > > > Loop
> > > > >
> > > > > Next i
> > > > >
> > > > > rs.Close
> > > > > cn.Close
> > > > >
> > > > > RESULTADO
> > > > > pero me extrae solo un registro
> > > > >
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > .
> > ..
> > > > >
> > > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > > >
> > > > > Gracias!!
> > > > >
> > > > > "Manuel Romero" escribió:
> > > > >
> > > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects
2.X
> > > > primero
> > > > > > y escribe unas sentencias asi
> > > > > >
> > > > > > dim cn as new adodb.connection
> > > > > > dim rs as new adodb.recordset
> > > > > >
> > > > > > cn.open "cadena de conexion"
> > > > > > rs.open "select * from tutabla where campo=valor", cn,
> > adlockoptimistic,
> > > > > > adcmdtext
> > > > > > cnt=1
> > > > > > do until rs.eof
> > > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > > cnt=cnt+1
> > > > > > loop
> > > > > > rs.close
> > > > > > cn.close
> > > > > >
> > > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > > www.connectionstrings.com
> > > > > >
> > > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una
idea
> > de
> > > > como
> > > > > > es
> > > > > >
> > > > > > "fredy" escribió en el mensaje
> > > > > > news:
> > > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> > sinembargo
> > > > me
> > > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> > 900000¡
> > > > > > > registros)desde excel con una macro sin tener que realizar
este
> > > > proceso de
> > > > > > > consulta
> > > > > > >
> > > > > > > gracias! : )
> > > > > > >
> > > > > > > "fredy" wrote:
> > > > > > >
> > > > > > > > gracias manuel, pero resulta "imposible leer este archivo"
otra
> > > > > > sugerencia
> > > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > > >
> > > > > > > > "Manuel Romero" wrote:
> > > > > > > >
> > > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de
base
> > de
> > > > datos
> > > > > > > > >
> > > > > > > > > crea el origen de datos y sigue el asistente, ahi puedes
usar
> > > > > > criterios de
> > > > > > > > > seleccion e inclusive definir el orden de los registros a
> > traer
> > > > > > > > >
> > > > > > > > > "fredy" escribió en el
> > mensaje
> > > > > > > > > news:
> > > > > > > > > > hola grupo...
> > > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > > >
> > > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con
mas
> > de
> > > > > > 900.000
> > > > > > > > > > registros
> > > > > > > > > > tengo una tabla de excel la cual tengo que completar con
> > datos
> > > > de la
> > > > > > tabla
> > > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > > > identificacion de
> > > > > > > > > > usuario y un numero de factura, los datos que tengo que
> > extraer
> > > > de
> > > > > > > > > (FUENTE)
> > > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,
como
> > puedo
> > > > > > hacer la
> > > > > > > > > > consulta de FUENTE desde excel para extraer los datos de
> > cada
> > > > > > > > > usuario???( mi
> > > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel
por la
> > > > > > cantidad de
> > > > > > > > > > registros)
> > > > > > > > > >
> > > > > > > > > > muchas gracias por su colaboracion
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#12 fredy
11/03/2005 - 22:05 | Informe spam
Manuel que significa ws? sera por esto que me sale el error de requiere un
objeto?
muchas gracias

"Manuel Romero" escribió:

Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
> Manuel y como hago esto
> "prueba el metodo copyfromrecordset del objeto range. este metodo elimina
> el bucle do"
>
> Function CopyFromRecordset()
>
> no se como implementarlo para reeemplazar
>
> Do Until rs.EOF
> Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
> Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
> Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
> Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
> rs.MoveNext
>
> cnt = cnt + 1
> Loop
>
> muchas gracias
> "Manuel Romero" wrote:
>
> > 1) coloca el application.screenupdating=false y regresalo a true cuando
el
> > proceso termine
> >
> > 2) prueba el metodo copyfromrecordset del objeto range. este metodo
elimina
> > el bucle do
> >
> > las dos opciones no son excluyentes, intenta con ambas
> >
> > "fredy" escribió en el mensaje
> > news:
> > > si eso era muchas gracias Manuel : )
> > > es posible que este proceso sea mas rapido que el de la primera opcion
que
> > > me enviaste??
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Se me olvido (siempre me pasa, no se porque)
> > > >
> > > > rs.movenext
> > > >
> > > > antes del cnt=cnt+1
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > Hola Manuel
> > > > >
> > > > > estoy utilizando el codigo que me recomendaste ( aunque el
anterior me
> > > > > funciono el de datos externos lo adapte en una macro y me genero
los
> > > > > resultados que esperaba solo que se demoro casi 12 hrs para
extraer
> > los
> > > > datos
> > > > > de 9000 registros de la fuente de 900000 registros pero
bueno...ahora
> > > > busco
> > > > > tal vez un poco de rapidez en el proceso)
> > > > >
> > > > > PRIMERA SUGERENCIA DE MANUEL
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > > Application.StatusBar = "CONSULTA " & i & " DE 8577
MATRICULA
> > " &
> > > > > MATRICULA & " FACTURA " & FACTURA
> > > > >
> > > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > > "ODBC;DSN=dBASE
> > > > >
> > > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > > "
> > > > > _
> > > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > > .CommandText = Array( _
> > > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,
> > > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona
adiciona"
> > &
> > > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA &
"')
> > AND
> > > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > > )
> > > > >
> > > > > .Name = "Consulta desde dBASE Files_13"
> > > > > .FieldNames = True
> > > > > .RowNumbers = False
> > > > > .FillAdjacentFormulas = False
> > > > > .PreserveFormatting = True
> > > > > .RefreshOnFileOpen = False
> > > > > .BackgroundQuery = True
> > > > > .RefreshStyle = xlInsertDeleteCells
> > > > > .SavePassword = True
> > > > > .SaveData = True
> > > > > .AdjustColumnWidth = True
> > > > > .RefreshPeriod = 0
> > > > > .PreserveColumnInfo = True
> > > > >
> > > > > .Refresh BackgroundQuery:=False
> > > > > End With
> > > > >
> > > > > RESULTADO
> > > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > > 117095 4 56 3000
> > > > > 117095 4 27 10408
> > > > > 117095 4 39 291
> > > > > 117095 4 28 0
> > > > > 117095 4 40 0
> > > > > 117095 4 61 3086
> > > > > 117095 4 63 -3
> > > > >
> > > > > en la nueva sugerencia me extrae datos lo que pasa es que se queda
en
> > el
> > > > loop
> > > > >
> > > > > tengo:
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > >
> > > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &
"FROM
> > > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> > "WHERE(adiciona.ADI_MATR='"
> > > > &
> > > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > > adlockoptimistic, adcmdtext
> > > > > cnt = 1
> > > > > Do Until rs.EOF
> > > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > > cnt = cnt + 1
> > > > > Loop
> > > > >
> > > > > Next i
> > > > >
> > > > > rs.Close
> > > > > cn.Close
> > > > >
> > > > > RESULTADO
> > > > > pero me extrae solo un registro
> > > > >
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > .
> > ..
> > > > >
> > > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > > >
> > > > > Gracias!!
> > > > >
> > > > > "Manuel Romero" escribió:
> > > > >
> > > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects
2.X
> > > > primero
> > > > > > y escribe unas sentencias asi
> > > > > >
> > > > > > dim cn as new adodb.connection
> > > > > > dim rs as new adodb.recordset
> > > > > >
> > > > > > cn.open "cadena de conexion"
> > > > > > rs.open "select * from tutabla where campo=valor", cn,
> > adlockoptimistic,
> > > > > > adcmdtext
> > > > > > cnt=1
> > > > > > do until rs.eof
> > > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > > cnt=cnt+1
> > > > > > loop
> > > > > > rs.close
> > > > > > cn.close
> > > > > >
> > > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > > www.connectionstrings.com
> > > > > >
> > > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una
idea
> > de
> > > > como
> > > > > > es
> > > > > >
> > > > > > "fredy" escribió en el mensaje
> > > > > > news:
> > > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> > sinembargo
> > > > me
> > > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> > 900000¡
> > > > > > > registros)desde excel con una macro sin tener que realizar
este
> > > > proceso de
> > > > > > > consulta
> > > > > > >
> > > > > > > gracias! : )
> > > > > > >
> > > > > > > "fredy" wrote:
> > > > > > >
> > > > > > > > gracias manuel, pero resulta "imposible leer este archivo"
otra
> > > > > > sugerencia
> > > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > > >
> > > > > > > > "Manuel Romero" wrote:
> > > > > > > >
> > > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de
base
> > de
> > > > datos
> > > > > > > > >
> > > > > > > > > crea el origen de datos y sigue el asistente, ahi puedes
usar
> > > > > > criterios de
> > > > > > > > > seleccion e inclusive definir el orden de los registros a
> > traer
> > > > > > > > >
> > > > > > > > > "fredy" escribió en el
> > mensaje
> > > > > > > > > news:
> > > > > > > > > > hola grupo...
> > > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > > >
> > > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con
mas
> > de
> > > > > > 900.000
> > > > > > > > > > registros
> > > > > > > > > > tengo una tabla de excel la cual tengo que completar con
> > datos
> > > > de la
> > > > > > tabla
> > > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > > > identificacion de
> > > > > > > > > > usuario y un numero de factura, los datos que tengo que
> > extraer
> > > > de
> > > > > > > > > (FUENTE)
> > > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,
como
> > puedo
> > > > > > hacer la
> > > > > > > > > > consulta de FUENTE desde excel para extraer los datos de
> > cada
> > > > > > > > > usuario???( mi
> > > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel
por la
> > > > > > cantidad de
> > > > > > > > > > registros)
> > > > > > > > > >
> > > > > > > > > > muchas gracias por su colaboracion
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#13 fredy
11/03/2005 - 22:09 | Informe spam
Manuel he quitado el ws. ( supongo que debe ser algo como worksheet) y
funciono tiene este cambio alguna incidencia en el resultado?

"Manuel Romero" escribió:

Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
> Manuel y como hago esto
> "prueba el metodo copyfromrecordset del objeto range. este metodo elimina
> el bucle do"
>
> Function CopyFromRecordset()
>
> no se como implementarlo para reeemplazar
>
> Do Until rs.EOF
> Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
> Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
> Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
> Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
> rs.MoveNext
>
> cnt = cnt + 1
> Loop
>
> muchas gracias
> "Manuel Romero" wrote:
>
> > 1) coloca el application.screenupdating=false y regresalo a true cuando
el
> > proceso termine
> >
> > 2) prueba el metodo copyfromrecordset del objeto range. este metodo
elimina
> > el bucle do
> >
> > las dos opciones no son excluyentes, intenta con ambas
> >
> > "fredy" escribió en el mensaje
> > news:
> > > si eso era muchas gracias Manuel : )
> > > es posible que este proceso sea mas rapido que el de la primera opcion
que
> > > me enviaste??
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Se me olvido (siempre me pasa, no se porque)
> > > >
> > > > rs.movenext
> > > >
> > > > antes del cnt=cnt+1
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > Hola Manuel
> > > > >
> > > > > estoy utilizando el codigo que me recomendaste ( aunque el
anterior me
> > > > > funciono el de datos externos lo adapte en una macro y me genero
los
> > > > > resultados que esperaba solo que se demoro casi 12 hrs para
extraer
> > los
> > > > datos
> > > > > de 9000 registros de la fuente de 900000 registros pero
bueno...ahora
> > > > busco
> > > > > tal vez un poco de rapidez en el proceso)
> > > > >
> > > > > PRIMERA SUGERENCIA DE MANUEL
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > > Application.StatusBar = "CONSULTA " & i & " DE 8577
MATRICULA
> > " &
> > > > > MATRICULA & " FACTURA " & FACTURA
> > > > >
> > > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > > "ODBC;DSN=dBASE
> > > > >
> > > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > > "
> > > > > _
> > > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > > .CommandText = Array( _
> > > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,
> > > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona
adiciona"
> > &
> > > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA &
"')
> > AND
> > > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > > )
> > > > >
> > > > > .Name = "Consulta desde dBASE Files_13"
> > > > > .FieldNames = True
> > > > > .RowNumbers = False
> > > > > .FillAdjacentFormulas = False
> > > > > .PreserveFormatting = True
> > > > > .RefreshOnFileOpen = False
> > > > > .BackgroundQuery = True
> > > > > .RefreshStyle = xlInsertDeleteCells
> > > > > .SavePassword = True
> > > > > .SaveData = True
> > > > > .AdjustColumnWidth = True
> > > > > .RefreshPeriod = 0
> > > > > .PreserveColumnInfo = True
> > > > >
> > > > > .Refresh BackgroundQuery:=False
> > > > > End With
> > > > >
> > > > > RESULTADO
> > > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > > 117095 4 56 3000
> > > > > 117095 4 27 10408
> > > > > 117095 4 39 291
> > > > > 117095 4 28 0
> > > > > 117095 4 40 0
> > > > > 117095 4 61 3086
> > > > > 117095 4 63 -3
> > > > >
> > > > > en la nueva sugerencia me extrae datos lo que pasa es que se queda
en
> > el
> > > > loop
> > > > >
> > > > > tengo:
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > >
> > > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &
"FROM
> > > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> > "WHERE(adiciona.ADI_MATR='"
> > > > &
> > > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > > adlockoptimistic, adcmdtext
> > > > > cnt = 1
> > > > > Do Until rs.EOF
> > > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > > cnt = cnt + 1
> > > > > Loop
> > > > >
> > > > > Next i
> > > > >
> > > > > rs.Close
> > > > > cn.Close
> > > > >
> > > > > RESULTADO
> > > > > pero me extrae solo un registro
> > > > >
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > .
> > ..
> > > > >
> > > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > > >
> > > > > Gracias!!
> > > > >
> > > > > "Manuel Romero" escribió:
> > > > >
> > > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects
2.X
> > > > primero
> > > > > > y escribe unas sentencias asi
> > > > > >
> > > > > > dim cn as new adodb.connection
> > > > > > dim rs as new adodb.recordset
> > > > > >
> > > > > > cn.open "cadena de conexion"
> > > > > > rs.open "select * from tutabla where campo=valor", cn,
> > adlockoptimistic,
> > > > > > adcmdtext
> > > > > > cnt=1
> > > > > > do until rs.eof
> > > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > > cnt=cnt+1
> > > > > > loop
> > > > > > rs.close
> > > > > > cn.close
> > > > > >
> > > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > > www.connectionstrings.com
> > > > > >
> > > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una
idea
> > de
> > > > como
> > > > > > es
> > > > > >
> > > > > > "fredy" escribió en el mensaje
> > > > > > news:
> > > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> > sinembargo
> > > > me
> > > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> > 900000¡
> > > > > > > registros)desde excel con una macro sin tener que realizar
este
> > > > proceso de
> > > > > > > consulta
> > > > > > >
> > > > > > > gracias! : )
> > > > > > >
> > > > > > > "fredy" wrote:
> > > > > > >
> > > > > > > > gracias manuel, pero resulta "imposible leer este archivo"
otra
> > > > > > sugerencia
> > > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > > >
> > > > > > > > "Manuel Romero" wrote:
> > > > > > > >
> > > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de
base
> > de
> > > > datos
> > > > > > > > >
> > > > > > > > > crea el origen de datos y sigue el asistente, ahi puedes
usar
> > > > > > criterios de
> > > > > > > > > seleccion e inclusive definir el orden de los registros a
> > traer
> > > > > > > > >
> > > > > > > > > "fredy" escribió en el
> > mensaje
> > > > > > > > > news:
> > > > > > > > > > hola grupo...
> > > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > > >
> > > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con
mas
> > de
> > > > > > 900.000
> > > > > > > > > > registros
> > > > > > > > > > tengo una tabla de excel la cual tengo que completar con
> > datos
> > > > de la
> > > > > > tabla
> > > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > > > identificacion de
> > > > > > > > > > usuario y un numero de factura, los datos que tengo que
> > extraer
> > > > de
> > > > > > > > > (FUENTE)
> > > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,
como
> > puedo
> > > > > > hacer la
> > > > > > > > > > consulta de FUENTE desde excel para extraer los datos de
> > cada
> > > > > > > > > usuario???( mi
> > > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel
por la
> > > > > > cantidad de
> > > > > > > > > > registros)
> > > > > > > > > >
> > > > > > > > > > muchas gracias por su colaboracion
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#14 fredy
11/03/2005 - 22:51 | Informe spam
hola Manuel
primero agradecerle por la atencion a cada una de mis preguntas, ya la
consulta funciona perfecto... tengo una nueva pregunta la voy a exponer con
cuadros:

tengo la colsulta inicial ( con la que he molestado tanto) ahi tengo dos
campos que son "Pla_matr" y "pla_nfac" resulta que tengo por ejemplo un
registro con pla_matr 0370 y Pla_nfac‰, tengo una tabla "adiciona" que
para estos datos tiene los siguientes registros
matr nfac cod val
030370 89 63 4500
030370 89 56 6400
030370 89 45 89200...
.. en algunos casos tiene hasta 15 registros para cada matr y nfact (en
este caso 3)
como puedo hacer para que mediante una consulta como la que he estado
haciendo pueda llegar a algo como esto
matr nfac cod1 cod2 cod3 val1 val2 val3
30370 89 63 56 45 4500 6400 89200

es decir los registros (hasta 15 por cada pla_matr y nfac) que tengo en la
tabla "adiciona" en forma vertical , pasarlos a la consulta de forma
horizontal

es posible hacerlo de una forma rapida

porque lo que yo hice demora mucho tiempo y es hacer la consulta en
"adiciona" por matr y nfac, una a una, luego copiar los resultados y con
pegado especial transponerlos ( pero demora demasiado p.e 8500 registros en
12horas)

muchas gracias
"Manuel Romero" wrote:

Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
> Manuel y como hago esto
> "prueba el metodo copyfromrecordset del objeto range. este metodo elimina
> el bucle do"
>
> Function CopyFromRecordset()
>
> no se como implementarlo para reeemplazar
>
> Do Until rs.EOF
> Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
> Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
> Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
> Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
> rs.MoveNext
>
> cnt = cnt + 1
> Loop
>
> muchas gracias
> "Manuel Romero" wrote:
>
> > 1) coloca el application.screenupdating=false y regresalo a true cuando
el
> > proceso termine
> >
> > 2) prueba el metodo copyfromrecordset del objeto range. este metodo
elimina
> > el bucle do
> >
> > las dos opciones no son excluyentes, intenta con ambas
> >
> > "fredy" escribió en el mensaje
> > news:
> > > si eso era muchas gracias Manuel : )
> > > es posible que este proceso sea mas rapido que el de la primera opcion
que
> > > me enviaste??
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Se me olvido (siempre me pasa, no se porque)
> > > >
> > > > rs.movenext
> > > >
> > > > antes del cnt=cnt+1
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > Hola Manuel
> > > > >
> > > > > estoy utilizando el codigo que me recomendaste ( aunque el
anterior me
> > > > > funciono el de datos externos lo adapte en una macro y me genero
los
> > > > > resultados que esperaba solo que se demoro casi 12 hrs para
extraer
> > los
> > > > datos
> > > > > de 9000 registros de la fuente de 900000 registros pero
bueno...ahora
> > > > busco
> > > > > tal vez un poco de rapidez en el proceso)
> > > > >
> > > > > PRIMERA SUGERENCIA DE MANUEL
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > > Application.StatusBar = "CONSULTA " & i & " DE 8577
MATRICULA
> > " &
> > > > > MATRICULA & " FACTURA " & FACTURA
> > > > >
> > > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > > "ODBC;DSN=dBASE
> > > > >
> > > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > > "
> > > > > _
> > > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > > .CommandText = Array( _
> > > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,
> > > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona
adiciona"
> > &
> > > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA &
"')
> > AND
> > > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > > )
> > > > >
> > > > > .Name = "Consulta desde dBASE Files_13"
> > > > > .FieldNames = True
> > > > > .RowNumbers = False
> > > > > .FillAdjacentFormulas = False
> > > > > .PreserveFormatting = True
> > > > > .RefreshOnFileOpen = False
> > > > > .BackgroundQuery = True
> > > > > .RefreshStyle = xlInsertDeleteCells
> > > > > .SavePassword = True
> > > > > .SaveData = True
> > > > > .AdjustColumnWidth = True
> > > > > .RefreshPeriod = 0
> > > > > .PreserveColumnInfo = True
> > > > >
> > > > > .Refresh BackgroundQuery:=False
> > > > > End With
> > > > >
> > > > > RESULTADO
> > > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > > 117095 4 56 3000
> > > > > 117095 4 27 10408
> > > > > 117095 4 39 291
> > > > > 117095 4 28 0
> > > > > 117095 4 40 0
> > > > > 117095 4 61 3086
> > > > > 117095 4 63 -3
> > > > >
> > > > > en la nueva sugerencia me extrae datos lo que pasa es que se queda
en
> > el
> > > > loop
> > > > >
> > > > > tengo:
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > >
> > > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &
"FROM
> > > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> > "WHERE(adiciona.ADI_MATR='"
> > > > &
> > > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > > adlockoptimistic, adcmdtext
> > > > > cnt = 1
> > > > > Do Until rs.EOF
> > > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > > cnt = cnt + 1
> > > > > Loop
> > > > >
> > > > > Next i
> > > > >
> > > > > rs.Close
> > > > > cn.Close
> > > > >
> > > > > RESULTADO
> > > > > pero me extrae solo un registro
> > > > >
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > .
> > ..
> > > > >
> > > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > > >
> > > > > Gracias!!
> > > > >
> > > > > "Manuel Romero" escribió:
> > > > >
> > > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects
2.X
> > > > primero
> > > > > > y escribe unas sentencias asi
> > > > > >
> > > > > > dim cn as new adodb.connection
> > > > > > dim rs as new adodb.recordset
> > > > > >
> > > > > > cn.open "cadena de conexion"
> > > > > > rs.open "select * from tutabla where campo=valor", cn,
> > adlockoptimistic,
> > > > > > adcmdtext
> > > > > > cnt=1
> > > > > > do until rs.eof
> > > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > > cnt=cnt+1
> > > > > > loop
> > > > > > rs.close
> > > > > > cn.close
> > > > > >
> > > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > > www.connectionstrings.com
> > > > > >
> > > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una
idea
> > de
> > > > como
> > > > > > es
> > > > > >
> > > > > > "fredy" escribió en el mensaje
> > > > > > news:
> > > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> > sinembargo
> > > > me
> > > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> > 900000¡
> > > > > > > registros)desde excel con una macro sin tener que realizar
este
> > > > proceso de
> > > > > > > consulta
> > > > > > >
> > > > > > > gracias! : )
> > > > > > >
> > > > > > > "fredy" wrote:
> > > > > > >
> > > > > > > > gracias manuel, pero resulta "imposible leer este archivo"
otra
> > > > > > sugerencia
> > > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > > >
> > > > > > > > "Manuel Romero" wrote:
> > > > > > > >
> > > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de
base
> > de
> > > > datos
> > > > > > > > >
> > > > > > > > > crea el origen de datos y sigue el asistente, ahi puedes
usar
> > > > > > criterios de
> > > > > > > > > seleccion e inclusive definir el orden de los registros a
> > traer
> > > > > > > > >
> > > > > > > > > "fredy" escribió en el
> > mensaje
> > > > > > > > > news:
> > > > > > > > > > hola grupo...
> > > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > > >
> > > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con
mas
> > de
> > > > > > 900.000
> > > > > > > > > > registros
> > > > > > > > > > tengo una tabla de excel la cual tengo que completar con
> > datos
> > > > de la
> > > > > > tabla
> > > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > > > identificacion de
> > > > > > > > > > usuario y un numero de factura, los datos que tengo que
> > extraer
> > > > de
> > > > > > > > > (FUENTE)
> > > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,
como
> > puedo
> > > > > > hacer la
> > > > > > > > > > consulta de FUENTE desde excel para extraer los datos de
> > cada
> > > > > > > > > usuario???( mi
> > > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel
por la
> > > > > > cantidad de
> > > > > > > > > > registros)
> > > > > > > > > >
> > > > > > > > > > muchas gracias por su colaboracion
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#15 KL
12/03/2005 - 00:05 | Informe spam
Hola Fredy,

Falta definir la variable ws. Deberias asignarle una hoja, sustituirla con
referencia directa a una hoja concreta (p.ej. Sheets("Hoja1")) o quitar la
variable del todo.

Saludos,
KL

"fredy" wrote in message
news:
Manuel pero me sale un error 424 ( se requiere un objeto), sera que falta
definir alguna variable ... no se.. que podra ser?

"Manuel Romero" escribió:

Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los
campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
> Manuel y como hago esto
> "prueba el metodo copyfromrecordset del objeto range. este metodo
> elimina
> el bucle do"
>
> Function CopyFromRecordset()
>
> no se como implementarlo para reeemplazar
>
> Do Until rs.EOF
> Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
> Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
> Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
> Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
> rs.MoveNext
>
> cnt = cnt + 1
> Loop
>
> muchas gracias
> "Manuel Romero" wrote:
>
> > 1) coloca el application.screenupdating=false y regresalo a true
> > cuando
el
> > proceso termine
> >
> > 2) prueba el metodo copyfromrecordset del objeto range. este metodo
elimina
> > el bucle do
> >
> > las dos opciones no son excluyentes, intenta con ambas
> >
> > "fredy" escribió en el mensaje
> > news:
> > > si eso era muchas gracias Manuel : )
> > > es posible que este proceso sea mas rapido que el de la primera
> > > opcion
que
> > > me enviaste??
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Se me olvido (siempre me pasa, no se porque)
> > > >
> > > > rs.movenext
> > > >
> > > > antes del cnt=cnt+1
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > Hola Manuel
> > > > >
> > > > > estoy utilizando el codigo que me recomendaste ( aunque el
anterior me
> > > > > funciono el de datos externos lo adapte en una macro y me
> > > > > genero
los
> > > > > resultados que esperaba solo que se demoro casi 12 hrs para
extraer
> > los
> > > > datos
> > > > > de 9000 registros de la fuente de 900000 registros pero
bueno...ahora
> > > > busco
> > > > > tal vez un poco de rapidez en el proceso)
> > > > >
> > > > > PRIMERA SUGERENCIA DE MANUEL
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > > Application.StatusBar = "CONSULTA " & i & " DE 8577
MATRICULA
> > " &
> > > > > MATRICULA & " FACTURA " & FACTURA
> > > > >
> > > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > > "ODBC;DSN=dBASE
> > > > >
> > > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > > "
> > > > > _
> > > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > > .CommandText = Array( _
> > > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,
> > > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona
adiciona"
> > &
> > > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" &
> > > > > MATRICULA &
"')
> > AND
> > > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > > )
> > > > >
> > > > > .Name = "Consulta desde dBASE Files_13"
> > > > > .FieldNames = True
> > > > > .RowNumbers = False
> > > > > .FillAdjacentFormulas = False
> > > > > .PreserveFormatting = True
> > > > > .RefreshOnFileOpen = False
> > > > > .BackgroundQuery = True
> > > > > .RefreshStyle = xlInsertDeleteCells
> > > > > .SavePassword = True
> > > > > .SaveData = True
> > > > > .AdjustColumnWidth = True
> > > > > .RefreshPeriod = 0
> > > > > .PreserveColumnInfo = True
> > > > >
> > > > > .Refresh BackgroundQuery:=False
> > > > > End With
> > > > >
> > > > > RESULTADO
> > > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > > 117095 4 56 3000
> > > > > 117095 4 27 10408
> > > > > 117095 4 39 291
> > > > > 117095 4 28 0
> > > > > 117095 4 40 0
> > > > > 117095 4 61 3086
> > > > > 117095 4 63 -3
> > > > >
> > > > > en la nueva sugerencia me extrae datos lo que pasa es que se
> > > > > queda
en
> > el
> > > > loop
> > > > >
> > > > > tengo:
> > > > >
> > > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > >
> > > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &
"FROM
> > > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> > "WHERE(adiciona.ADI_MATR='"
> > > > &
> > > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > > adlockoptimistic, adcmdtext
> > > > > cnt = 1
> > > > > Do Until rs.EOF
> > > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > > cnt = cnt + 1
> > > > > Loop
> > > > >
> > > > > Next i
> > > > >
> > > > > rs.Close
> > > > > cn.Close
> > > > >
> > > > > RESULTADO
> > > > > pero me extrae solo un registro
> > > > >
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > 117095 4 4 56 3000
> > > > > .
> > ..
> > > > >
> > > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > > >
> > > > > Gracias!!
> > > > >
> > > > > "Manuel Romero" escribió:
> > > > >
> > > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data
> > > > > > Objects
2.X
> > > > primero
> > > > > > y escribe unas sentencias asi
> > > > > >
> > > > > > dim cn as new adodb.connection
> > > > > > dim rs as new adodb.recordset
> > > > > >
> > > > > > cn.open "cadena de conexion"
> > > > > > rs.open "select * from tutabla where campo=valor", cn,
> > adlockoptimistic,
> > > > > > adcmdtext
> > > > > > cnt=1
> > > > > > do until rs.eof
> > > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > > cnt=cnt+1
> > > > > > loop
> > > > > > rs.close
> > > > > > cn.close
> > > > > >
> > > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > > www.connectionstrings.com
> > > > > >
> > > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar
> > > > > > una
idea
> > de
> > > > como
> > > > > > es
> > > > > >
> > > > > > "fredy" escribió en el
> > > > > > mensaje
> > > > > > news:
> > > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> > sinembargo
> > > > me
> > > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> > 900000¡
> > > > > > > registros)desde excel con una macro sin tener que realizar
este
> > > > proceso de
> > > > > > > consulta
> > > > > > >
> > > > > > > gracias! : )
> > > > > > >
> > > > > > > "fredy" wrote:
> > > > > > >
> > > > > > > > gracias manuel, pero resulta "imposible leer este
> > > > > > > > archivo"
otra
> > > > > > sugerencia
> > > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > > >
> > > > > > > > "Manuel Romero" wrote:
> > > > > > > >
> > > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de
base
> > de
> > > > datos
> > > > > > > > >
> > > > > > > > > crea el origen de datos y sigue el asistente, ahi
> > > > > > > > > puedes
usar
> > > > > > criterios de
> > > > > > > > > seleccion e inclusive definir el orden de los registros
> > > > > > > > > a
> > traer
> > > > > > > > >
> > > > > > > > > "fredy" escribió en
> > > > > > > > > el
> > mensaje
> > > > > > > > > news:
> > > > > > > > > > hola grupo...
> > > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > > >
> > > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro
> > > > > > > > > > con
mas
> > de
> > > > > > 900.000
> > > > > > > > > > registros
> > > > > > > > > > tengo una tabla de excel la cual tengo que completar
> > > > > > > > > > con
> > datos
> > > > de la
> > > > > > tabla
> > > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero
> > > > > > > > > > de
> > > > > > identificacion de
> > > > > > > > > > usuario y un numero de factura, los datos que tengo
> > > > > > > > > > que
> > extraer
> > > > de
> > > > > > > > > (FUENTE)
> > > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,
como
> > puedo
> > > > > > hacer la
> > > > > > > > > > consulta de FUENTE desde excel para extraer los datos
> > > > > > > > > > de
> > cada
> > > > > > > > > usuario???( mi
> > > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel
por la
> > > > > > cantidad de
> > > > > > > > > > registros)
> > > > > > > > > >
> > > > > > > > > > muchas gracias por su colaboracion
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida