Conexión de Datos Excel a Exel

A los integrantes de este foro, en esta ocasión recurro a Uds para solicitar su ayuda de que manera podría realizar una conexión de datos es decir de un Excel a otro Excel sin necesidad de abrir el archivo origen y sin la necesidad de ser importados dichos datos, como se aprecia en el código que a continuación detallo y lo que hice fue adaptarlo a mi necesidad de trabajo, pero realizando la importación de datos aun determinado archivo utilizando Herramienta OLEBD y SQL, y lo que pretendo es que simplemente lea los datos y realice sus cálculos (formulas) y evitar la famosa vinculación de datos externos y estar siempre actualizando el vínculo de datos, o es imprescindible realizar la importación de datos.

Código de macro:

Sub CONECTAR_BBDD_EXCEL()
'Definimos las variables
Dim i As Double
Dim dfecha As Variant
Dim Dataread As ADODB.Recordset, obSQL As String
Dim cnn As ADODB.Connection
Dim bBien As Boolean

'Limpiamos información de la hoja "DATOS"
Actualizar = Application.CountA(Worksheets("IMPORT").Range("a:a"))
If Actualizar > 0 Then
Worksheets("IMPORT").Range("A1:U" & Actualizar).ClearContents
End If

'Si se produce un error en el proceso de importación, la macro finalizará y mostrará mensaje
On Error GoTo ControlError
bBien = True

'Iniciamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "DATA SOURCE=" & ThisWorkbook.Path & "\EJEMPLO_IMPORTAR.xls"
.Properties("Extended Properties") = "Excel 12.0; HDR=YES"
.Open
End With

'Indicamos los parámetros de la consulta SQL para importar la tabla completa
obSQL = "SELECT [DATOS$].*" & "FROM [DATOS$] "

'Procedemos a grababar los datos de la consulta
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'Grabamos los cabeceros de cada columna
For i = 0 To Dataread.Fields.Count - 1
If IsDate(Dataread.Fields(i).Name) Then
dfecha = CDate(Dataread.Fields(i).Name)
Else
dfecha = Dataread.Fields(i).Name
End If
Worksheets("IMPORT").Cells(1, i + 1) = dfecha
Next
'Copiamos los datos de la consulta
With Worksheets("IMPORT").Select
Worksheets("IMPORT").Cells(2, 1).CopyFromRecordset Dataread
End With

With Cells
'Ajustamos ancho de columnas.
.EntireColumn.AutoFit
'Alineamos al centro los datos.
.HorizontalAlignment = xlLeft
End With

Salir:
On Error Resume Next
'Si existe un error de conexión mostraremos el siguiente mensaje
If Not bBien Then
MsgBox "NO SE HA PODIDO ACTUALIZAR LA BASE DE DATOS, INTÉNTALO MÁS TARDE."
End If
Exit Sub

'Salimos del proceso
ControlError:
bBien = False
Resume Salir
End Sub

Respuesta
2

[Hola

Pues la macro que has enviado usa ADO y no vincula los datos, entonces ¿cuál es el problema?

Abraham Valencia

Buenos días amigo, efectivamente la macro no realiza ninguna vinculación, lo de la vinculación de datos lo realizo entre otros archivos por ejemplo archivo Sort Trab con la formula (=SI.ERROR(BUSCARV(A3;'D:\AÑO 2018 COSMOS\SEMANA 15 DEL 11 AL 15 DE ABRIL\[BASES DE DATOS.xlsm]Hoja1'!$B$2:$U$4513;9;FALSO);"")), busco el valor requerido del archivo BASE DE DATOS y por eso si hay alguna mancera de realizar la lectura de datos o necesariamente debe ser importados y hacer la Conexión de Datos, y evitar el molestoso mensaje:

Saludos.

Te entendí mejor y sí, se puede hacer también con ADO pero la cosa es modificar la cadena SQL que se usa. Hay que usar "where" pero no sé si conoces el lenguaje. En mi blog tengo un ejemplo sobre "Combobox" dependientes en donde uso lenguaje SQL y ADO. Dale una revisada, si bien trabaja sobre el mismo archivo, es casi lo mismo:

https://abrahamexcel.blogspot.com/ 

Saludos]

Abraham Valencia

Conforme amigo, voy a recibir el blog y cualquier duda, o te dejo un mensaje por este medio o en todo podría subir mis archivos, pero luego de revisar.

Gracias.

Ya nos contarás como te fue.

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas