Ver Mensaje Individual
  #27 (permalink)  
Antiguo 06/02/2011, 19:49
fjchavez
 
Fecha de Ingreso: julio-2006
Mensajes: 114
Antigüedad: 18 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Ayuda!!! suma de dias de un rango de fechas que se traslapan o no

Hola mrocf,
Publico la funcion que he creado para este calculo por si alguien más se topa con esta tarea.

Funcion OrdenarMatrizNx2: Coje el rango y ordena segun fechas y lo almacena en una matriz Nx2
Funcion TDiasTraslapan: Calcula la suma total de dias (sin repetición) cuando hay fechas que se traslapan.

Código VBA:
Ver original
  1. Function OrdenarMatrizNx2(r As Range) As Variant
  2.  
  3. Dim ArrayName As Variant
  4. Dim t As Variant
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim y As Integer
  8. Dim condition1 As Boolean
  9. Dim condition2 As Boolean
  10. Dim sortcolumn1 As Integer
  11. Dim sortcolumn2 As Integer
  12.  
  13. ArrayName = r
  14. sortcolumn1 = 1
  15. sortcolumn2 = 2
  16.  
  17. For i = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
  18.     For j = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
  19.         condition1 = (ArrayName(j, sortcolumn1) > ArrayName(j + 1, sortcolumn1))
  20.         condition2 = ((ArrayName(j, sortcolumn1) = ArrayName(j + 1, sortcolumn1)) And (ArrayName(j, sortcolumn2) > ArrayName(j + 1, sortcolumn2)))
  21.         If condition1 Or condition2 Then
  22.             For y = LBound(ArrayName, 2) To UBound(ArrayName, 2)
  23.                  t = ArrayName(j, y)
  24.                  ArrayName(j, y) = ArrayName(j + 1, y)
  25.                  ArrayName(j + 1, y) = t
  26.             Next y
  27.         End If
  28.     Next j
  29. Next i
  30.  
  31. OrdenarMatrizNx2 = ArrayName
  32.  
  33. End Function
  34.  
  35. Function TDiasTraslapan(r As Range) As Integer
  36.  
  37. Dim a, b, d As Integer
  38. Dim ArrayName As Variant
  39. ReDim ArrayFechas(1 To 2, 1 To 1) As Variant
  40. Dim dias As Long
  41.  
  42. Application.Volatile
  43.  
  44. 'Trasladamos a matriz y ordenamos los datos con la funcion OrdenaMatrizNx2
  45. ArrayName = OrdenarMatrizNx2(r)
  46. 'Asignamos la primera columna con los valores fecha inicial y fecha final de ArrayName
  47. ArrayFechas(1, 1) = ArrayName(1, 1)
  48. ArrayFechas(2, 1) = ArrayName(1, 2)
  49. 'Procedemos a comparar y rellenar la matriz ArrayFechas
  50. For a = LBound(ArrayName, 1) + 1 To UBound(ArrayName, 1)
  51.     b = LBound(ArrayName, 2)
  52.     fila = UBound(ArrayFechas, 1)
  53.     columna = UBound(ArrayFechas, 2)
  54.     Select Case ArrayName(a, b) <= ArrayFechas(fila, columna)
  55.         Case True
  56.             If ArrayName(a, b + 1) > ArrayFechas(fila, columna) Then
  57.                 ArrayFechas(fila, columna) = ArrayName(a, b + 1)
  58.             End If
  59.         Case False
  60.             ReDim Preserve ArrayFechas(1 To 2, 1 To columna + 1)
  61.             ArrayFechas(fila - 1, columna + 1) = ArrayName(a, b)
  62.             ArrayFechas(fila, columna + 1) = ArrayName(a, b + 1)
  63.     End Select
  64. Next a
  65.        
  66. ArrayFechas = Application.Transpose(ArrayFechas)
  67. dias = 0
  68.  
  69. For d = LBound(ArrayFechas, 1) To UBound(ArrayFechas, 1)
  70. dias = dias + CDate(ArrayFechas(d, UBound(ArrayFechas, 2))) - CDate(ArrayFechas(d, LBound(ArrayFechas, 2))) + 1
  71. Next d
  72.  
  73. TDiasTraslapan = dias
  74.  
  75. End Function

Gracias por la ayuda mrocf