CodigoVisualBasic para Controlar tiempo máximo de espera en consulta desde Excel a base datos Access

Estoy con un proyecto en excel, de un pequeño programa inventarios multiusuario, al que se conectan varios equipo en red a una base datos Access.

Mi pregunta es como asignar un tiempo máximo de espera de 5 o 10 segundos mediante código visual basic, cuando me conecto desde Excel a una base datos Access para realizar consultas, 3 o 4 equipos se conectan a la misma base datos, el problema es que excel, algunas veces/no siempre, se queda trabado o congelado por 1 o 2minutos, mientras se conecta y realiza la consulta a la base datos Access (parece que Excel espera hasta que la base datos Access este disponible en red), y quisiera saber como asignar el tiempo de espera máximo, para que en caso supere ese tiempo, detenga la consulta y pregunte al usuario si quiere volver a intentar hacer la consulta.

Espero puedan ayudarme (incluso puedo pasar la base datos de Access a MYSQL, en caso se requiera para asignar este tiempo de espera desde Excel, en el negocio están usando excel 2003, para no tener que instalar más programas.

1 respuesta

Respuesta
1

Justo hace un momento acabo de responder una pregunta que es muy parecida a la tuya.

No sé si te funcionará porque en la situación que tu describes exactamente no lo he probado.

Public Function EsperaUnPoco(NumSegundos As Variant)

Dim TiempoEspera As Variant, Inicio As Variant
On Error GoTo Err_EsperaUnpoco

TiempoEspera = NumSegundos
Inicio = Timer
Do While Timer < Inicio + TiempoEspera
DoEvents
Loop

'Aquí debes hacer el sondeo: Si se ha hecho el proceso, seguir

If .............. Then

'Nada

Else

MsgBox "................

End If

Exit_EsperaUnpoco:
Exit Function
Err_EsperaUnpoco:
MsgBox Err.Number & " - " & Err.Description
Resume Exit_EsperaUnpoco
End Function

En tu caso, el sondeo y mensaje debes hacerlo después del "Loop", con el If Then que te indico...

Y para llamar a la Función:

Call EsperaUnPoco(s) >> Siendo "s" el Numero de Segundos.

Gracias por responder...

Tengo una duda ,como colocarias tu funcion dentro una macro para realizar la consulta a la base de datos...

...y en caso que excel tarde mas de 10segundos se cancele la consulta?

Aca te dejo el codigo que utilizo para cargar la base datos en excel

------------------------------------------------------------------------------------------------------------

Sub actualizar_datos()

'CONEXION Y CONSULTA BASE DE DATOS
Dim path_Bd As String
Dim cnn As New ADODB.Connection
Dim recSet As New ADODB.Recordset
Dim strDB, strSQL As String
Dim strTabla As String
Dim lngCampos As Long
Dim i As Long
Dim bBien As Boolean
On Error GoTo ControlError
bBien = True
'CONECTAMOS CON LA BASE DE DATOS DE ACCESS Y ABRIMOS CONSULTA
path_Bd = ThisWorkbook.Path & "\database.accdb"
cnn.Provider = "Microsoft.ACE.OLEDB.12.0"
cnn.Properties("Data Source") = path_Bd
cnn.Properties("Jet OLEDB:Database Password") = ""
cnn.Open
strTabla = "BASE"
strSQL = "SELECT * FROM " & strTabla & " "
recSet.Open strSQL, cnn

'COPIAR LOS DATOS A LA HOJA
Worksheets("Hoja1").Select
'LIMPIAMOS DATOS DE EXCEL ANTES DE ACTUALIZAR
limpiardatos = Sheets("Hoja1").Range("A" & Rows.Count).End(xlUp).Row
Sheets("Hoja1").Range("A3:z" & limpiardatos).ClearContents
'GRABAMOS REGISTROS BASE DE DATOS DE ACCESS EN EXCEL
Sheets("Hoja1").Cells(3, 1).CopyFromRecordset recSet
'COPIAMOS RÓTULOS DE CAMPOS
lngCampos = recSet.Fields.Count
For i = 0 To lngCampos - 1
Sheets("Hoja1").Cells(2, i + 1).Value = recSet.Fields(i).Name
Next
'DESCONECTAMOS
recSet.Close: Set recSet = Nothing
cnn.Close: Set cnn = Nothing
Sheets("Hoja1").Select
MsgBox "LECTURA DE BASE DE DATOS ,EXITOSA!."
Salir:
If Not bBien Then
MsgBox "NO SE HA PODIDO CONECTAR A BASE DATOS" _

& ", INTÉNTALO MÁS TARDE."
End If
On Error Resume Next
recSet.Close: Set recSet = Nothing
cnn.Close: Set cnn = Nothing
Exit Sub
ControlError:
MsgBox Err.Number & " - " & Err.Description
bBien = False
Resume Salir

End Sub

------------------------------------------------------------------------------------------------------------

Y este otro codigo para realizar busquedas en la base datos Access:

------------------------------------------------------------------------------------------------------------

Sub BUSCAR()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim path_Bd As String
Dim strDB, strSQL As String
Dim strTabla As String
Dim i As Long
Dim bBien As Boolean
On Error GoTo ControlError
bBien = True
'CONECTAMOS CON LA BASE DE DATOS DE ACCESS Y ABRIMOS CONSULTA
path_Bd = ThisWorkbook.Path & "\database.accdb"
conn.Provider = "Microsoft.ACE.OLEDB.12.0"
conn.Properties("Data Source") = path_Bd
conn.Properties("Jet OLEDB:Database Password") = ""
conn.Open
strTabla = "BASE"
strSQL = "SELECT * FROM " & strTabla & " "
rst.Open strTabla, conn, adOpenKeyset, adLockOptimistic
'REVIZAMOS EXISTA UN TEXTO A BUSCAR
Dim VALOR123 As String
VALOR123 = "%" & CStr(Hoja1.Range("D1").Value) & "%"
If VALOR123 = "" Or Len(VALOR123) < 3 Then
MsgBox ("Escriba el nombre a buscar ,mayor a 3 caracteres")
GoTo desconectar
End If
'LIPIAMOS DATOS DE EXCEL ANTES DE ACTUALIZAR
limpiardatos = Sheets("Hoja1").Range("A" & Rows.Count).End(xlUp).Row
Sheets("Hoja1").Range("A3:z" & limpiardatos).ClearContents
'REALIZAMOS LA CONSULTA
Dim lngcampos, FIL: lngcampos = rst.Fields.Count: FIL = 2
rst.Find "NOMBRE LIKE " & VALOR123 & ""
Do Until rst.EOF
FIL = FIL + 1
For i = 0 To lngcampos - 1
Sheets("Hoja1").Cells(FIL, i + 1).Value = rst.Fields(i).Value
Next
rst.Find "NOMBRE LIKE " & VALOR123 & "", SkipRecords:=1, SearchDirection:=adSearchForward
Loop
'COPIAMOS RÓTULOS
For i = 0 To lngcampos - 1
Sheets("Hoja1").Cells(2, i + 1).Value = rst.Fields(i).Name
Next
desconectar:
rst.Close
Set rst = Nothing
conn.Close
Set conn = Nothing

Salir:
If Not bBien Then
MsgBox "NO SE HA PODIDO ACTUALIZAR LA BASE DE DATOS, INTÉNTALO MÁS TARDE."
End If
On Error Resume Next
recSet.Close: Set recSet = Nothing
cnn.Close: Set cnn = Nothing
Exit Sub
ControlError:
MsgBox Err.Number & " - " & Err.Description
bBien = False
Resume Salir
End Sub

------------------------------------------------------------------------------------------------------------

Pero la verdad no comprendo ,en que parte del codigo debo insertar tu funcion de tiempo y como cancelar la consulta en caso de que excel tarde más de 10segundos ,la base de datos contiene 10mil registros con 20columnas/campos

Se agradece cualquier sugerencia ,incluso si tengo que cambiar todo el  codigo.

Viendo el Código creo que lo más adecuado es lo siguiente.
Inmediatamente después de >>
bBien As Boolean

‘Declaras éstas Variables
Dim TiempoCero As Double, TiempoFin As Double, TiempoProceso As Double
Después de >>
On Error GoTo ControlError
‘Inicializas las Variables a Cero
TiempoCero = 0
TiempoFin = 0
TiempoProceso = 0

'Ahora tomamos la lectura del Timer en la Variable TiempoCero
TiempoCero = Timer

Inmediatamente después de >>
RecSet.Open StrSQL, cnn

‘Pones éste Código
‘*****
Do Until TiempoProceso < 30’Aquí pones los segundos que quieras
TiempoFin = Timer
TiempoProceso = CInt(TiempoFin - TiempoCero)
         If cnn.State = adStateOpen Then
                'No hacemos nada y seguimos el Proceso
          Else
               MsgBox "No se ha podido establecer Conexión", vbCritical, "SALIDA DE PROCEDIMIENTO"
               Exit Sub
          End If
           DoEvents
Loop
'*****

Por último y de una forma provisional para controlar el Proceso. Por rutina na hace falta
Inmediatamente después de >>
MsgBox "LA BASE DE DATOS HA SIDO ACTUALIZADA."
‘Pones éste Código
‘***********
If cnn.State = adStateOpen Then
            MsgBox "Algo ha ocurrido en el Proceso porque la Conexión sigue abierta", vbCritical, "ERROR EN EL PROCESO"
Else
           MsgBox "Después del proceso, la Conexión está cerrada", vbInformation, "PROCESO COMPLETO"
           TiempoFin = Timer
            TiempoProceso = CInt(TiempoFin - TiempoCero)
            MsgBox "Proceso terminado con éxito." & vbCrLf & "La duracion ha sido de: " & TiempoProceso & " Segundos", vbInformation, "CONTROL DE PROCESO"
End If
'*************
Como no he podido reproducir tu situación, éste Código no lo he probado.
Si que lo he repasado y debe funcionar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas