ERROR DE COMPILACIÓN: Es necesaria una expresión de constante

Pasa que estoy generando la exportación de consulta a excel y todo bien hasta que a la consulta le agrego un criterio a un campo que involucra a un cuadro de texto (txt_pru) que está en un formulario (pru) de la base de datos.

Cuando genero el informe no me da problemas, sí coge el valor insertado en el txt_pru sin embargo cuando quiero hacer la exportación a excel me sale una alerta con el error 3061 indicando "hay pocos parámetros. Se esperaba 1."

He buscado la solución a este problema cambiando el nombre de la consulta por todo el código SQL de la consulta y separando el txt_pru (que tiene el criterio) del código SQL para trabajarlo como variable pero me arroja otro error diciendo que es necesaria una expresión de constante.

Les dejo mi código con la esperanza de poder encontrar solución.

Sub Exporta()
On Error GoTo sol_err
Const nombreHoja As String = "C.3.1"
Const nombreTabla As String = "SELECT at.COD_ACC_TRA, l.FECHA, l.HORA, at.TIP_ACC, at.ILESOS, at.HERIDOS, at.FALLECIDOS, " & _
"at.TOTAL, at.EDA_AFE, at.DEPARTAMENTO, l.SUB_TRA, l.PROGRESIVA, l.SENTIDO, at.TIP_VIA, at.TIP_ACC_2, at.NUM_VEH, at.TIP_VEH_COM," & _
" at.TIP_TRA, at.AÑO_FAB, at.EDA_CON, at.PRO_CAU, at.HOR_INI, at.HOR_FIN, l.ACCIONES" & _
" FROM LLAMADA AS l INNER JOIN ACC_TRA AS [at] ON l.COD = at.COD_LLAM " & _
"WHERE (((l.FECHA) Like ' * ' & '[Forms]![pru]![txt_pru]'));" 'No existen datos para exportar
'"WHERE ((l.FECHA) Like ' * ' '" & [Forms]![pru]![txt_pru] & "');" ' Es necesaria una expresión de constante
'"WHERE (((l.FECHA) Like ' * ' & 'Forms!pru!txt_pru'));" 'No existen datos para exportar
''"WHERE (((l.FECHA) Like ' * ' " & lel & "));" 'Aquí declaro como parametro ByVal lel As String en Exporta y en la llamada del sub el parametro Forms,!pru![txt_pru] pero sigue diciendo que necesaria la expresión de una constante
'"WHERE (((l.FECHA) Like ' * ' & ""[Forms]![pru]![txt_pru]"" & ));" ' error el argumento no es opcional
Dim miExcel As Excel.Application
Dim rutaExcel As String
Dim i As Long, j As Long
Dim fld As Field
Dim rst As Recordset
'Construimos la ruta del Excel
rutaExcel = Application.CurrentProject.Path & "\Acci.xlsx"
'Creamos el recordset sobre la tabla -o consulta, si fuera el caso
Set rst = CurrentDb.OpenRecordset(nombreTabla)
'Si no hay registros en la consulta salimos
If rst.RecordCount = 0 Then
MsgBox "No existen datos para exportar", vbExclamation, "SIN DATOS"
Exit Sub
End If
'Creo el objeto Excel
Set miExcel = CreateObject("Excel.Application")
'Lo hago no visible
miExcel.Visible = True
'Abro el Excel seleccionado
miExcel.Workbooks.Open rutaExcel, True, False
'Sitúo el cursor en el reloj de arena porque el proceso puede ser largo
DoCmd.Hourglass True
'Inicializamos i y j
i = 0
j = 0
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el proceso
Do Until rst.EOF
'Recorremos los campos de la tabla o consulta
For Each fld In rst.Fields
miExcel.Worksheets(nombreHoja).Range("B8").Offset(i, j).Value = rst.Fields(fld.Name).Value
'Aumentamos una columna
j = j + 1
Next fld
'Aumentamos una fila
i = i + 1
'Reinicializamos j
j = 0
'Nos movemos al siguiente registro
rst.MoveNext
Loop 'Volvemos a situar el puntero en su posición normal
DoCmd.Hourglass False
'Lanzamos un mensaje de confirmación
MsgBox "Exportación realizada correctamente", vbInformation, "CORRECTO"
Exit Sub
sol_err:
'Volvemos a situar el puntero en su posición normal
DoCmd.Hourglass False
'Gestionamos los errores error que pudieran producirse
Select Case Err.Number
Case 9 'No existe la hoja
MsgBox "La hoja donde se quieren exportar los datos no" _
& " existe en el Excel", vbCritical, "ERROR"
Case 1004 'No existe el Excel
MsgBox "El Excel donde quiere exportar los datos no existe", _
vbCritical, "ERROR"
Case Else
MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description, _
vbCritical, "ERROR"
End Select
'Resume Salida
End Sub

2 respuestas

Respuesta
1

Tienes varios WHERE en la sentencia, debe ser uno solo y las condiciones unirlas ya sea con un AND o con un OR dependiendo de lo que quieres validar.

Respuesta
1

Aunque opino que no es la mejor forma para filtrar un campo de fecha, prueba a poner así el WHERE (sin las comillas simples, porque supongo que se trata de un campo de fecha y no de texto):

"WHERE (((l.FECHA) Like *" & [Forms]![pru]![txt_pru] & "));"

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

Me dice "Error de compilación. Es necesaria una expresión de constante" :( ¿Cuál crees que sea la forma adecuada para filtrar un campo fecha? Pasa que no se quiere filtrar por días sino por meses y/o años. Entonces en la cadena pueden ingresar '05/2018' y les arroja el resultado. 

Estoy atenta a tus sugerencias.

Dime una cosa:

Si comentas la linea del "on error goto sol_err": ¿En qué línea te marca el error? Porque igual, igual no es en la SQL...

Por otro lado, y para responder a tu pregunta, no hay problema en que uses LIKE para filtrar un campo fecha, porque funciona. Pero no es un sistema que a mí me guste (y de ahí el comentario).

Otra forma de hacerlo podría ser usar la función Format(), por ejemplo:

"WHERE ((Format(l.FECHA,'mm/yyyy')=" & [Forms]![pru]![txt_pru] & "));"

También tienes las funciones Month() y Year() que devuelven el mes (en número) y el año de la fecha que les pasas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas