Contar días de vacaciones

Necesito que me echéis un cable. He hecho un cuadro con las vacaciones de los trabajadores de la empresa. Imaginaos un cuadro de 20 filas correspondientes a los trabajadores y de 100 columnas correspondientes a los días de varios meses.
He coloreado de rojo los días de vacaciones.
Pues bien, necesito que la macro me cuente los días de vacaciones de cada trabajador. Quiero que recorra las 20 filas, una por una, y que en la columna 101 de cada fila me deje el resultado.
Lo he realizado contando por filas de una a una (seleccionándolas yo) y dejando el resultado siempre en la misma celda pero me gustaría que me contara de una vez cada fila dejando el resultado en la columna 101 de la fila correspondiente. ¿Alguien sabe cómo hacerlo?

1 respuesta

Respuesta
2
Yo otra vez!
Holaaaaaaaaaaaaa
pue he estado ingando más acerca del mundillo pero no doy con la respuesta, aunque yo supongo que será seleccionar un rango una fila e ir incrementandola de uno en uno hasta cierto número, lo mismo para los contadores y también para la celda donde estará alojada no? De momento te dejo un código que he hecho, donde seleccionando una fila me dice los días de vacas de ese trabajador a través de un cuadro de mensaje.
Sub vacaciones()
Dim vCountCol As Integer
Dim vCellTarg As String
vCountCol = 0
For Each celda In Selection
If celda.Interior.Color = 255 Then
vCountCol = vCountCol + 1
End If
Next
MsgBox "" & vCountCol & " días de vacaciones"
End Sub
He agregado también botones de informes en el excel para que así me ejecute la macro. Esto está genial!
jajaja... perdón!
Se me olvido ponerte la respuesta!... suele paserme!
Oye pues ya casi lo tenias! ¿Qué paso porque no asignaste el valor que vCountCol a las celdas CW1 a la CW20? ...(CW = columna 101)
Bueno, suponiendo que tus datos van de A1 hasta CV20, así quedaría tu código:
Sub prueba()
Application.ScreenUpdating = False
Dim celda As Range
Dim celda1 As Range
Dim celda2 As Range
Dim contador As Variant
For Each celda In Range("a1:cv20")
If celda.Interior.Color = 255 Then
celda = 0
End If
Next
For Each celda1 In Range("cw1:cw20")
contador = 0
For Each celda2 In Range(celda1.Offset(0, -100), celda1.Offset(0, -1))
If celda2.Interior.Color = 255 Then
contador = contador + 1
End If
Next
celda1 = contador
Next
Application.ScreenUpdating = True
End Sub
Tan cerca y a la vez tan lejos de la respuesta!... te dije que ya casi lo tenias
Me dices si te funciono el código pues, fue lo que te entendí... ¿creo qué si era así no?... bueno saludos y cuidate!
Sigue por donde vas...
Prueba superada! Ya está perfecto. Veo que pusiste el código para asignar valor a las celdas rojas. Tuve que ampliar el rango una columna más porque si no me escribía los días de vacaciones en la columna donde no era. Respecto a lo de offset tuve que ponerlo así porque eran más de 101 columnas:
For Each celda2 In Range(celda1.Offset(0, -153), celda1.Offset(0, -1))
No entiendo muy bien el mecanismo offset, ¿me puedes explicar por encima? ¿Por qué en símbolo negativo? Quiero decir por qué no se podría poner por ejemplo
For Each celda2 In Range(celda1.Offset(0, -153), celda1.Offset(0, 1))
Saludos, muchísimas gracias :)
Ok, mira el offset es el equivalente a la fórmula desref de excel, te explico:
Offset te sirve para desplazarte a un celda determinada por sus criterios de fila y columna a partir de una celda de referencia, el primer criterio indica la fila (si tiene el signo negativo sera hacia arriba) y el segundo criterio indica la columna (si tiene signo negativo sera hacia la izquierda). Por ejemplo:
Si yo pongo el código range("A1"). Offset(4,1), me dará la referencia a la celda "B5". Pues en el código digo que a partir de la celda A1 cuenta cuatro filas hacia abajo y una columna a la derecha. Si por ejemplo pongo el código range("B5"). Offset(-2,-1) me dará la referencia a la celda "A3".
Si por ejemplo en el ultimo caso pusieras offset(-2,-2) te dará un error de referencia pues no hay nada antes de la columna A. si quisieras saber solo el valor que hay en esa referencia solo pondrías al final la extensión .value
Cuidate!... un enorme saludo!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas