Ciclo foreach next en excel vba

Estoy trabajando con una hoja de excel en la que vienen los viajes de negocio de los usuarios, en esta hoja existen tres principales columnas que es el id del usuario, fecha inicio y fecha fin. Cada usuario permanece en un país por determinado tiempo (2, 3, 5 o 10 días) pero lo que a mi administrador le interesa es que en vez de que se vean 20 líneas del mismo usuario las pueda recoger con un bucle foreach y recuperar solo la primera fecha de inicio y la ultima fecha final (entiéndase que cada día que el usuario se conecta en su teléfono le da una fecha nueva de inicio y al final del día cuando se desconecta le da una fecha final), por ello; mi administrador solo requiere la primera fecha de inicio y la ultima fecha de fin discriminando el resto de las filas que contienen al mismo usuario.

Alguien me puede ayudar, solo he codificado esto y no alcanzo a vislumbrar como más hacerlo:

Option Explicit
Sub countingTripTravel()
Dim cellid As String
Dim cellstart As Range
Dim cellend As Range
With Sheets(0)
End Sub

porque no se me ocurre como hacerlo.

2 Respuestas

Respuesta

Te lo planteo totalmente distinto y te digo: ¿Qué pasa si en lugar de resolverlo con macros lo resuelves con tablas dinámicas? (Te dejo un ejemplo 'básico' ya que no sé como tienes tus datos):

Salu2

Gracias por tu respuesta, sin embaro; es necesario con el código de vba por requerimiento del usuario administrador. Esto es debido a que lo puede hacer el mismo con tablas dinámicas pero por algún extraño motivo lo quiere con vba.

Entonces te falta especificar un poco más... ¿qué debería hacer el procedimiento? Pensá que en el ejemplo que yo armé, la información que queda son las entradas y salidas de 3 personas (los id: 1,2,3), ¿Qué debería hacer con eso?

Te dejo un código que tiene los supuestos iniciales y aparte que la hoja donde están los datos se llama "Hoja1" (ajusta esto en el código).

Lo que hace es crear una hoja que se llama 'Salida' (asegurate que no exista esa hoja) y vuelca en esta hoja recién creada la información anterior.

Sub countingTripTravel()
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "Salida"
Cells(1, 1).FormulaR1C1 = "id"
Cells(1, 2).FormulaR1C1 = "Fecha I"
Cells(1, 3).FormulaR1C1 = "Fecha S"
Cells(2, 1).Select
Dim it As Long, fIngreso As Date, fSalida As Date
Dim itSalida As Long
Sheets("Hoja1").Select      'Hoja1 es donde está la información a evaluar
it = 3
itSalida = 2
fIngreso = Cells(2, 2)
Do While Cells(it, 1) <> ""
    Do While Cells(it, 1) = Cells(it - 1, 1)
    it = it + 1
    Loop
    If Cells(it, 1) <> "" Then
        Sheets("Salida").Cells(itSalida, 1) = Sheets("Hoja1").Cells(it - 1, 1)
        Sheets("Salida").Cells(itSalida, 2) = fIngreso
        Sheets("Salida").Cells(itSalida, 3) = Sheets("Hoja1").Cells(it - 1, 3)
        itSalida = itSalida + 1
        fIngreso = Cells(it, 2)
        it = it + 1
    End If
Loop
Sheets("Salida").Cells(itSalida, 1) = Sheets("Hoja1").Cells(it - 1, 1)
Sheets("Salida").Cells(itSalida, 2) = fIngreso
Sheets("Salida").Cells(itSalida, 3) = Sheets("Hoja1").Cells(it - 1, 3)
End Sub

Salu2

Mira, estas son mis instrucciones que me enviaron: 

base the employee name, ID , place to to combine the trip date range, if the next start date - previous end date =1

ahora, mis rangos son estos:

se supone que tengo que combinar las fechas de acuerdo al id y name del usuario.

Adapta el código que te pasé, el Id parece estar en la columna A así que está bien, deberías modificar las columnas B, C del código que te pasé yo a las columnas tuyas aparentemente F (8) y G (9)

Salu2

¡Gracias! Amigo, verdaderamente muchas muchas gracias, esta funcionando más que perfecto.

Saludos!

Podrás ayudarme un poco más, el bucle funciona a la perfeccion; pero ahora debo hacer días continuos por cada usuario, es decir; si un usuario viaja del 1 de octubre al 15 de octubre y luego viaja del 16 de octubre al 31 de octubre yo debo contar 30 días y no 15 por cada viaje, pero si el usuario viaja del 1 de octubre al 15 de octubre y después viaja del 1 de noviembre al 10 de noviembre, ya no son continuas las fechas, ya cuenta como dos viajes en donde el primero es de 15 días y el segundo es de 10 días, el código ya modificado que me enviaste es el siguiente:

Option Explicit
Sub countingTripTravel()
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "Salida"
Cells(1, 1).FormulaR1C1 = "Ô±¹¤ÐÕÃû"
Cells(1, 2).FormulaR1C1 = "³£×¤³ÇÊÐ"
Cells(1, 3).FormulaR1C1 = "³ö²î³ÇÊÐ"
Cells(1, 4).FormulaR1C1 = "Continues Traveling"
Cells(1, 5).FormulaR1C1 = "Traveling days"
Cells(1, 6).FormulaR1C1 = "³ö²îÆðʼÈÕÆÚ"
Cells(1, 7).FormulaR1C1 = "³ö²î½áÊøÈÕÆÚ"
Cells(1, 8).FormulaR1C1 = "Ô±¹¤¶þ¼¶²¿ÃÅ "
Cells(1, 10).FormulaR1C1 = "Ô±¹¤×îС²¿ÃÅ"
Cells(1, 11).FormulaR1C1 = "ÊÜÒæ×îС²¿ÃÅ"
Cells(2, 1).Select
Dim it As Long, fIngreso As Date
Dim fSalida As Date
Dim itSalida As Long
Dim city As String, traveling_city As String, ÅжÏÒÀ¾Ýɸѡʱ¼ä¶ÎÄÚ As String, permanent_city As String, gayname As String, repoffice As String, thirdRepo As String, lastRepo As String
Dim contTravelDay As Integer
Dim travelDay As Integer
Sheets("Sheet1").Select      'Hoja1 es donde está la información a evaluar
it = 3
itSalida = 2
fIngreso = Cells(23, 23)
Do While Cells(it, 16) <> ""
    Do While Cells(it, 16) = Cells(it - 1, 16)
    it = it + 1
    Loop
    If Cells(it, 16) <> "" Then
    Sheets("Salida").Cells(itSalida, 1) = Sheets("Sheet1").Cells(it - 1, 17)
        Sheets("Salida").Cells(itSalida, 2) = Sheets("Sheet1").Cells(it - 1, 4)
        Sheets("Salida").Cells(itSalida, 3) = Sheets("Sheet1").Cells(it - 1, 2)
        Sheets("Salida").Cells(itSalida, 6) = fIngreso
        Sheets("Salida").Cells(itSalida, 7) = Sheets("sheet1").Cells(it - 1, 24)
        Sheets("Salida").Cells(itSalida, 9) = Sheets("sheet1").Cells(it - 1, 6)
        Sheets("Salida").Cells(itSalida, 10) = Sheets("sheet1").Cells(it - 1, 9)
        Sheets("Salida").Cells(itSalida, 11) = Sheets("sheet1").Cells(it - 1, 14)
        itSalida = itSalida + 1
        fIngreso = Cells(it, 23)
        it = it + 1
    End If
Loop
Sheets("Salida").Cells(itSalida, 1) = Sheets("Sheet1").Cells(it - 1, 17)
Sheets("Salida").Cells(itSalida, 2) = Sheets("Sheet1").Cells(it - 1, 4)
Sheets("Salida").Cells(itSalida, 3) = Sheets("Sheet1").Cells(it - 1, 2)
Sheets("Salida").Cells(itSalida, 4) = contTravelDay
Sheets("Salida").Cells(itSalida, 5) = travelDay
Sheets("Salida").Cells(itSalida, 6) = fIngreso
Sheets("Salida").Cells(itSalida, 7) = Sheets("sheet1").Cells(it - 1, 24)
Sheets("Salida").Cells(itSalida, 9) = Sheets("sheet1").Cells(it - 1, 6)
Sheets("Salida").Cells(itSalida, 10) = Sheets("sheet1").Cells(it - 1, 9)
Sheets("Salida").Cells(itSalida, 11) = Sheets("sheet1").Cells(it - 1, 14)
End Sub

se supone que tengo que contabilizar los dias en contTravelDay para los continuos y travelDay para los que no son continuos.

¿Me puedes ayudar?

Estoy medio complicado de tiempo, pero en las comparaciones que está haciendo deberías incluir la comparación de la fecha de ingreso de la fila actual, contra la fecha de salida de la fila anterior.

Salu2

Respuesta

Sub datos()
x = 1
Dim pos, a, val
a = Range("A1:A" & ActiveSheet.UsedRange.Rows.Count).Value
val = 339079
pos = Application.Match(val, a, False)
Cells(x, 10) = val
Cells(x, 11) = Cells(pos, 6)
pos = Application.Match(val, a, True)
Cells(x, 12) = Cells(pos, 7)
x = x + 1
End Sub

Amigo, por que val = 339079?, me queda claro como deben caer los resultados en las celdas; sin embargo no obtengo ningún conteo ni resultado.

¿Sera debido a que debo insertar algún valor en val?

Ahí mete un bucle para que val sea cada vez una ID univoca.

O sea leer antes las IDs únicas, metiendolas en una variable(x) y luego las asignas en ese bucle que has de insertar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas