comparacion con fechas y horas en procedimiento

07/01/2006 - 11:26 por Rantamplan | Informe spam
Buenas grupo,
llevo unos dias liado con una aplicación que ya empieza a desquiciarme,
os cuento:

En una hoja, tengo 24 columnas (D:AA) que equivalen a las 24 horas del
dia.
En otra celda tengo un valor que va cambiando cada minuto y ese valor se
va copiando en la celda y columna que le corresponda según la hora del
sistema.
Por ejemplo, si son las 11:18, se copiaría el valor en la celda nº18 de
la columna correspondiente a las 11 de la mañana.
El problema radica en que se ejecuta todo el proceso de forma correcta
excepto para las dos ultimas columnas:
- Columna Z y Columna AA
Estas dos columnas son ignoradas, no escribe nada en esas dos horas.
Creo que estoy metiendo la pata en las comparaciones que hago dentro del
procedimiento. A ver si alguien puede confirmar mi metedura de pata.

Os copio el procedimiento:

- inicio copya&paste

Private Sub Worksheet_Change(ByVal Target As Range)

Dim miHora
Dim minuto
Dim aux As String
miHora = Format(Time, "hh:mm AM/PM")
minuto = Minute(miHora)

If minuto = 0 Then
minuto = 60
End If
minuto = CStr(minuto)

If Intersect(Target, Me.[b63]) Is Nothing Then Exit Sub

With WorksheetFunction

If (miHora > #1:00:00 AM#) And (miHora <= #2:01:00 AM#) Then
If .CountA(Me.[d1:d60]) = 60 Then
Else
aux = "d" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #2:00:00 AM#) And (miHora <= #3:01:00 AM#) Then
If .CountA(Me.[e1:e60]) = 60 Then
Else
aux = "e" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #3:00:00 AM#) And (miHora <= #4:01:00 AM#) Then
If .CountA(Me.[f1:f60]) = 60 Then
Else
aux = "f" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #4:00:00 AM#) And (miHora <= #5:01:00 AM#) Then
If .CountA(Me.[g1:g60]) = 60 Then
Else
aux = "g" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #5:00:00 AM#) And (miHora <= #6:01:00 AM#) Then
If .CountA(Me.[h1:h60]) = 60 Then
Else
aux = "h" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #6:00:00 AM#) And (miHora <= #7:01:00 AM#) Then
If .CountA(Me.[i1:i60]) = 60 Then
Else
aux = "i" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #7:00:00 AM#) And (miHora <= #8:01:00 AM#) Then
If .CountA(Me.[j1:j60]) = 60 Then
Else
aux = "j" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #8:00:00 AM#) And (miHora <= #9:01:00 AM#) Then
If .CountA(Me.[k1:k60]) = 60 Then
Else
aux = "k" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #9:00:00 AM#) And (miHora <= #10:01:00 AM#) Then
If .CountA(Me.[L1:L60]) = 60 Then
Else
aux = "l" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #10:00:00 AM#) And (miHora <= #11:01:00 AM#)
Then
If .CountA(Me.[m1:m60]) = 60 Then
Else
aux = "m" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #11:00:00 AM#) And (miHora <= #12:01:00 PM#)
Then
If .CountA(Me.[n1:n60]) = 60 Then
Else
aux = "n" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #12:00:00 PM#) And (miHora <= #1:01:00 PM#) Then
If .CountA(Me.[o1:o60]) = 60 Then
Else
aux = "o" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #1:00:00 PM#) And (miHora <= #2:01:00 PM#) Then
If .CountA(Me.[p1:p60]) = 60 Then
Else
aux = "p" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #2:00:00 PM#) And (miHora <= #3:01:00 PM#) Then
If .CountA(Me.[q1:q60]) = 60 Then
Else
aux = "q" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #3:00:00 PM#) And (miHora <= #4:01:00 PM#) Then
If .CountA(Me.[r1:r60]) = 60 Then
Else
aux = "r" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #4:00:00 PM#) And (miHora <= #5:01:00 PM#) Then
If .CountA(Me.[s1:s60]) = 60 Then
Else
aux = "s" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #5:00:00 PM#) And (miHora <= #6:01:00 PM#) Then
If .CountA(Me.[t1:t60]) = 61 Then
Else
aux = "t" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #6:00:00 PM#) And (miHora <= #7:01:00 PM#) Then
If .CountA(Me.[u1:u61]) = 61 Then
Else
aux = "u" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #7:00:00 PM#) And (miHora <= #8:01:00 PM#) Then
If .CountA(Me.[v1:v61]) = 61 Then
Else
aux = "v" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #8:00:00 PM#) And (miHora <= #9:01:00 PM#) Then
If .CountA(Me.[w1:w61]) = 61 Then
Else
aux = "w" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #9:00:00 PM#) And (miHora < #10:01:00 PM#) Then
If .CountA(Me.[x1:x60]) = 61 Then
Else
aux = "x" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #10:00:00 PM#) And (miHora < #11:01:00 PM#) Then
If .CountA(Me.[y1:y60]) = 60 Then
Else
aux = "y" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
'--
' a partir de aqui no se ejecuta el codigo
'--
ElseIf (miHora > #11:00:00 PM#) And (miHora <= #12:01:00 AM#)
Then
If .CountA(Me.[z1:z60]) = 60 Then
Else
aux = "z" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #12:00:00 AM#) And (miHora <= #1:01:00 AM#) Then
If .CountA(Me.[aa1:aa60]) = 60 Then
Else
aux = "aa" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
End If

End With

End Sub

- fin copya&paste

gracias anticipadas y Salu2!.


"los videojuegos no tienen ninguna influencia sobre los niños. Quiero
decir, si el Pac-Man hubiese
influenciado a nuestra generación, estaríamos todos corriendo en salas
oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989

Preguntas similare

Leer las respuestas

#1 KL
07/01/2006 - 22:35 | Informe spam
Hola Rantamplan,

No se si te he entendido bien, pero prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Cells(miMinuto, miHora + 4) = [b63]
End Sub

o bien

Private Sub Worksheet_Change(ByVal Target As Range)
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Application.EnableEvents = False
Cells(miMinuto, miHora + 4) = [B63]
Application.EnableEvents = True
End Sub

Saludos,
KL


"Rantamplan" wrote in message news:
Buenas grupo,
llevo unos dias liado con una aplicación que ya empieza a desquiciarme,
os cuento:

En una hoja, tengo 24 columnas (D:AA) que equivalen a las 24 horas del
dia.
En otra celda tengo un valor que va cambiando cada minuto y ese valor se
va copiando en la celda y columna que le corresponda según la hora del
sistema.
Por ejemplo, si son las 11:18, se copiaría el valor en la celda nº18 de
la columna correspondiente a las 11 de la mañana.
El problema radica en que se ejecuta todo el proceso de forma correcta
excepto para las dos ultimas columnas:
- Columna Z y Columna AA
Estas dos columnas son ignoradas, no escribe nada en esas dos horas.
Creo que estoy metiendo la pata en las comparaciones que hago dentro del
procedimiento. A ver si alguien puede confirmar mi metedura de pata.

Os copio el procedimiento:

- inicio copya&paste

Private Sub Worksheet_Change(ByVal Target As Range)

Dim miHora
Dim minuto
Dim aux As String
miHora = Format(Time, "hh:mm AM/PM")
minuto = Minute(miHora)

If minuto = 0 Then
minuto = 60
End If
minuto = CStr(minuto)

If Intersect(Target, Me.[b63]) Is Nothing Then Exit Sub

With WorksheetFunction

If (miHora > #1:00:00 AM#) And (miHora <= #2:01:00 AM#) Then
If .CountA(Me.[d1:d60]) = 60 Then
Else
aux = "d" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #2:00:00 AM#) And (miHora <= #3:01:00 AM#) Then
If .CountA(Me.[e1:e60]) = 60 Then
Else
aux = "e" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #3:00:00 AM#) And (miHora <= #4:01:00 AM#) Then
If .CountA(Me.[f1:f60]) = 60 Then
Else
aux = "f" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #4:00:00 AM#) And (miHora <= #5:01:00 AM#) Then
If .CountA(Me.[g1:g60]) = 60 Then
Else
aux = "g" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #5:00:00 AM#) And (miHora <= #6:01:00 AM#) Then
If .CountA(Me.[h1:h60]) = 60 Then
Else
aux = "h" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #6:00:00 AM#) And (miHora <= #7:01:00 AM#) Then
If .CountA(Me.[i1:i60]) = 60 Then
Else
aux = "i" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #7:00:00 AM#) And (miHora <= #8:01:00 AM#) Then
If .CountA(Me.[j1:j60]) = 60 Then
Else
aux = "j" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #8:00:00 AM#) And (miHora <= #9:01:00 AM#) Then
If .CountA(Me.[k1:k60]) = 60 Then
Else
aux = "k" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #9:00:00 AM#) And (miHora <= #10:01:00 AM#) Then
If .CountA(Me.[L1:L60]) = 60 Then
Else
aux = "l" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #10:00:00 AM#) And (miHora <= #11:01:00 AM#)
Then
If .CountA(Me.[m1:m60]) = 60 Then
Else
aux = "m" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #11:00:00 AM#) And (miHora <= #12:01:00 PM#)
Then
If .CountA(Me.[n1:n60]) = 60 Then
Else
aux = "n" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #12:00:00 PM#) And (miHora <= #1:01:00 PM#) Then
If .CountA(Me.[o1:o60]) = 60 Then
Else
aux = "o" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #1:00:00 PM#) And (miHora <= #2:01:00 PM#) Then
If .CountA(Me.[p1:p60]) = 60 Then
Else
aux = "p" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #2:00:00 PM#) And (miHora <= #3:01:00 PM#) Then
If .CountA(Me.[q1:q60]) = 60 Then
Else
aux = "q" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #3:00:00 PM#) And (miHora <= #4:01:00 PM#) Then
If .CountA(Me.[r1:r60]) = 60 Then
Else
aux = "r" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #4:00:00 PM#) And (miHora <= #5:01:00 PM#) Then
If .CountA(Me.[s1:s60]) = 60 Then
Else
aux = "s" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #5:00:00 PM#) And (miHora <= #6:01:00 PM#) Then
If .CountA(Me.[t1:t60]) = 61 Then
Else
aux = "t" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #6:00:00 PM#) And (miHora <= #7:01:00 PM#) Then
If .CountA(Me.[u1:u61]) = 61 Then
Else
aux = "u" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #7:00:00 PM#) And (miHora <= #8:01:00 PM#) Then
If .CountA(Me.[v1:v61]) = 61 Then
Else
aux = "v" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #8:00:00 PM#) And (miHora <= #9:01:00 PM#) Then
If .CountA(Me.[w1:w61]) = 61 Then
Else
aux = "w" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #9:00:00 PM#) And (miHora < #10:01:00 PM#) Then
If .CountA(Me.[x1:x60]) = 61 Then
Else
aux = "x" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #10:00:00 PM#) And (miHora < #11:01:00 PM#) Then
If .CountA(Me.[y1:y60]) = 60 Then
Else
aux = "y" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
'--
' a partir de aqui no se ejecuta el codigo
'--
ElseIf (miHora > #11:00:00 PM#) And (miHora <= #12:01:00 AM#)
Then
If .CountA(Me.[z1:z60]) = 60 Then
Else
aux = "z" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
ElseIf (miHora > #12:00:00 AM#) And (miHora <= #1:01:00 AM#) Then
If .CountA(Me.[aa1:aa60]) = 60 Then
Else
aux = "aa" + minuto
Me.Range(aux).Value = Me.[b63].Value
End If
End If

End With

End Sub

- fin copya&paste

gracias anticipadas y Salu2!.


"los videojuegos no tienen ninguna influencia sobre los niños. Quiero
decir, si el Pac-Man hubiese
influenciado a nuestra generación, estaríamos todos corriendo en salas
oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989
Respuesta Responder a este mensaje
#2 Rantamplan
08/01/2006 - 11:48 | Informe spam
"KL" Escribió el día sáb 07 ene
2006 10:35:53p:

Hola Rantamplan,

No se si te he entendido bien, pero prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Cells(miMinuto, miHora + 4) = [b63]
End Sub

o bien

Private Sub Worksheet_Change(ByVal Target As Range)
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Application.EnableEvents = False
Cells(miMinuto, miHora + 4) = [B63]
Application.EnableEvents = True
End Sub

Saludos,
KL




Ok, muchisimas gracias, por el codigo lo estoy probando.. pero me salta un
error cuando va a cambiar de hora:
Escribe todas las celdas para todos los minutos excepto el minuto '60' (o
el minuto '0', según se vea). He tenido que poner un "On error resume
Next' porque me saltaba un error del tipo:
"Se ha producido un error 1004 en tiempo de ejecución"
"Error definido por la apicación o el objeto"
pero con un Resume Next lo pasa por alto y continua con el minuto 1.

Lo dicho, muchas gracias por el codigo ;-)

Salu2!.

"los videojuegos no tienen ninguna influencia sobre los niños. Quiero
decir, si el Pac-Man hubiese
influenciado a nuestra generación, estaríamos todos corriendo en salas
oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989
Respuesta Responder a este mensaje
#3 KL
08/01/2006 - 14:14 | Informe spam
Hola Rantamplan,

Ok, muchisimas gracias, por el codigo lo estoy probando.. pero me salta un
error cuando va a cambiar de hora:
Escribe todas las celdas para todos los minutos excepto el minuto '60' (o
el minuto '0', según se vea). He tenido que poner un "On error resume
Next' porque me saltaba un error del tipo:
"Se ha producido un error 1004 en tiempo de ejecución"
"Error definido por la apicación o el objeto"
pero con un Resume Next lo pasa por alto y continua con el minuto 1.



Tienes razon, me olvide del minuto 0. Prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [b63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
If miMinuto > 0 Then
Cells(miMinuto, miHora + 4) = [b63]
Else
Cells(60, miHora + 4) = [B63]
End If
End Sub

No me ha quedado muy claro como quieres que actue el macro al terminar la hora. Tal como esta, si se producen cambios en la celda
[B63] volvera a sobreescribir los valores ya introducidos.

Saludos,
KL
Respuesta Responder a este mensaje
#4 KL
08/01/2006 - 14:19 | Informe spam
Hola de nuevo,

Pensandolo un poquito mas creo que seria mejor asi:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Cells(miMinuto + 1, miHora + 4) = [b63]
End Sub

Ya que el minuto 0 es en realidad el minuto 1.

Saludos,
KL

"KL" wrote in message news:%23wyz$
Hola Rantamplan,

Ok, muchisimas gracias, por el codigo lo estoy probando.. pero me salta un
error cuando va a cambiar de hora:
Escribe todas las celdas para todos los minutos excepto el minuto '60' (o
el minuto '0', según se vea). He tenido que poner un "On error resume
Next' porque me saltaba un error del tipo:
"Se ha producido un error 1004 en tiempo de ejecución"
"Error definido por la apicación o el objeto"
pero con un Resume Next lo pasa por alto y continua con el minuto 1.



Tienes razon, me olvide del minuto 0. Prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [b63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
If miMinuto > 0 Then
Cells(miMinuto, miHora + 4) = [b63]
Else
Cells(60, miHora + 4) = [B63]
End If
End Sub

No me ha quedado muy claro como quieres que actue el macro al terminar la hora. Tal como esta, si se producen cambios en la celda
[B63] volvera a sobreescribir los valores ya introducidos.

Saludos,
KL
Respuesta Responder a este mensaje
#5 Rantamplan
08/01/2006 - 15:47 | Informe spam
"KL" Escribió el día dom 08 ene
2006 02:19:49p:

Hola de nuevo,

Pensandolo un poquito mas creo que seria mejor asi:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B63]) Is Nothing Then Exit Sub
Dim miHora As Integer, miMinuto As Integer
miHora = Hour(Time): miMinuto = Minute(Time)
Cells(miMinuto + 1, miHora + 4) = [b63]
End Sub

Ya que el minuto 0 es en realidad el minuto 1.

Saludos,
KL



Correcto, a esa misma conclusión e llegado también despues de ver que no
cuadraba del todo. Ahora si está perfecto :-)

Respecto a la celda [B63], el valor contenido en esa celda no se puede
cambiar (o no se debe!).
La hoja se usa en un entorno industrial y está leyendo valores de un
servidor conectado a un autómata. Digamos que el servidor guarda en
tiempo real la información de ciertas señales analógicas conectadas al
autómata (temperaturas, emisiones de gases, etc) en unos ficheros y la
celda [B63] lee cada minuto esos ficheros para sacar el valor de una de
esas señales y lo copia en la celda correspondiende a su hora y minuto.
Al final del día se tendrá una hoja con 60 valores x 24 horas del día =
1.440 valores. Mediante otra macro se guarda la hoja con un formato
prestablecido, se borran todas las celdas y vuelta a empezar al dia
siguiente.

Gracias otra vez por tu valiosa aportación. Cada día voy conociendo un
poquito mas los entresijos del Excel y me gusta ;-)

Salu2!.

"los videojuegos no tienen ninguna influencia sobre los niños. Quiero
decir, si el Pac-Man hubiese
influenciado a nuestra generación, estaríamos todos corriendo en salas
oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida