query parametros para macro importar hacer ejecutar desde datos consultas consulta con sql excel vba excel-vba adodb

parametros - macros excel sql server



Acceso a la base de datos SQL en Excel-VBA (6)

¿Es esa una cadena de conexión adecuada?
¿Dónde se encuentra la instancia de SQL Server?

Deberá verificar que puede conectarse a SQL Server utilizando la cadena de conexión que especificó anteriormente.

EDITAR: Mire la propiedad del estado del conjunto de registros para ver si está abierto.
Además, cambie la propiedad CursorLocation a adUseClient antes de abrir el conjunto de registros.

Estoy copiando un fragmento de código de VBA de MSDN que me muestra cómo tomar los resultados de una consulta SQL en una hoja de Excel (Excel 2007):

Sub GetDataFromADO() ''Declare variables'' Set objMyConn = New ADODB.Connection Set objMyCmd = New ADODB.Command Set objMyRecordset = New ADODB.Recordset ''Open Connection'' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" objMyConn.Open ''Set and Excecute SQL Command'' Set objMyCmd.ActiveConnection = objMyConn objMyCmd.CommandText = "select * from myTable" objMyCmd.CommandType = adCmdText objMyCmd.Execute ''Open Recordset'' Set objMyRecordset.ActiveConnection = objMyConn objMyRecordset.Open objMyCmd ''Copy Data to Excel'' ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) End Sub

Ya he agregado la Biblioteca Microsoft ActiveX Data Objects 2.1 como referencia. Y esta base de datos es accesible.

Ahora, cuando ejecuto esta subrutina, tiene un error:

Error de tiempo de ejecución 3704: no se permite el funcionamiento cuando el objeto está cerrado.

En la declaración:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)

¿Alguna idea de por qué?

Gracias.


@firedrawndagger: para enumerar los nombres de campo / encabezados de columna iterar a través de la colección de Campos de conjunto de registros e insertar el nombre:

Dim myRS as ADODB.Recordset Dim fld as Field Dim strFieldName as String For Each fld in myRS.Fields Activesheet.Selection = fld.Name [Some code that moves to next column] Next


Agregue set nocount on el comienzo del proceso almacenado (si está en SQL Server). Acabo de resolver este problema en mi propio trabajo y fue causado por resultados intermedios, como "1203 Rows Affected" , que se cargaron en el Recordset que estaba tratando de usar.


Cambios sugeridos:

  • No invoque el método Execute del objeto Comando;
  • Establezca la propiedad Origen del objeto Recordset para que sea su objeto Command;
  • Invoque el método Open del objeto Recordset sin parámetros;
  • Quite los paréntesis de todo el objeto Recordset en la llamada a CopyFromRecordset ;
  • En realidad, declara tus variables :)

Código revisado:

Sub GetDataFromADO() ''Declare variables'' Dim objMyConn As ADODB.Connection Dim objMyCmd As ADODB.Command Dim objMyRecordset As ADODB.Recordset Set objMyConn = New ADODB.Connection Set objMyCmd = New ADODB.Command Set objMyRecordset = New ADODB.Recordset ''Open Connection'' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" objMyConn.Open ''Set and Excecute SQL Command'' Set objMyCmd.ActiveConnection = objMyConn objMyCmd.CommandText = "select * from mytable" objMyCmd.CommandType = adCmdText ''Open Recordset'' Set objMyRecordset.Source = objMyCmd objMyRecordset.Open ''Copy Data to Excel'' ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset End Sub


Estoy sentado frente a una computadora sin ninguno de los bits de software pertinentes, pero de memoria ese código parece estar mal. Estás ejecutando el comando pero descartando el RecordSet que devuelve objMyCommand.Execute .

Lo haría:

Set objMyRecordset = objMyCommand.Execute

... y luego pierde la parte "conjunto de registros abierto".


He agregado el Catálogo Inicial a su cadena de conexión. También abandoné la sintaxis ADODB.Command a favor de simplemente crear mi propia declaración SQL y abrir el conjunto de registros en esa variable.

Espero que esto ayude.

Sub GetDataFromADO() ''Declare variables'' Set objMyConn = New ADODB.Connection Set objMyRecordset = New ADODB.Recordset Dim strSQL As String ''Open Connection'' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" objMyConn.Open ''Set and Excecute SQL Command'' strSQL = "select * from myTable" ''Open Recordset'' Set objMyRecordset.ActiveConnection = objMyConn objMyRecordset.Open strSQL ''Copy Data to Excel'' ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) End Sub