Saltar al contenido

Problema con macros de intersección de rangos de fechas


hecd666

Recommended Posts

publicado

Buena Tardes,

Les escribo en esta oportunidad, debido a que estoy teniendo problemas con una macro de intersección de rangos de fechas

el cual realice para que cumpliese con mis necesidades, el cual es que me diga si chocan en sus periodos de vacaciones el supervisor y el tablerista, así como los turbinista_1 y turbinista_2 entre si y con el tablerista; y por ultimo los turbinaista_1, turbinista_2 y Operador Auxiliar de Turbina (op. aux. tur.).

El problema que estoy teniendo es que haga lo que haga siempre me aparece la ventana que dice: "Coinciden Tus Vacaciones Con la Segunda Fracción del Tablerista" o "Coinciden Tus Vacaciones Con la Segunda Fracción del Supervisor". Y así coloque fechas que no choquen.

Adjunto el archivo con el cual estoy trabajando y el programa de Excel con el cual estoy trabajando es EXCEL 2010.

De antemano muchas gracias.

Saludos

Harold Castillo

PROGRAMA DE VACACIONES AÑO 2014 DE OPERACIONES.rar

publicado

Amigo hecd666, tu problema de seguro se debe a que realizas comparaciones con celdas vacias

revisa el archivo, te cree una funcion para comparar las fechas, a dicha funcion se les pasa como parametros: la fecha a comparar, la fecha inicial y final del rango a evaluar y un valor que indica si los limites del rango se incluyen o no en la comparación (es decir, usar >= y <= o usar > y < para que se entienda)

yo realice el cambio para el botón de la hoja SUPERVISORES, debes hacer el cambio para las otras hojas, la funcion está en el modulo1

nota: tu macro original asociada al botón NO LA BORRE, simplemente la copie al final del modulo1 y le coloque al final del nombre _VIEJO, para usar el mismo nombre en la modificación que realice

nota2: el archivo lo pase a Excel 2003 ya que en la oficina NO tengo Excel2007-2010.

PROGRAMA DE VACACIONES AÑO 2014 DE OPERACIONES_SM.rar

publicado

Buenos días compañero Bigpetroman su apoyo fue de gran ayuda. Muchísimas gracias. Yo no soy muy experto en lo que es macro estoy empezando, por eso la confusión, pero me gustaría que me explicará como funciona el subprograma que hizo para tener una ideas mas claro y así saber cual fue mi inconveniente y así no vuelva a suceder. Gracias nuevamente

publicado

Amigo hecd666, el codigo que deje en el archivo está comentado, indica que hace cada parte.

la funcion en esencia lo que hace es comparar si una fecha está dentro del rango de 2 fechas, es decir si es mayor o igual a la primera fecha y menor o igual a la segunda fecha; si se cumple dicha condición regresa el valor TRUE, sino, regresa FALSE; lo que agregue adicional fue para realizar ciertas validaciones, por ejemplo si las fechas estan vacias, pues NO se compara nada, no tiene sentido en este caso realizar la comparación.

el problema que tenías con tu codigo era precisamente ese, que realizabas comparaciones con fechas "vacias" (o celdas vacias) y por eso el resultado NO era el esperado, suerte

publicado

Muchas gracias Compañero. Tengo otra duda y es que comando utilizaría para que a la hora que un supervisor, tablerista, turbinista y turbinista auxiliar coloque su fecha de salida de vacaciones no solo se guarde dicha información en la hoja que se esta creando con su nombre sino que también se guarde en el archivo original el cual cada persona va llenando

publicado

Buenos días compañero listo gracias, ya pude solucionar la ultima pregunta que le realice, pero tengo un problema con la macro y es que coloco fecha que se entrelazan y no me da la nota que coinciden las vacaciones del supervisor y el tablerista con respecto al supervisor. Coloco en la parte de abajo la estructura para que me diga donde estoy errando. Gracias

Sub ComprobarCódigoFinSUP()

If MsgBox("¿Está seguro de haber rellenado correctamente la plantilla?", vbQuestion + vbYesNo) = vbYes Then

If Compruebafecha(Range("SUPERVISORES!B18").Value, Range("TABLERISTA!B18").Value, Range("TABLERISTA!F18").Value, 1) = True Or _

Compruebafecha(Range("SUPERVISORES!F18").Value, Range("TABLERISTA!B18").Value, Range("TABLERISTA!F18").Value, 1) = True Then

MsgBox ("Coinciden Tus Vacaciones Con el Supervisor" & Chr(10) & _

"Ingrese Nuevamente Tu Fecha de Vacaciones")

Range("SUPERVISORES!B$18:E$18").ClearContents

Else

If Compruebafecha(Range("SUPERVISORES!B18").Value, Range("TABLERISTA!S18").Value, Range("TABLERISTA!X18").Value, 1) = True Or _

Compruebafecha(Range("SUPERVISORES!F18").Value, Range("TABLERISTA!S18").Value, Range("TABLERISTA!X18").Value, 1) = True Then

MsgBox ("Coinciden Tus Vacaciones Con la Segunda Fracción del Supervisor" & Chr(10) & _

"Ingrese Nuevamente Tu Fecha de Vacaciones")

Range("SUPERVISORES!B18:E18").ClearContents

Else

If Compruebafecha(Range("SUPERVISORES!S18").Value, Range("TABLERISTA!B18").Value, Range("TABLERISTA!F18").Value, 1) = True Or _

Compruebafecha(Range("SUPERVISORES!X18").Value, Range("TABLERISTA!B18").Value, Range("TABLERISTA!F18").Value, 1) = True Then

MsgBox ("Coinciden Tu Segunda Fracción de Vacaciones Con la Primera Fracción del Supervisor" & Chr(10) & _

"Ingrese Nuevamente Tu Fecha de Vacaciones")

Range("SUPERVISORES!S$18:V$18").ClearContents

Else

If Compruebafecha(Range("SUPERVISORES!S18").Value, Range("TABLERISTA!S18").Value, Range("TABLERISTA!X18").Value, 1) = True Or _

Compruebafecha(Range("SUPERVISORES!X18").Value, Range("TABLERISTA!S18").Value, Range("TABLERISTA!X18").Value, 1) = True Then

MsgBox ("Coinciden Tu Segunda Fracción de Vacaciones Con la Segunda Fracción del Supervisor" & Chr(10) & _

"Ingrese Nuevamente Tu Fecha de Vacaciones")

Range("SUPERVISORES!S$18:V$18").ClearContents

Else

MsgBox ("Se Procesara tu fecha de Vacaciones sin Inconvenientes")

Sheets("SUPERVISORES").Select

Sheets("SUPERVISORES").Copy

Workbooks("PROGRAMA DE VACACIONES AÑO 2014 DE OPERACIONES_SM.xls").Save

guardaarchivo

MsgBox "Se ha guardado correctamente.", vbInformation

ThisWorkbook.Saved = True

Application.Quit

End If

End If

End If

End If

End If

End Sub

'---------------------------------------------------------------------------------------

' Procedure : Compruebafecha

' DateTime : 17/09/2013 12:17

' Author : BigPetroman

' Purpose : Permite comprobar si una fecha está o no dentro de un rango de fechas,

' igualmente permite indicar si se toman los límites del rango

'

' Variables:

' dFeComprueba es la Fecha a Comprobar

' dFeIni es la fecha inicial del rango a verificar

' dFeFin es la fecha final del rango a verificar

' nTipo (Opcional); 1 para indicar que se incluya en la validación los limites del rango

' 2 para indicar que NO se incluya en la validación los limites del rango

'---------------------------------------------------------------------------------------

'

Function Compruebafecha(ByVal vFeComprueba As Variant, ByVal vFeIni As Variant, _

ByVal vFeFin As Variant, Optional ByVal nTipo As Integer = 1) As Variant

Dim dFeIni As Date

Dim dFeFin As Date

Dim dFeComprueba As Date

On Error GoTo Compruebafecha_Error

'---------------------------------------------------------------------------------------

'si todo sale bien, regresamos el valor false, para indicar que la fecha NO está dentro

'del rango

'---------------------------------------------------------------------------------------

Compruebafecha = False

'---------------------------------------------------------------------------------------

'Si la fecha a evaluar está vacia, no procesamos nada pues NO hay nada que comparar

'---------------------------------------------------------------------------------------

If vFeComprueba = "" Then

Exit Function

End If

'---------------------------------------------------------------------------------------

'Si los datos de las fechas vFeIni y vFeFin estan vacios, no procesamos nada; no hay

'rango para comparar

'---------------------------------------------------------------------------------------

If vFeIni = "" And vFeFin = "" Then

Exit Function

End If

'---------------------------------------------------------------------------------------

'Si alguno de los datos de las fechas NO es fecha, salimos y damos un error (true) para

'indicar que algo está mal

'---------------------------------------------------------------------------------------

If IsDate(vFeComprueba) = False Or IsDate(vFeIni) = False Or IsDate(vFeFin) = False Then

Compruebafecha = True

Exit Function

End If

'---------------------------------------------------------------------------------------

'Hacemos la comparacion de la fecha

'---------------------------------------------------------------------------------------

dFeComprueba = CDate(vFeComprueba)

dFeIni = CDate(vFeIni)

dFeFin = CDate(vFeFin)

If nTipo <> 1 Then

If dFeComprueba >= dFeIni And dFeComprueba <= dFeFin Then

Compruebafecha = True

End If

Else

If dFeComprueba > dFeIni And dFeComprueba < dFeFin Then

Compruebafecha = True

End If

End If

On Error GoTo 0

Exit Function

Compruebafecha_Error:

Compruebafecha = True

End Function

Sub guardaarchivo()

'x Elsamatilde

' Te guarda el archivo con la extensión que requieras y en el lugar donde lo quieras

Dim MiArchivo As String, miRuta As String

'aquí se declaran las variables que tendrán la ruta y el nombre. Ese nombre se encuentra en A1

miRuta = ThisWorkbook.Path & "\" '***

'se le agrega la extensión que corresponda, aquí la dejé con macros

MiArchivo = Range("SUPERVISORES!B6") & ".xls" '*****

ActiveWorkbook.SaveAs Filename:="C:\Users\Harold\Desktop\Planillas de Vacaciones\Supervisor\" & MiArchivo, FileFormat:=xlWorkbookNormal, CreateBackup:=False

'Aquí se modifica el tipo de extensión que deseas --NO, ESTA LÍNEA NO HACE ESO.

End Sub

- - - - - Mensaje combinado - - - - -

Discúlpeme pero aquí adjunto el archivo para que evalué lo que digo y me diga donde estoy errando. El inconveniente por los momento es con la macro del Supervisor. Gracias de antemano

PROGRAMA DE VACACIONES AÑO 2014 DE OPERACIONES_SM.rar

publicado

Amigo, revisa el anexo, realice una modificación a la funcion que realiza la comprobación (y ajuste las macros de cada hoja a la nueva funcion), el problema era que se comparaban las fechas hacia una lado, es decir, comparaba si A y B estaban dentro de C y D, pero NO comprobaga si C y D estaban dentro de A y B, es lo que se llama solapamiento, está listo ya lo solucione.

otra cosa, la funcion debe estar es un solo modulo (ya la borre de los demas), y en cada molulo tenias funciones para guardar el archivo y todas se llamaban igual (eso está malo, te va a generar problemas), lo acomode y le cambie el nombre a todas.

suerte

PROGRAMA DE VACACIONES AÑO 2014 DE OPERACIONES_SM.zip

  • 2 weeks later...
publicado

Muchas gracias compañero Bigpetroman me ha sido de mucha ayuda toda la información suministrada por usted.

Pero me falta solo una cosa para así terminar con este tema. Y seria como haría para que al tener mas de dos personas que se salgan para la misma fecha de vacaciones o se intersecten en fechas me lance una nota diciendo que no se puede salir para esa fecha porque ya hay 2 personas que salen para esa fecha y entonces se borre la fecha introducida por ultima vez. Gracias te agradecería tu ayuda en este ultimo punto

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.