Ingreso rápido de la hora
ButteDuLac
Mensajes publicados
534
Estado
Miembro
-
ButteDuLac Mensajes publicados 534 Estado Miembro -
ButteDuLac Mensajes publicados 534 Estado Miembro -
Hola,
En un formulario de mi base de datos (Access 2010), me gustaría que el usuario pueda introducir rápidamente la hora.
Así, si la hora a introducir es 14:45, con mi máscara de entrada (00:00!;0;_), basta escribir «1445», pero cuando la hora a introducir es 9:30 o 14:00, me gustaría que el usuario pudiera no tener que ingresar más que «930» o «14» y que, por defecto, se añadan los 00 de los minutos, y que el 0 delante del 9 (9:30 en lugar de 09:30) sea opcional. He probado estas máscaras:
99:99!;0;_
90:99!;0;_
90:00!;0;_
99:99;0;_
9:99;0;_
También probé máscaras del tipo 00:00;0;0, etc., pensando que el 0 quedaría por defecto y se tomaría como valor 0, pero solo es un carácter de relleno... Intenté fijar el valor por defecto a 00:00, pensando que la escritura reemplazaría el valor, uno a uno, pero en cuanto se introduce un número en el campo, el valor por defecto 00:00 desaparece y es reemplazado por ... los caracteres de relleno (ya sean _ o 0) y se debe introducir nuevamente los cuatro dígitos...
Mi formato (en la tabla) es « Hora, abreviado ».
Sé que esto se puede hacer, de haberlo vivido en otras bases de datos donde yo era usuario, pero talvez Access no lo permite???
¿Solución??? ¡Gracias!
Configuración: Configuración: Windows / Chrome 55.0.2883.87
En un formulario de mi base de datos (Access 2010), me gustaría que el usuario pueda introducir rápidamente la hora.
Así, si la hora a introducir es 14:45, con mi máscara de entrada (00:00!;0;_), basta escribir «1445», pero cuando la hora a introducir es 9:30 o 14:00, me gustaría que el usuario pudiera no tener que ingresar más que «930» o «14» y que, por defecto, se añadan los 00 de los minutos, y que el 0 delante del 9 (9:30 en lugar de 09:30) sea opcional. He probado estas máscaras:
99:99!;0;_
90:99!;0;_
90:00!;0;_
99:99;0;_
9:99;0;_
También probé máscaras del tipo 00:00;0;0, etc., pensando que el 0 quedaría por defecto y se tomaría como valor 0, pero solo es un carácter de relleno... Intenté fijar el valor por defecto a 00:00, pensando que la escritura reemplazaría el valor, uno a uno, pero en cuanto se introduce un número en el campo, el valor por defecto 00:00 desaparece y es reemplazado por ... los caracteres de relleno (ya sean _ o 0) y se debe introducir nuevamente los cuatro dígitos...
Mi formato (en la tabla) es « Hora, abreviado ».
Sé que esto se puede hacer, de haberlo vivido en otras bases de datos donde yo era usuario, pero talvez Access no lo permite???
¿Solución??? ¡Gracias!
Configuración: Configuración: Windows / Chrome 55.0.2883.87
Enlaces relacionados:
- acceso: máscara de entrada para correo electrónico/sitio web
- Introducir un valor numérico con decimales en un campo
- Volver a la línea en el editor de VBA en Access
- Acceso: Cómo extraer el día del año (1-365) a partir de una fecha
- ACCESS - Problema con la clave primaria automática al agregar una tabla/consulta
- error de sintaxis (operador ausente) en la expresión acceso
2 respuestas
-
Hola, soy Jonas Kapenda de la República Democrática del Congo.
Te recomiendo crear dos campos de texto: hora y minuto, limitando la cantidad de caracteres en cada campo.
Al imprimir el estado, fusiona/guárdalos.-
-
-
Sí, gracias... pero me pregunto... si la persona debe ingresar la hora, luego presionar Tab para pasar a los minutos... y de nuevo Tab para salir del campo de minutos y pasar al siguiente... ¿dónde se ahorra tiempo? (Ej.: para 12:45, en lugar de hacer [1+2+4+5+Tab], la persona hará [1+2+Tab+4+5+Tab] como ahora, o más bien, para 09:00, ella haría [9+Tab+Tab], en lugar de [0+9+0+0] como ahora... mientras que con el método que quiero obtener, la persona haría [9+Tab], o incluso [9+2+Tab] para 09:20, y eso es todo!)
Y dado que ya tengo un gran número de campos en mi BD, eso agregaría dos más, y tendría que, en cada formulario donde tengo una hora por ingresar, reemplazar el campo inicial por dos campos más (y todo el rollo que viene con ello). ¿Qué si tengo un código VBA asociado a mi máscara de entrada (el que ya está en mi campo), copio-pego el código y es mucho más rápido...
De todas formas, gracias por la sugerencia... -
-
En el sentido de que podría poner una máscara con 99;1;_, ¿verdad?
Solo que eso sigue significando que debo eliminar todos mis controles de campo HORA para reemplazarlos cada uno por dos nuevos controles de campo HH y MM (supongamos que trabajo simultáneamente en dos bases de datos, con varias columnas de hora, por ejemplo: [heure_debut] y [heure_fin] para una formación; [heure_naissance], [heure_X], [heure_Y], etc. (X e Y son acciones a realizar en la gestión del expediente Z...
Entonces busco desesperadamente una forma de proceder, ya que sé que es posible...
Dicho esto, tu idea es buena. Es solo que no es exactamente lo que busco.
¡Pero realmente eres genial ayudándome!
-
-
En VBA, voici une traduction approximative et fonctionnelle des fonctions JavaScript fournies. Elle vise à reproduire la logique telle quelle, en adaptant la syntaxe et les types à VBA. Notez que certaines constructions JavaScript (comme les chaînes et les indexes) se mappent différemment en VBA; j’ai pris soin de conserver le comportement d’origine.
Option 1: version avec fonctions séparées (Type Sub/Function dans un module standard)
Public Function _HVC(h As String, f As String) As String
If h = "" Then
_HVC = ""
Exit Function
End If
Dim r As String
r = f
Dim nPos As Long
nPos = InStr(1, r, "HH", vbBinaryCompare)
If nPos > 0 Then
r = Left(r, nPos - 1) & Left(h, 2) & Mid(r, nPos + 2)
End If
nPos = InStr(1, r, "MM", vbBinaryCompare)
If nPos > 0 Then
r = Left(r, nPos - 1) & Mid(h, 3, 2) & Mid(r, nPos + 2)
End If
nPos = InStr(1, r, "SS", vbBinaryCompare)
If nPos > 0 Then
r = Left(r, nPos - 1) & Mid(h, 5, 2) & Mid(r, nPos + 2)
End If
nPos = InStr(1, r, "CC", vbBinaryCompare)
If nPos > 0 Then
r = Left(r, nPos - 1) & Mid(h, 7, 2) & Mid(r, nPos + 2)
End If
_HVC = r
End Function
Public Function _CVH(h As String, f As String) As String
If h = "" Then
_CVH = ""
Exit Function
End If
Dim e As Long, m As Long, s As Long, t As String
e = InStr(1, f, "HH", vbBinaryCompare)
If e = 0 Then
_CVH = ""
Exit Function
End If
m = InStr(1, f, "MM", vbBinaryCompare)
If m = 0 Then
_CVH = ""
Exit Function
End If
s = InStr(1, f, "SS", vbBinaryCompare)
If s = 0 Then
t = "00"
Else
t = Mid(h, s, 2)
End If
Dim c As Long
c = InStr(1, f, "CC", vbBinaryCompare)
Dim d As String
If c = 0 Then
d = "00"
Else
d = Mid(h, c, 2)
End If
_CVH = Mid(h, e, 2) & Mid(h, m, 2) & t & d
End Function
Public Function _EVH(e As Long) As String
Dim hours As String, minutes As String, seconds As String, cent As String
hours = CStr(Int(e \ (100 * 3600)))
If Len(hours) = 1 Then hours = "0" & hours
e = e Mod (100 * 3600)
minutes = CStr(Int(e \ (100 * 60)))
If Len(minutes) = 1 Then minutes = "0" & minutes
e = e Mod (100 * 60)
seconds = CStr(Int(e \ 100))
If Len(seconds) = 1 Then seconds = "0" & seconds
e = e Mod 100
cent = CStr(Int(e))
If Len(cent) = 1 Then cent = "0" & cent
_EVH = hours & minutes & seconds & cent
End Function
Public Function _HSY() As String
Dim d As Date
d = Now
Dim h As String, m As String, s As String, ms As String
h = CStr(Hour(d))
If Len(h) = 1 Then h = "0" & h
m = CStr(Minute(d))
If Len(m) = 1 Then m = "0" & m
s = CStr(Second(d))
If Len(s) = 1 Then s = "0" & s
ms = CStr(Millisecond(d)) ' Note: VBA n’a pas Millisecond, voir remarque ci-dessous
If Len(ms) = 1 Then ms = "0" & ms
If Len(ms) >= 2 Then ms = Left(ms, 2)
_HSY = h & m & s & ms
End Function
' Remarque: VBA standard ne fournit pas Millisecond(natif).
' Pour obtenir des millisecondes, utiliser Now() avec Timer ou une approche API;
' ici on laisse Millisecond(d) comme placeholder conceptuel.
Public Function _HVE(h As String) As Long
' Calcule la valeur comme dans l’exemple JavaScript:
' (h.substr(0,2)*360000) + (h.substr(2,2)*6000) + (h.substr(4,2)*100) + (h.substr(6,2)*1)
Dim a As String
a = h
Dim part1 As Long, part2 As Long, part3 As Long, part4 As Long
part1 = CLng(Mid(a, 1, 2)) * 360000
part2 = CLng(Mid(a, 3, 2)) * 6000
part3 = CLng(Mid(a, 5, 2)) * 100
part4 = CLng(Mid(a, 7, 2)) * 1
_HVE = part1 + part2 + part3 + part4
End Function
Public Function _JGP(d As Object) As Object
Set _JGP = d.Forms(0)
End Function
Option 2: version plus concise et adaptée
' Si vous préférez une version plus simple et tout-en-un sans manipulations de Date/Time compliquées,
' on peut laisser les fonctions _HSY et _Millisecond à adapter selon votre VBA et votre environnement.
Remarques importantes:
- InStr en VBA est équivalent à indexOf en JS; les indices en VBA commencent à 1, d’où les ajustements.
- Substring/Left/Mid en VBA remplacent substring et les manipulations de chaîne JS.
- VBA n’a pas nativement Millisecond; vous devrez peut-être utiliser l’API ou Timer pour récupérer des millisecondes précises.
- Les noms de fonctions démarrent par underscore comme dans le code source pour correspondre.
Si vous voulez, je peux adapter le code pour l’environnement VBA exact (Excel, Access, etc.) et remplacer la partie millisecondes par une solution fonctionnelle adaptée à votre contexte.