Beruflich Dokumente
Kultur Dokumente
Resumen
Dado que un valor de fecha y hora se almacena como un número de doble
precisión, puede recibir resultados con formato incorrecto al intentar tratar estos
valores en una expresión. En este artículo se demuestra cómo crear expresiones y
funciones personalizadas para mostrar fechas específicas y calcular intervalos de
horas.
Más información
Mostrar fechas concretas
Para mostrar fechas concretas, puede utilizar la función DateSerial() para tratar el
día, el mes y el año de una fecha. Por ejemplo, puede utilizar las expresiones
siguientes en la propiedad ControlSource de un cuadro de texto o en la ventana
Inmediata para devolver fechas concretas:
El mes actual:
DateSerial(Year(Date()), Month(Date()), 1)
El mes siguiente:
DateSerial(Year(Date()), Month(Date()) + 1, 1)
DateSerial(Year(Date()), Month(Date()) + 1, 0)
DateSerial(Year(Date()), Month(Date()) + 2, 0)
DateSerial(Year(Date()), Month(Date())-1,1)
DateSerial(Year(Date()), Month(Date()),0)
DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 1, 1)
DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 4, 0)
Date() - WeekDay(Date()) + 1
Date() - WeekDay(Date()) + 7
Date() - WeekDay(Date(), 0) + 7
Para obtener más información acerca de cómo calcular el año fiscal del mes fiscal,
haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge
Base:
210249 Cómo obtener el mes o el año fiscal de una fecha determinada en Access
2000
PRECAUCIÓN: si sigue los pasos de este ejemplo, modificará la base de datos de
ejemplo Neptuno.mdb. Quizás desee hacer copia de seguridad del archivo
Neptuno.mdb y seguir estos pasos en una copia de la base de datos.
Dado que un valor de hora se almacena como una fracción de un día de 24 horas,
puede recibir los resultados en un formato incorrecto al intentar sumar, restar,
multiplicar o dividir datos de hora mayores de 24 horas.
Por ejemplo, si intenta encontrar el número de horas transcurrido entre dos fechas
restando los valores en Visual Basic, puede que se devuelva un número incorrecto.
Para demostrar esto, escriba el código siguiente en la ventana Inmediata y observe
que se devuelve el valor 0:00 horas en lugar del valor correcto 53:00 horas:
StartDate=#6/1/93 8:00AM#
EndDate=#6/3/93 1:00PM#
?Format(EndDate-StartDate,"hh:mm")
' This sample code separates a time interval into seven variables for
' the following values: days, hours, minutes, seconds, total time in
'
'-------------------------------------------------------------------
days = Int(CSng(interval))
3.
Option Explicit
5.
8.
9. days = Int(CSng(interval))
End Function
11. Para probar esta función, cree una consulta nueva basada en la tabla Orders.
Mostrar: True
1. Cree una tabla nueva con la estructura siguiente y guárdela como TimeLog.
2. Tabla: TimeLog
3. -----------------------
4. Nombre de campo: StartTime
5. Tipo de datos: Date/Time
6. Formato: General Date
7.
8. Nombre de campo: EndTime
9. Tipo de datos: Date/Time
16.
Option Explicit
18.
20.
22. Long
23. Dim days As Long, hours As Long, Minutes As Long, Seconds As Long
24.
32.
33. GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
34. " Minutes " & Seconds & " Seconds "
35.
End Function
NOTA: la función GetElapsedTime requiere que se le pase una fecha y una hora.
39. Textbox
40. ---------------
41. Name: ElapsedTime
42. ControlSource: =GetElapsedTime([EndTime]-[StartTime])
Width: 3 pulgadas
43. Vea el informe. Observe que cada registro muestra el tiempo total transcurrido en
días, horas, minutos y segundos.
Función de ejemplo GetTimeCardTotal()
NOTA: el código de ejemplo de este artículo utiliza Microsoft Data Access Objects.
Para que este código se ejecute correctamente, debe hacer referencia a la
Biblioteca de objetos de Microsoft DAO 3.6. Para ello, haga clic en Referencias en
el menú Herramientas del Editor de Visual Basic y asegúrese de que la
casilla Biblioteca de objetos de Microsoft DAO 3.6 está activada.
1. Cree una tabla nueva con la estructura siguiente y guárdela como TimeCard.
2. Tabla: TimeCard
3. -----------------------
4. Nombre de campo: Daily Hours
5. Tipo de datos: Date/Time
6. Vea la tabla TimeCard en la vista Hoja de datos, escriba los cuatro registros
siguientes y, a continuación, cierre la tabla:
7. 8:15
8. 7:37
9. 8:12
8:03
10. Cree un módulo nuevo y escriba la línea siguiente en la sección de declaraciones si
aún no está:
11.
Option Explicit
13.
15.
20.
26. rs.MoveNext
27. Wend
32.
33. GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes"
34.
End Function
35. Para probar esta función, escriba la línea siguiente en la ventana Inmediata y, a
continuación, presione ENTRAR:
36.
?GetTimeCardTotal()
Más información
Microsoft proporciona ejemplos de programación sólo como ilustración, sin
ninguna garantía ya sea expresa o implícita. Esto incluye, entre otras, las garantías
implícitas de comerciabilidad e idoneidad para un fin determinado. En este artículo
se da por supuesto que ya conoce el lenguaje de programación que se muestra, así
como las herramientas empleadas para crear y depurar procedimientos. Los
ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de
un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer
mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades
específicas. En los ejemplos de este artículo se usan los métodos de Visual Basic
que se enumeran en la tabla siguiente.
Método Argumentos
------------------------------------------
Activate none
Cells rowIndex, columnIndex
Application.Goto reference, scroll
Offset rowOffset, columnOffset
Range cell1
cell1, cell2
Resize rowSize, columnSize
Select none
Sheets index (or sheetName)
Workbooks index (or bookName)
End direction
CurrentRegion none
Propiedad Uso
----------------------------------------------------------------
-----
ActiveSheet para especificar la hoja activa ActiveWorkboo
k para especificar el libro activo Columns.Count para contar
el número de columnas del elemento especificado Rows.Count
para contar el número de filas del elemento especificado Selectio
n para hacer referencia al rango seleccionado
ActiveSheet.Cells(5, 4).Select
o bien
ActiveSheet.Range("D5").Select
2: Seleccionar una celda en otra hoja de cálculo del mismo libro
Para seleccionar la celda E6 en otra hoja de cálculo del mismo libro, puede utilizar
cualquiera de los ejemplos siguientes:
Application.Goto ActiveWorkbook.Sheets("Sheet2").Cells(6, 5)
o bien
Application.Goto (ActiveWorkbook.Sheets("Sheet2").Range("E6"))
O bien, puede activar la hoja y usar el método 1 que aparece más arriba para
seleccionar la celda:
Sheets("Sheet2").Activate
ActiveSheet.Cells(6, 5).Select
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Cells(7, 6)
o bien
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("F7")
O bien, puede activar la hoja y usar el método 1 que aparece más arriba para
seleccionar la celda:
Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
ActiveSheet.Cells(7, 6).Select
ActiveSheet.Range("C2:D10").Select
ActiveSheet.Range("C2", "D10").Select
5: Seleccionar un rango de celdas en otra hoja de cálculo del mismo
libro
Para seleccionar el rango D3:E11 de otra hoja de cálculo del mismo libro, puede
utilizar cualquiera de los ejemplos siguientes:
Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("D3:E11")
O bien, puede activar la hoja y usar el método 4 que aparece más arriba para
seleccionar el rango:
Sheets("Sheet3").Activate
Para seleccionar el rango E4:F12 de una hoja de cálculo en un libro diferente, puede
utilizar cualquiera de los ejemplos siguientes:
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4:F12")
Application.Goto _
Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4", "F12")
O bien, puede activar la hoja y usar el método 4 que aparece más arriba para
seleccionar el rango:
Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
Para seleccionar el rango con nombre "Test" de la hoja de cálculo activa puede
utilizar cualquiera de los ejemplos siguientes:
Range("Test").Select
Application.Goto "Test"
Para seleccionar el rango con nombre "Test" de otra hoja de cálculo del mismo
libro, puede utilizar cualquiera de los ejemplos siguientes:
Application.Goto Sheets("Sheet1").Range("Test")
O bien, puede activar la hoja y usar el método 7 que aparece más arriba para
seleccionar el rango con nombre:
Sheets("Sheet1").Activate
Range("Test").Select
Para seleccionar el rango con nombre "Test" de una hoja de cálculo de un libro
diferente, puede utilizar cualquiera de los ejemplos siguientes:
Application.Goto _
Workbooks("BOOK2.XLS").Sheets("Sheet2").Range("Test")
O bien, puede activar la hoja y usar el método 7 que aparece más arriba para
seleccionar el rango con nombre:
Workbooks("BOOK2.XLS").Sheets("Sheet2").Activate
Range("Test").Select
ActiveCell.Offset(5, -4).Select
Para seleccionar una celda que se encuentra dos filas más arriba y tres columnas a
la derecha de la celda activa, puede utilizar el ejemplo siguiente:
ActiveCell.Offset(-2, 3).Select
Nota: Se producirá un error si intenta seleccionar una celda que esté "fuera de la
hoja". El primer ejemplo anterior devolverá un error si la celda activa se encuentra
entre en las columnas A a D, ya que si se mueve cuatro columnas a la izquierda, la
celda activa se desplazaría a una dirección de celda no válida.
Para seleccionar una celda que se encuentra cinco filas más abajo y cuatro
columnas a la izquierda de la celda C7, puede utilizar los ejemplos siguientes:
ActiveSheet.Range("C7").Offset(5, 4).Select
ActiveSheet.Range("Test").Offset(4, 3).Select
Si el rango con nombre está en otra hoja (que no sea la activa), active primero esa
hoja y, a continuación, seleccione el rango con el ejemplo siguiente:
Sheets("Sheet3").Activate
ActiveSheet.Range("Test").Offset(4, 3).Select
Range("Database").Select
Selection.Resize(Selection.Rows.Count + 5, _
Selection.Columns.Count).Select
Range("Database").Select
Selection.Offset(4, 3).Resize(Selection.Rows.Count + 2, _
Selection.Columns.Count + 1).Select
Para seleccionar la unión (es decir, el área combinada) de los dos rangos con
nombre "Prueba" y "Ejemplo", puede utilizar el ejemplo siguiente:
Application.Union(Range("Test"), Range("Sample")).Select
Tenga en cuenta que ambos rangos deben estar en la misma hoja para que este
ejemplo funcione. Observe también que el método Union no funciona entre
diferentes hojas. Por ejemplo, esta línea funciona correctamente
Application.Intersect(Range("Test"), Range("Sample")).Select
Tenga en cuenta que ambos rangos deben estar en la misma hoja para que este
ejemplo funcione.
ActiveSheet.Range("a1").End(xlDown).Select
Cuando este código se utilice con la tabla de ejemplo, se seleccionará la celda A4.
ActiveSheet.Range("a1").End(xlDown).Offset(1,0).Select
Para seleccionar un rango de celdas contiguas en una columna, utilice uno de los
ejemplos siguientes:
ActiveSheet.Range("a1", ActiveSheet.Range("a1").End(xlDown)).Select
o bien
ActiveSheet.Range("a1:" & ActiveSheet.Range("a1"). _
End(xlDown).Address).Select
Cuando este código se utilice con la tabla de ejemplo, se seleccionarán las celdas
A1 a A4.
Para seleccionar un rango de celdas que no sean contiguas, utilice uno de los
ejemplos siguientes:
ActiveSheet.Range("a1",ActiveSheet.Range("a65536").End(xlUp)).Select
o bien
End(xlUp).Address).Select
Cuando este código se utilice con la tabla de ejemplo, se seleccionarán las celdas
A1 a A6.
ActiveSheet.Range("a1").CurrentRegion.Select
ActiveSheet.Range("a1", _
ActiveSheet.Range("a1").End(xlDown).End(xlToRight)).Select
o bien
ActiveSheet.Range("a1:" & _
ActiveSheet.Range("a1").End(xlDown).End(xlToRight).Address).Select
En algunos casos, es posible que quiera seleccionar las celdas A1 a C6. En este
ejemplo, el método CurrentRegion no funcionará por la línea vacía de la fila 5. Los
siguientes ejemplos harán que se seleccionen todas las celdas:
lastCol = ActiveSheet.Range("a1").End(xlToRight).Column
lastCol = ActiveSheet.Range("a1").End(xlToRight).Column
ActiveSheet.Range("a1:" & _
ActiveSheet.Cells(lastRow, lastCol).Address).Select
StartRange = "A1"
EndRange = "C1"
Union(a,b).Select
Cuando este código se utilice con la tabla de ejemplo, se seleccionarán las celdas
A1:A3 y C1:C6.
ActiveSheet.Range("D5").Select
puede utilizar:
Range("D5").Select
Application.Goto Sheets("Sheet1").Range( _
Sheets("Sheet1").Range(Sheets("Sheet1").Cells(2, 3), _
Sheets("Sheet1").Cells(4, 5)))
Para cualquier elemento entre comillas (por ejemplo, el rango con nombre
"Prueba"), también puede utilizar una variable cuyo valor sea una cadena de texto.
Por ejemplo, en lugar de escribir
ActiveWorkbook.Sheets("Sheet1").Activate
puede utilizar
ActiveWorkbook.Sheets(myVar).Activate
Listo, tengo una posible solución. Estoy seguro de que no es como lo querías pero
te puede ayudar.
El problema es que el formato Fecha/Hora solo soporta hasta 24 horas, después
de eso reinicia a 0 y asume que es un nuevo día. Para lo que deseas debes
hacerlo por separado.
Private Sub btnSumar_Click(sender As Object, e As EventArgs) Handles
btnSumar.Click
Dim hora1 As Single
Dim minuto1 As Single
Dim hora2 As Single
Dim minuto2 As Single
Dim horasuma As Single
Dim minutosuma As Single
'Esto lo puedes modificar dependiendo de la cantidad de TextBox
hora1 = TimeValue(txtHora1.Text).Hour 'Tomamos la Hora del primer TextBox
hora2 = TimeValue(txtHora2.Text).Hour 'Tomamos la Hora del segundo TextBox
minuto1 = TimeValue(txtHora1.Text).Minute 'Tomamos los minutos del primer
TextBox
minuto2 = TimeValue(txtHora2.Text). Minute 'Tomamos los minutos del segundo
TextBox
minutosuma = minuto1 + minuto2 'Sumamos los minutos
horasuma = hora1 + hora2 'Sumamos las horas
'Desde aquí se mantiene igual
horasuma = horasuma + Math.Floor(minutosuma / 60) 'Ajustamos las horas por
excedente de 60 minutos por hora
minutosuma = ((minutosuma / 60) - Math.Floor(minutosuma / 60)) * 60 'Ajustamos
los minutos en base a 60 minutos por hora
txtHoraSuma.Text = horasuma & ":" & minutosuma 'Asignamos al tercer TextBox
End Sub
Esta hecho para 2TextBox pero es fácilmente adaptable a 8.