Funciones de fecha
Estimado amigo como le hago para calcular la fecha que termina un curso cuando yo ingrese el inicio.. El problema es que el curso se da lunes, miércoles y viernes o martes y jueves de 18 y 16 horas respectivamente... Otra pregunta en este mismo tema es como válido una columna donde debo ingresar el nombre de un profesor pero dependiendo de otra celda en la cual debo ingresar el curso.. Si el curso es de inglés entonces me mostrará una lista de profesores de inglés y si ingreso el curso de computación me debe mostrar solo profesores de computación.
1 respuesta
Respuesta de valedor
1
1
Te sugiero hacer una pregunta a la vez...
Primero, "casi" siempre hay varias formas de hacer algo, en tu caso, a primer vista, veo dos, fórmulas o macros, para las primeras necesitaríamos crear algunas tablitas de donde se tomen los datos, por ejemplo, días de los cursos y horarios, para la segunda opción, creo que es necesario usar macros, esto es por que tu quieres que los datos se muestren dependiendo de acciones y eventos
Para cualquiera de las dos, veo que hay que trabajar un poquito, podemos partir de lo que tengas y te voy orientando, ademas de que seria de mucha utilidad saber que tanto dominas Excel, sus funciones, si sabes usar macros, en fin, te recomiendo ser más explicito en tus exposiciones...
Primero, "casi" siempre hay varias formas de hacer algo, en tu caso, a primer vista, veo dos, fórmulas o macros, para las primeras necesitaríamos crear algunas tablitas de donde se tomen los datos, por ejemplo, días de los cursos y horarios, para la segunda opción, creo que es necesario usar macros, esto es por que tu quieres que los datos se muestren dependiendo de acciones y eventos
Para cualquiera de las dos, veo que hay que trabajar un poquito, podemos partir de lo que tengas y te voy orientando, ademas de que seria de mucha utilidad saber que tanto dominas Excel, sus funciones, si sabes usar macros, en fin, te recomiendo ser más explicito en tus exposiciones...
Mira amigo Valedor, soy profesor de computación y debo estar enseñando excel avanzado y sé que la primera pregunta lo debo hacer con la función DiasLab o alguna otra que tu conoces lo que pasa no sé como orientarla, en cuanto a la segunda no supiera como elaborar una macro para este tipo de problema... ayuda please
Amigo sigo a la espera de tus respuestas gracias por tu comprensión. Y de paso pedirte como hago para cambiar la fuente de un control Box de un formulario.. no estoy hablando de los datos de controles externo ni de Visual en Excel
Yo también soy profesor, veremos si nos entendemos...
Tu quieres ingresar una fecha y en otra obtener la fecha en que "deberia" de terminar el curso, tomando en cuenta que unos son L, M y V y otros M y J, la función Días.Lab creo que no nos sirve por que esta calcula el numero de días laborables entre dos fechas, pudiendo agregar una lista de excepciones, con lo cual, hay que pasarle la fecha final, que es la que queremos encontrar, el horario, si no afecta, no nos interesa, como no das más detalles, supongo que consideras una hora por día, si son más, es fácil adaptarlo, pero eso ya es tu tarea:
A1 = Inicio
B1 = Duracion
C1 = Dias
D1 = Fin de curso
Inicio = Fecha de inicio del curso
Duración = En horas
Dias = 1 para Lunes, Miercoles y Viernes, un 2 para Martes y Jueves
A2 = 11-Feb-2002
B2 = 18
C2 = 1
D2 = A2+SI(C2=1,ENTERO(B2/3),ENTERO(B2/2))*7-SI(C2=1,3,4)
El resultado es una fecha, por lo tanto formatea la celda D2 como fecha
Esto tiene muchas, muchas variantes, por ejemplo:
Estoy suponiendo que los cursos inician los lunes ¿qué pasa si no es Lunes?
Estoy supondiendo que cuando son tres veces a la semana, el numero de horas es múltiplo de 3 y cuando son dos veces a la semana, son múltiplos de 2, ¿qué pasa cuando no es así?
No se de donde me escribas, pero habría que considerar los días feriados u oficiales...
En lo personal, haría una función personalizada que respondiese a todas mis variables, con solo pasarle los tres argumentos propuestos, fecha de inicio, duración en horas y días de clase, tal vez se le podría agregar un cuarto argumento que me diga cuantas horas por día son...
Como te dije en mi primer respuesta, trata de ser más explicito...
Estuve haciendo pruebas con tu segunda pregunta y es "casi" definitivo, necesitas macros, pero no es tan fácil y si no las sabes usar, la verdad es que tendría que hacerte toda la hoja y estoy un poco (mucho) corto de tiempo...
No entiendo a que te refieres con; "no estoy hablando de los datos de controles externo ni de Visual en Excel", los únicos combobox que conozco, son tres; los que agregas dentro de un UserForm desde el Editor de VB, el que puedes agregar a una hoja de calculo desde la barra de herramientas Formulario y el que puedes agregar a una hoja de calculo desde la barra de herramientas Cuadro de controles, como dices que no es de Visual, supondré que no es el primero, al segundo no le puedes cambiar la fuente, solo al tercero, para esto, ya que lo dibujaste da un clic con el botón secundario del ratón sobre el control y seleccionas del menu contextual Propiedades, te saldrá un cuadro de dialogo con una lista de nombre del lado izquierdo (estas son las propiedades) y una lista de valores del lado derecho, busca la que dice Font y cambiale la fuente que quieras...
Tu quieres ingresar una fecha y en otra obtener la fecha en que "deberia" de terminar el curso, tomando en cuenta que unos son L, M y V y otros M y J, la función Días.Lab creo que no nos sirve por que esta calcula el numero de días laborables entre dos fechas, pudiendo agregar una lista de excepciones, con lo cual, hay que pasarle la fecha final, que es la que queremos encontrar, el horario, si no afecta, no nos interesa, como no das más detalles, supongo que consideras una hora por día, si son más, es fácil adaptarlo, pero eso ya es tu tarea:
A1 = Inicio
B1 = Duracion
C1 = Dias
D1 = Fin de curso
Inicio = Fecha de inicio del curso
Duración = En horas
Dias = 1 para Lunes, Miercoles y Viernes, un 2 para Martes y Jueves
A2 = 11-Feb-2002
B2 = 18
C2 = 1
D2 = A2+SI(C2=1,ENTERO(B2/3),ENTERO(B2/2))*7-SI(C2=1,3,4)
El resultado es una fecha, por lo tanto formatea la celda D2 como fecha
Esto tiene muchas, muchas variantes, por ejemplo:
Estoy suponiendo que los cursos inician los lunes ¿qué pasa si no es Lunes?
Estoy supondiendo que cuando son tres veces a la semana, el numero de horas es múltiplo de 3 y cuando son dos veces a la semana, son múltiplos de 2, ¿qué pasa cuando no es así?
No se de donde me escribas, pero habría que considerar los días feriados u oficiales...
En lo personal, haría una función personalizada que respondiese a todas mis variables, con solo pasarle los tres argumentos propuestos, fecha de inicio, duración en horas y días de clase, tal vez se le podría agregar un cuarto argumento que me diga cuantas horas por día son...
Como te dije en mi primer respuesta, trata de ser más explicito...
Estuve haciendo pruebas con tu segunda pregunta y es "casi" definitivo, necesitas macros, pero no es tan fácil y si no las sabes usar, la verdad es que tendría que hacerte toda la hoja y estoy un poco (mucho) corto de tiempo...
No entiendo a que te refieres con; "no estoy hablando de los datos de controles externo ni de Visual en Excel", los únicos combobox que conozco, son tres; los que agregas dentro de un UserForm desde el Editor de VB, el que puedes agregar a una hoja de calculo desde la barra de herramientas Formulario y el que puedes agregar a una hoja de calculo desde la barra de herramientas Cuadro de controles, como dices que no es de Visual, supondré que no es el primero, al segundo no le puedes cambiar la fuente, solo al tercero, para esto, ya que lo dibujaste da un clic con el botón secundario del ratón sobre el control y seleccionas del menu contextual Propiedades, te saldrá un cuadro de dialogo con una lista de nombre del lado izquierdo (estas son las propiedades) y una lista de valores del lado derecho, busca la que dice Font y cambiale la fuente que quieras...
Hola Valedor, estuve probando tus respuestas y tuve que hacerla en esta forma, ya que cada clase tiene 2 horas
= A9+SI(C9=1,(ENTERO(B9/3)*3),(ENTERO(B9/2))*3)-SI(C9=2,1,0). El problema es que no corre perfecto porque tiene una deficiencia de días, mira te escribo desde Perú y los cursos no siempre empiezan los lunes,se empieza en cualquier día que se reuna un buen grupo..., además como controlo los días feriados o no laborable....en cuanto a los controles Box me refería a los de la barra de herramientas - formularios a ella me dices que no le puedes cambiar la fuente pero cuando vinculo con un rango de entrada tengo una lista con fuentes demasiado pequeñas...pero al entrar al editor de visual tengo como objeto al combo box..mi pregunta es si acaso no hay forma de cambiar la fuente de lisindex desde allí..... del macro que te pedí olvidalo...no quiero ser demasiada carga para tí.....muchas gracias por todo.
= A9+SI(C9=1,(ENTERO(B9/3)*3),(ENTERO(B9/2))*3)-SI(C9=2,1,0). El problema es que no corre perfecto porque tiene una deficiencia de días, mira te escribo desde Perú y los cursos no siempre empiezan los lunes,se empieza en cualquier día que se reuna un buen grupo..., además como controlo los días feriados o no laborable....en cuanto a los controles Box me refería a los de la barra de herramientas - formularios a ella me dices que no le puedes cambiar la fuente pero cuando vinculo con un rango de entrada tengo una lista con fuentes demasiado pequeñas...pero al entrar al editor de visual tengo como objeto al combo box..mi pregunta es si acaso no hay forma de cambiar la fuente de lisindex desde allí..... del macro que te pedí olvidalo...no quiero ser demasiada carga para tí.....muchas gracias por todo.
En definitiva me inclinaría por una función personalizada que contemple todas estas variantes, con gusto te ayudo a hacerlo, resumiendo, el trabajo seria:
A partir de una fecha inicial, calcular la fecha en que debe de terminar
Los argumentos a pasarle son:
Fecha de inicio
Si es Lun,Mie y Vie o Mar y Jue
Duración total en horas
Duración por clase
Días que tiene que omitir (feriados)
La función tendría esta apariencia
Public Function Fin_de_curso(ByVal FechaInicial As Date, _
ByVal Dias As Integer, _
ByVal TotalHoras As Integer, _
ByVal HorasClase As Integer, _
ByVal Feriados As Range)
'Aqui va ir el codigo
End Function
Public Sub Fin_de_curso
Solo confírmame que es así, para empezarla.
A partir de una fecha inicial, calcular la fecha en que debe de terminar
Los argumentos a pasarle son:
Fecha de inicio
Si es Lun,Mie y Vie o Mar y Jue
Duración total en horas
Duración por clase
Días que tiene que omitir (feriados)
La función tendría esta apariencia
Public Function Fin_de_curso(ByVal FechaInicial As Date, _
ByVal Dias As Integer, _
ByVal TotalHoras As Integer, _
ByVal HorasClase As Integer, _
ByVal Feriados As Range)
'Aqui va ir el codigo
End Function
Public Sub Fin_de_curso
Solo confírmame que es así, para empezarla.
Hola, me parece bien, sólo que creo que debes omitir la cantidad de horas que demora el curso por que de lunes a viernes son solo 2 horas en cualquier horario, sólo los sábados el curso dura 4 horas... si crees que es mejor hacerlo de 2 y de 4 al mismo tiempo te lo estaré sumamente agradecido, gracias.
Ahora si me hiciste trabajar, esta muy interesante la función y quedo muy bonita, espero que no tenga errores, desafortunadamente, en esta página no se puede agregar código HTML para mostrarle con colores y sangrías, la veras toda plana y medio fea, ademas de que hice otras dos funciones de apoyo, necesarias para la principal, trate de comentarla lo más posible, supongo que ya sabes como usar una funcíon personalizada, si lo deseas te envío el archivo donde esta y donde hice mis pruebas, ademas, no sabes como te agradecería que en cuanto estés satisfecho con la respuesta, finalices esta pregunta, gracias...
Mauricio
'Aqui va el código
Option Explicit
Public Function Fin_de_curso(ByVal FechaInicio As Date, _
ByVal Dias As Integer, _
ByVal TotalHoras As Integer, _
ByVal HorasClase As Integer, _
Optional ByVal Feriados As Variant) As Date
Dim lngFechaInicio As Long
Dim lngFinCurso As Long
Dim intNumDias As Integer
Dim mDiasFeriados() As Long
Dim c As Range
Dim co1 As Integer
'Convertimos la fecha inicial en un numero
lngFechaInicio = CLng(FechaInicio)
'Calculamos el número de días que durara el curso
intNumDias = Int(TotalHoras / HorasClase)
'Verificamos que el día de inicio sea correcto
lngFechaInicio = DiaInicioCorrecto(lngFechaInicio, Días)
'****************
lngFinCurso = lngFechaInicio
'Si hay dias feriados los cargamos en una matriz
If Not IsMissing(Feriados) Then
'Redimencionamos la matriz
ReDim mDiasFeriados(Feriados.Count - 1)
'LLenamos la matriz con cada uno de los dias feriados
For Each c In Feriados
mDiasFeriados(co1) = CLng(c.Value)
co1 = co1 + 1
Next c
For co1 = 1 To intNumDias - 1
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
'Checamos que no sea un dia feriado
Do While EsFeriado(mDiasFeriados, lngFinCurso)
'Si es feriado nos movemos al siguiente día hábil
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
Loop
Next co1
Else
'En caso de que no haya días feriados, es sencillo
'solo buscamos los siguiente días hábiles
For co1 = 1 To intNumDias - 1
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
Next co1
End If
Fin_de_curso = CDate(lngFinCurso)
End Function
'Esta función de apoyo es para determinar el dia siguiente hábil
'del dia pasado, para este caso especial, aplica lo siguiente
'Lunes siguiente dia hábil Miercoles
'Martes siguiente dia hábil Jueves
'Miercoles siguiente dia hábil Viernes
'Jueves siguiente dia hábil Martes
'Viernes siguiente dia hábil Lunes
'Sabado siguiente dia hábil Sabado
'Domingo valor no valido, en este caso devolvera el mismo dia
Private Function SiguienteDiaHabil(ByVal Dia As Long) As Long
Dim lngSiguienteDia As Long
Select Case WeekDay(Dia)
Case 1
lngSiguienteDia = Dia
Case 2 To 4 'Lunes, Martes y Miercoles
lngSiguienteDia = Dia + 2
Case 5 'Jueves
lngSiguienteDia = Dia + 5
Case 6 'Viernes
lngSiguienteDia = Dia + 3
Case 7 'Sabado
lngSiguienteDia = Dia + 7
End Select
SiguienteDiaHabil = lngSiguienteDia
End Function
'Esta funcion me ayuda a determinar el inicio del curso de forma
'correcta, es decir si mi curso es los dias Martes y Jueves y como
'inicio de curso se le pasa un Viernes, esta funcion calculo el
'siguiente Martes Habil
Private Function DiaInicioCorrecto(ByVal Dia As Long, _
ByVal Dias As Integer) As Long
Dim lngInicio As Long
Select Case Dias
Case 1 'Lun, Mie y Vie
Select Case WeekDay(Dia)
Case 1, 3, 5 'Dom Mar Jue
lngInicio = Dia + 1
Case 2, 4, 6 'Lun Mie Vie
lngInicio = Dia
Case 7 'Sab
lngInicio = Dia + 2
End Select
Case 2 'Mar y Jue
Select Case WeekDay(Dia)
Case 1 'Dom
lngInicio = Dia + 2
Case 2, 4 'Lun Mie
lngInicio = Dia + 1
Case 3, 5 'Mar Juev
lngInicio = Dia
Case 6 'Vie
lngInicio = Dia + 4
Case 7 'Sab
lngInicio = Dia + 3
End Select
Case 3 'Sab
Select Case WeekDay(Dia)
Case 1 'Dom
lngInicio = Dia + 6
Case 2 'Lun
lngInicio = Dia + 5
Case 3 'Mar
lngInicio = Dia + 4
Case 4 'Mie
lngInicio = Dia + 3
Case 5 'Jue
lngInicio = Dia + 2
Case 6 'Vie
lngInicio = Dia + 1
Case 7 'Sab
lngInicio = Dia
End Select
End Select
DiaInicioCorrecto = lngInicio
End Function
'Esta funcion de apoyo me devuelve Verdadero si el Dia
'pasado esta dentro de la matriz de dias feriados
Private Function EsFeriado(ByRef DiasFeriados() As Long, _
ByVal Dia As Long) As Boolean
Dim co1 As Integer
For co1 = LBound(DiasFeriados) To UBound(DiasFeriados)
If Dia = DiasFeriados(co1) Then
EsFeriado = True
Exit For
End If
Next co1
End Function
Mauricio
'Aqui va el código
Option Explicit
Public Function Fin_de_curso(ByVal FechaInicio As Date, _
ByVal Dias As Integer, _
ByVal TotalHoras As Integer, _
ByVal HorasClase As Integer, _
Optional ByVal Feriados As Variant) As Date
Dim lngFechaInicio As Long
Dim lngFinCurso As Long
Dim intNumDias As Integer
Dim mDiasFeriados() As Long
Dim c As Range
Dim co1 As Integer
'Convertimos la fecha inicial en un numero
lngFechaInicio = CLng(FechaInicio)
'Calculamos el número de días que durara el curso
intNumDias = Int(TotalHoras / HorasClase)
'Verificamos que el día de inicio sea correcto
lngFechaInicio = DiaInicioCorrecto(lngFechaInicio, Días)
'****************
lngFinCurso = lngFechaInicio
'Si hay dias feriados los cargamos en una matriz
If Not IsMissing(Feriados) Then
'Redimencionamos la matriz
ReDim mDiasFeriados(Feriados.Count - 1)
'LLenamos la matriz con cada uno de los dias feriados
For Each c In Feriados
mDiasFeriados(co1) = CLng(c.Value)
co1 = co1 + 1
Next c
For co1 = 1 To intNumDias - 1
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
'Checamos que no sea un dia feriado
Do While EsFeriado(mDiasFeriados, lngFinCurso)
'Si es feriado nos movemos al siguiente día hábil
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
Loop
Next co1
Else
'En caso de que no haya días feriados, es sencillo
'solo buscamos los siguiente días hábiles
For co1 = 1 To intNumDias - 1
lngFinCurso = SiguienteDiaHabil(lngFinCurso)
Next co1
End If
Fin_de_curso = CDate(lngFinCurso)
End Function
'Esta función de apoyo es para determinar el dia siguiente hábil
'del dia pasado, para este caso especial, aplica lo siguiente
'Lunes siguiente dia hábil Miercoles
'Martes siguiente dia hábil Jueves
'Miercoles siguiente dia hábil Viernes
'Jueves siguiente dia hábil Martes
'Viernes siguiente dia hábil Lunes
'Sabado siguiente dia hábil Sabado
'Domingo valor no valido, en este caso devolvera el mismo dia
Private Function SiguienteDiaHabil(ByVal Dia As Long) As Long
Dim lngSiguienteDia As Long
Select Case WeekDay(Dia)
Case 1
lngSiguienteDia = Dia
Case 2 To 4 'Lunes, Martes y Miercoles
lngSiguienteDia = Dia + 2
Case 5 'Jueves
lngSiguienteDia = Dia + 5
Case 6 'Viernes
lngSiguienteDia = Dia + 3
Case 7 'Sabado
lngSiguienteDia = Dia + 7
End Select
SiguienteDiaHabil = lngSiguienteDia
End Function
'Esta funcion me ayuda a determinar el inicio del curso de forma
'correcta, es decir si mi curso es los dias Martes y Jueves y como
'inicio de curso se le pasa un Viernes, esta funcion calculo el
'siguiente Martes Habil
Private Function DiaInicioCorrecto(ByVal Dia As Long, _
ByVal Dias As Integer) As Long
Dim lngInicio As Long
Select Case Dias
Case 1 'Lun, Mie y Vie
Select Case WeekDay(Dia)
Case 1, 3, 5 'Dom Mar Jue
lngInicio = Dia + 1
Case 2, 4, 6 'Lun Mie Vie
lngInicio = Dia
Case 7 'Sab
lngInicio = Dia + 2
End Select
Case 2 'Mar y Jue
Select Case WeekDay(Dia)
Case 1 'Dom
lngInicio = Dia + 2
Case 2, 4 'Lun Mie
lngInicio = Dia + 1
Case 3, 5 'Mar Juev
lngInicio = Dia
Case 6 'Vie
lngInicio = Dia + 4
Case 7 'Sab
lngInicio = Dia + 3
End Select
Case 3 'Sab
Select Case WeekDay(Dia)
Case 1 'Dom
lngInicio = Dia + 6
Case 2 'Lun
lngInicio = Dia + 5
Case 3 'Mar
lngInicio = Dia + 4
Case 4 'Mie
lngInicio = Dia + 3
Case 5 'Jue
lngInicio = Dia + 2
Case 6 'Vie
lngInicio = Dia + 1
Case 7 'Sab
lngInicio = Dia
End Select
End Select
DiaInicioCorrecto = lngInicio
End Function
'Esta funcion de apoyo me devuelve Verdadero si el Dia
'pasado esta dentro de la matriz de dias feriados
Private Function EsFeriado(ByRef DiasFeriados() As Long, _
ByVal Dia As Long) As Boolean
Dim co1 As Integer
For co1 = LBound(DiasFeriados) To UBound(DiasFeriados)
If Dia = DiasFeriados(co1) Then
EsFeriado = True
Exit For
End If
Next co1
End Function
- Compartir respuesta
- Anónimo
ahora mismo