Error al convertir el tipo de datos varchar a numeric

Tengo un form en excel a partir del cual quiero importar una tabla de sql

Dentro del form existen varios textbox por los que que deseo filtrar la tabla.

Si hago un select así todo ok

Select * from tabla where campo=2011 puesto que no utilizo el textbox

Lo que quiero hacer es incluir en la consulta esos textbox como parámetros del select pero estoy bastante perdido.

¿Podrían decirme cómo hacerlo?

La tabla es esta

y el form 

Los textbox que quiero incluir como parámetros son Txtano(ejercicio) Txtdesdemes Txthastames

He realizado algunas pruebas pero no soy capaz de solucionarlo, uno de los problemas era que utilizando el textbox txtano me daba error al convertir varchar a numeric.

1 Respuesta

Respuesta
1

Inténtalo así:

Select * from tabla where campo=CInt(Txtano.Value)

Hola Marcial, gracias por tu respuesta

He aplicado lo anterior pero me da este mensaje:

Supongo que estás trabajando con VBA, ¿es así?. Prueba así:

TextBox2.Value = VBA.CInt(TextBox1.Value)

Disculpa,

Select * from tabla where campo=VBA.CInt(TextBox1.Value)

Apuntar que la parte donde se ve la consulta con el select es otro textbox llamado txtconsulta.

Ahora me da esto

Esta claro, esa instrucción es SQL, no VBA por lo que no encuentra la función de conversión. Lo que debes utilizar es:

Select * from tabla where campo=CAST(TextBox1.Value AS INT)

Ahora me da lo siguiente:

Ha ocurrido un error. El identificador formado por varias partes "Txtano.value" no se pudo enlazar.

¿Tendrá que ver que la consulta está dentro de un textbox llamado Txtconsulta?

Adjunto código por si le dice algo al respecto

Private Sub Txtusuario_Change()
Sheets(1).Range("B2") = Me.Txtusuario.Value
End Sub
Private Sub Txtconsulta_Change()
Sheets(1).Range("B5") = Me.Txtconsulta.Value
End Sub
Private Sub Txtano_Change()
Sheets(1).Range("B6") = Me.Txtano.Value
End Sub
Private Sub Txtmesdesde_Change()
Sheets(1).Range("B7") = Me.Txtmesdesde.Value
End Sub
Private Sub Txtmeshasta_Change()
Sheets(1).Range("B8") = Me.Txtmeshasta.Value
End Sub
Private Sub UserForm_Initialize()
With Me
    .Txtservidor.Value = Sheets(1).Range("B1").Value
    .Txtbase.Value = Sheets(1).Range("B4").Value
    .Txtusuario.Value = Sheets(1).Range("B2").Value
    .Txtpass.Value = Sheets(1).Range("B3").Value
    .Txtano.Value = Sheets(1).Range("B6").Value
    .Txtmesdesde.Value = Sheets(1).Range("B7").Value
    .Txtmeshasta.Value = Sheets(1).Range("B8").Value
    .Txtconsulta.Value = Sheets(1).Range("B5").Value
End With
End Sub

Esta es la funcion de conexion

Function Ejecutar(Sql As String, Hoja As String)
    On Error GoTo ErrorHandler
    Dim cn As Object
    ' crea un objeto Connection
    Set cn = CreateObject("ADODB.Connection")
    ' IMPORTANTE: Indicar la cadena de conexión a usar
    servidor = Sheets(1).Range("servidor")
    base = Sheets(1).Range("base")
    Usuario = Sheets(1).Range("usuario")
    pass = Sheets(1).Range("pass")
    Conexion = "Provider=SQLOLEDB.1;" & _
               "Password=" & pass & ";" & _
               "Persist Security Info=True;" & _
               "User ID=" & Usuario & ";" & _
               "Initial Catalog=" & base & ";" & _
               "Data Source=" & servidor
    'cn.ConnectionString = "Provider=SQLOLEDB.1;Password=s3cr3t0;Persist Security Info=True;User ID=sa;Initial Catalog=Cobranza;Data Source= 192.168.2.6"
    cn.ConnectionString = Conexion
    ' verifica que los parámetros no estén vacios
    If Sql <> vbNullString And Hoja <> vbNullString Then
        ' variable para al rec de ado
        Dim rst As Object
        ' abre la conexión a la base de datos
        cn.Open
        ' crea un nuevo objeto recordset
        Set rst = CreateObject("ADODB.Recordset")
        ' Ejecuta el sql para llenar el recordset
        rst.Open Sql, cn, 1, 3
        ' variables para los indices de las filas y columnas
        c = 0
        f = 0
        ' recorre las columnas, añade el nombre del campo al encabezado en la de DATOS
        For i = 0 To rst.Fields.Count - 1
            Sheets(2).Range(Chr(i + 65) & f + 1).Value = rst.Fields(i).Name
        Next
        f = f + 1
        ' recorre todo el recordset hasta el final
        Do While Not rst.EOF
            ' recorre los campos en el registro actual del recordset para recuperar el dato
            For i = 0 To rst.Fields.Count - 1
                ' añade el valor a la celda en la de DATOS
                Sheets(2).Range(Chr(c + 65) & _
                                f + 1).Value = rst.Fields(c)
                c = c + 1
            Next
            ' resetea el indice de las columnas
            c = 0
            ' Referencia al registro actual (incrementa )
            f = f + 1
            ' Siguiente registro
            rst.MoveNext
        Loop
        ' cierra y descarga las referencias
        On Error Resume Next
        rst.Close
        cn.Close
        Set cn = Nothing
        Set rst = Nothing
    End If
    Call Macro1
    Exit Function
ErrorHandler:
    MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, "ATENCION"
End Function

lo que hago es guardar en una hoja llamada consulta los valores del form

¿Me puedes mostrar el código donde llamas a la función Ejecutar?

Private Sub CommandButton1_Click()
Call Ejecutar(Sheets(1).Range("B5"), "Hoja2")
MsgBox "PROCESO FINALIZADO", vbOKOnly, "Información"
End Sub

Prueba a realizar esto:

Private Sub CommandButton1_Click()
cadena="Select * from tabla where campo=" & CInt(Txtano.Value)
Call Ejecutar(cadena, "Hoja2")
MsgBox "PROCESO FINALIZADO", vbOKOnly, "Información"
End Sub

Y dime.

Buenos días:

Me da el siguiente Mensaje:

Error de compilación. El tipo de argumento Byref no coincide

y me marca en amarillo PRIVATE SUB COMMANDBUTTON1_CLIC()

Mea culpa, no definir el tipo de variable de"cadena". Prueba a definir cadena como string. No hace falta el Cint, puesto que el valor del año lo va a meter en la cadena aunque no pasa nada por que esté. Lo que si deberías hacer, es controlar que sólo se introducen números en el textbox del año. Si no sabes cómo hacerlo, abre una nueva pregunta y te lo pongo allí.

Private Sub CommandButton1_Click()
Dim cadena As String
cadena="Select * from tabla where campo=" & CInt(Txtano.Value)
Call Ejecutar(cadena, "Hoja2")
MsgBox "PROCESO FINALIZADO", vbOKOnly, "Información"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas