Resumen por años.

24/08/2009 - 21:33 por Julián | Informe spam
Necesito ayuda para resolver esta situación.
En una hoja de un libro tengo el histórico de la plantilla de mi empresa,
incluidas las bajas que se produjeron en cada momento.
El formato y los datos de la hoja son:
Número Nombre FechaIngreso FechaBaja
1 Nombre1 4/12/1968 30/06/2008
2 Nombre2 4/12/1968
3 Nombre3 1/1/1969 5/10/1998
4 Nombre4 1/11/1969 19/9/2005
Empieza en A1.
La fecha de baja del registro 2 no aparece porque todavía está en activo.
Así hasta 218 registros con distintas fechas de ingreso y de baja.
Para un estudio que estoy realizando necesito saber, para cada uno de los 42
años, desde 1968 hasta 2009, cuantos días trabajó la plantilla de la empresa
y con cuántos trabajadores se cerró cada uno de los años. El resultado me
gustaría que se presentara de la siguiente manera:
Año Días Empleados
1968 56 2
1969 1156 4
1970

2009


Saludos,
Julián.

Preguntas similare

Leer las respuestas

#6 Julián
28/08/2009 - 21:51 | Informe spam
Antonio, muchas gracias por la dedicación a mi problema.
Por mi desconocimiento de VBA, he optado por la macro que, al ejecutarla me
da un error en la linea alta = , del primer bucle.
Do While Cells(fila, 1).Value > ""
alta = Cells(fila, 2).Value
Supongo que estoy haciendo algo mal. Mañana le dedicaré más tiempo y te
informaré del resultado.



Saludos,
Julián.


"AnSanVal" escribió:


No he podido conseguir una fórmula medianamente "decente". :-(




He construido una solución mediante funciones VBA (comenta si te vale).




En un Módulo ordinario (Alt+F11 > menu Insertar):


Function Trabajadores(año As Integer)

Dim fila As Long, alta As Date, baja As Date

fila = 1

Do While Cells(fila, 1).Value > ""

alta = Cells(fila, 2).Value

baja = Cells(fila, 3).Value

If baja = 0 Then baja = Date

If año >= Year(alta) And año <= Year(baja) Then Trabajadores = Trabajadores + 1

fila = fila + 1

Loop

End Function


Function dias(año As Integer)

Dim fila As Long, alta As Date, baja As Date

fila = 1

Do While Cells(fila, 1).Value > ""

alta = Cells(fila, 2).Value

baja = Cells(fila, 3).Value

If baja = 0 Then baja = Date

If año = Year(alta) Then

If Year(alta) = Year(baja) Then

dias = dias + (baja - alta) + 1

GoTo 1

Else

dias = dias + (DateSerial(año, 12, 31) - alta) + 1

End If

End If

If año = Year(baja) Then

dias = dias + (baja - DateSerial(Year(baja), 1, 1)) + 1

End If

1

If año > Year(alta) And año < Year(baja) Then

dias = dias + (DateSerial(año, 12, 31) - DateSerial(año, 1, 1)) + 1

End If

fila = fila + 1

Loop

End Function





Ejemplo de llamada a las funciones en la hoja :

En [E1:E42] 1968, 1969, ... 2009

En [F1] =Trabajadores(E1) En [G1] =dias(E1)




Repite para el resto de años. Te basta seleccionar F1:G1 y doble clic en el punto de relleno (esquina inferior derecha
de E1).


Consigues lo mismo pero sin funciones, p.e. ejecutando el código desde un botón (o directamente), con el siguiente
código (En este caso escribe el resultado en la Hoja2):

En un Módulo ordinario:
Sub diasNat()
Dim año As Integer, fila1 As Integer, fila As Long
Dim alta As Date, baja As Date
Sheets("Hoja2").Range("A:C").ClearContents
Sheets("Hoja2").Range("A1").Value = "AÑO"
Sheets("Hoja2").Range("B1").Value = "PLANTILLA"
Sheets("Hoja2").Range("C1").Value = "DÍAS-NAT."
For año = 1968 To Year(Date)
fila1 = año - 1966: fila = 1
Sheets("Hoja2").Cells(fila1, 1).Value = año
Do While Cells(fila, 1).Value > ""
alta = Cells(fila, 2).Value
baja = Cells(fila, 3).Value
If baja = 0 Then baja = Date
If año = Year(alta) Then
If Year(alta) = Year(baja) Then
Sheets("Hoja2").Cells(fila1, 3).Value = Sheets("Hoja2"). _
Cells(fila1, 3).Value + (baja - alta) + 1
Sheets("Hoja2").Cells(fila1, 2).Value = _
Sheets("Hoja2").Cells(fila1, 2).Value + 1
GoTo 1
Else
Sheets("Hoja2").Cells(fila1, 3).Value = _
Sheets("Hoja2").Cells(fila1, 3).Value + _
(DateSerial(año, 12, 31) - alta) + 1
Sheets("Hoja2").Cells(fila1, 2).Value = _
Sheets("Hoja2").Cells(fila1, 2).Value + 1
End If
End If
If año = Year(baja) Then
Sheets("Hoja2").Cells(fila1, 3).Value = _
Sheets("Hoja2").Cells(fila1, 3).Value + _
(baja - DateSerial(Year(baja), 1, 1)) + 1
Sheets("Hoja2").Cells(fila1, 2).Value = _
Sheets("Hoja2").Cells(fila1, 2).Value + 1
End If
1
If año > Year(alta) And año < Year(baja) Then
Sheets("Hoja2").Cells(fila1, 3).Value = _
Sheets("Hoja2").Cells(fila1, 3).Value + _
(DateSerial(año, 12, 31) - DateSerial(año, 1, 1)) + 1
Sheets("Hoja2").Cells(fila1, 2).Value = _
Sheets("Hoja2").Cells(fila1, 2).Value + 1
End If
fila = fila + 1
Loop
Next año
End Sub


Tu eliges la solución que mejor te parezca (si te valen).


Saludos desde Tenerife: Antonio.
************************************************



Respuesta Responder a este mensaje
#7 AnSanVal
28/08/2009 - 23:37 | Informe spam
Por mi desconocimiento de VBA, he optado por la macro que, al ejecutarla me
da un error en la linea alta = , del primer bucle.
Do While Cells(fila, 1).Value > ""
alta = Cells(fila, 2).Value



¿Que error te da?

¿Has comprobado que son fechas los datos de la columna B?

Saludos: Antonio.
Respuesta Responder a este mensaje
#8 Julián Ruiz
29/08/2009 - 10:42 | Informe spam
Está resuelto el problema. Tu preguna me dió la pista. Eliminé la fila de
títulos y, problema resuelto; en la hoja 2 están los datos que yo necesito.
Agradezco mucho tu interés para ayudarme.
Muchas gracias.

Saludos,
Julián Ruiz


"AnSanVal" escribió:


> Por mi desconocimiento de VBA, he optado por la macro que, al ejecutarla me
> da un error en la linea alta = , del primer bucle.
> Do While Cells(fila, 1).Value > ""
> alta = Cells(fila, 2).Value

¿Que error te da?

¿Has comprobado que son fechas los datos de la columna B?

Saludos: Antonio.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida