Quiero aprender Visual Basic, pero muchas veces tengo problemas para entender los códigos

Hola mauricio, estoy intentando aprender VBA y hay algunas cosas que no comprendo cuando realizas los códigos. Yo se que podrás aclararme muchas inquietudes. Hace poco hiciste un código para trabajar con tiempo, cuando lo trate de ejecutar, la línea:
TimerID = SetTimer(0, 0, Intervalo, AddressOf TimerExecute)
Me aparece en rojo y no corre la Macro. Otra pregunta HWnd, nlDEvent, uElapse, ¿lpTimerFunc son variables que se declaran pero no se utilizan en el código porque? ¿O si se utilizan?. Para que usas ByVal y porque el Numero
1000 en la expresión IniciarTimer 1000
Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "User32" (ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
Dim TimerID As Long
Private Sub IniciarTimer(ByVal Intervalo As Long)
#If Win32 Then
TimerID = SetTimer(0, 0, Intervalo, AddressOf TimerExecute)
#End If
End Sub
Public Sub DetenerReloj()
KillTimer 0, TimerID
End Sub
Private Sub TimerExecute()
Dim strReloj As String
On Error Resume Next
strReloj = Format(Now, "HH:mm:ss")
Range("D2").Value = strReloj
End Sub
Public Sub IniciarReloj()
IniciarTimer 1000
End Sub
Muchas gracias por tu ayuda
Respuesta
1
Yo aun sigo intentando aprender, así que estamos igual, veamos...
Me ayudaría mucho saber que mensaje de error te da, recuerda que la macro que tienes que ejecutar es, primero...
Public Sub IniciarReloj()
IniciarTimer 1000
End Sub
y muy importante, detener el reloj ANTES de cerrar el libro...
Public Sub DetenerReloj()
KillTimer 0, TimerID
End Sub
Las variables que mencionas, estan declaradas como ARGUMENTOS de una funcion en:
Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
y SI se utilizan al "llamar" a la función SetTimer
TimerID = SetTimer(0, 0, Intervalo, AddressOf TimerExecute)
Observa como se corresponden los argumentos...
ByVal se utiliza para, cuando llamas a una función, los argumentos pasen por valor, o sea, realmente se les pasa una copia del valor, para que no se puedan modificar desde la función, puedes leer algo de esto en mi página
http://www.vbalym.netfirms.com/excel/exfun1.html
Observa que la funcion IniciarTimer tiene un solo argumento llamado Intervalo
Private Sub IniciarTimer(ByVal Intervalo As Long)
Al "invocar" o "llamar" a dicha función, tengo que "pasarle" dicho argumento, es lo que hago en
IniciarTimer 1000
Que le indica que el "timer" debe de ejecutarse cada segundo, el valor esta en milésimas de segundo para decirle que cada tres minutos seria
IniciarTimer 3000
Saludos...
Mauricio Baeza
[email protected]
Todo lo que no es dado es perdido
*==========================================*
La presente respuesta ha demandado un tiempo de lectura,
análisis, elaboración y redacción. A cambio, simplemente,
pretendo que te tomes un minuto para FINALIZARLA, si
hubiera satisfecho -en alguna medida- tu requerimiento.
En caso contrario, puedes preguntarme nuevamente
aclarando qué entendí mal o qué faltó.
No consigo hacer que me funcione al ejecutarse. Aparece un mensaje: Error de compilación, Error de Sintaxis y sombrea la linea:
TimerID = SetTimer(0, 0, Intervalo, AddressOf TimerExecute)
¿Qué hago?
Gracias por las respuesta a mis otras preguntas. Te saluda Human
Tienes copiado también la declaración de la función..
Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "User32" (ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
Como son Private, TODO debe estar en un solo modulo, ¿qué version de Excel y de Windows usas?
La declaración de la función esta copiada y están en un solo modulo por defecto modulo 1. La version de excel es 97 SR-2 Y BAJO WINDOWS 98.
Creo que ya se cual es el problema, sustiyute la siguiente macro y ve si te funciona, saludos
Private Sub IniciarTimer(ByVal Intervalo As Long)
#If VBA6 Then
TimerID = SetTimer(0, 0, Intervalo, AddressOf TimerExecute)
#Else
TimerID = SetTimer(0, 0, Intervalo, AddrOf("TimerExecute"))
#End If
End Sub
Mauricio

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas