entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

ayuda con Macro de Visual Basic Para excel

Hola, soy nueva en la programacion con visual basic para excel y estoy haciendo un macro al que le paso unos parametros y lo que quiero es que recorra toda una WorkSheet llamada "Requirements" y en base a si los campos que va encontrando coinciden con los parametros que le he pasado a la funcion me incremente un contador.
El problema es que me da errores de sintaxis y no consigo identificarlos. Dejo aqui el codigo a ver si me podeis ayudar a ver los errores, muchas gracias de antemano =)

Me da error de sintaxis en el segundo bucle y en la variable EquipoT
Function casosPositivosYTotales(Tipo, Equipo, Mes, KPI) As Integer()
Dim KPICol As String

If KPI = "response" Then
    KPICol = "AT"
Else
    KPICol = "AU"
End If

Dim contador As Integer
Dim contadorTotal As Integer
Tabla = ActiveWorkbook.Worksheets("Requirements")

For Index = 1 To UBound(Tabla)
    For Index2 = 0 To UBound(Tabla(Index))
        Dim KPIT As Excel.Range
        TipoT = Range("M" & Index).Value
        EquipoT = Range("AG" & Index).Value
        MesT = Month(Range("P" & Index).Value)
        Set KPIT = Range(KPICol & Index).Value

        If TipoT = Tipo And EquipoT = Equipo And MesT = Mes Then
            If KPIT = 1 Then
                    contador = contador + 1
            Else
                    contadorTotal = contador + 1
            End If
        End If
    Next
Next

Casos = Array(contador, contadorTotal)

Return Casos

End Function

Luego esta seria la llamada a la funcion:

 Private Sub CommandButton1_Click()
    Cases = casosPositivosYTotales "User Support", "Sales", 3, "response"
    MsgBox Cases(0)
End Sub

0voto

carlossevi comentado

¿Qué mensaje de error devuelve? Otros errores que he detectado:

En VBA no se utiliza la función return para el resultado de las funciones, sino que se asigna el valor deseado a una variable que tiene el mismo nombre que la función. Es decir:

' Cambiar:
Return Casos
' Por:
casosPositivosYTotales = Casos

La llamada a la fución debe hacerse con paréntesis (o al menos si no se hace así a mi me da error en Excel 2010):

' Cambiar:
Cases = casosPositivosYTotales "User Support", "Sales", 3, "response"
' Por:
Cases = casosPositivosYTotales("User Support", "Sales", 3, "response")

1voto

midnightnymph comentado

gracias por la respuesta, parece que los errores que tenia se han solucionado aunque ahora me da otro error en la variable MesT , es porque cuando recogo el valor de la fecha de la columna P de "Requirements" esta en formato dd/MM/yyyy y se que para crear un nuevo objeto date he de introducir la fecha de este modo #M/d/yyyy# pero no tengo manera de hacerlo porque no puedo cambiar el formato de la fecha que recogo en la columna P. Hay alguna manera de crear fechas con otros formatos?? gracias de antemano

0voto

carlossevi comentado

¿En qué formato está la celda que contiene el valor? ¿En texto o fecha? Recuerda que en Excel las fechas se guardan como números.

Para todos estos inconvenientes, te aconsejaría definir las variables antes de utilizarlas. VBA es un lenguaje no tipado y permite utilizar variables sin haberlas declarado, con lo que la variable coge tipo que se le asigna. Es mejor que definas manualmente el tipo de las variables y así en caso de incongruencia el código dará error, pero por lo menos te enteras de cuál es el problema.

0voto

midnightnymph comentado

no se, yo diria que esta en fecha, como puedo saberlo? lo que he hecho es coger el valor de la celda como texto y mediante substrings construir otro string con el formato #M/d/yyyy# y luego crear una fecha con ese string pero tampoco funciona te adjunto el codigo : Ahora me dice "compile error: object required" muchas gracias por tus respuestas

For Index = 1 To UBound(Tabla)
    For Index2 = 0 To UBound(Tabla(Index))
        Dim KPIT As Excel.Range
        TipoT = Range("M" & Index).Value
        EquipoT = Range("AG" & Index).Value
        fecha = Range("P" & Index).Value
        fecha2 = "#" + fecha.Substring(4, 1) + "-" + fecha.Substring(1, 1) + "-" + fecha.Substring(6, 4) + "#"
        MsgBox (fecha2)
        Dim someDate As Date
        Set someDate = fecha2
        MesT = Month(someDate)
        Set KPIT = Range(KPICol & Index).Value

        If TipoT = Tipo And EquipoT = Equipo And MesT = Mes Then
            If KPIT = 1 Then
                    contador = contador + 1
            Else
                    contadorTotal = contador + 1
            End If
        End If
    Next
Next

Casos = Array(contador, contadorTotal)
casosPositivosYTotales = Casos
End Function

0voto

carlossevi comentado

Me refiero al formato de la celda (Botón derecho > Formato de celdas... > Números) ¿En qué está?

También lo puedes averiguar poniendo una interrupción en el código y explorando qué valor contiene fecha durante la ejecución.

De verdad que es muy interesante el enlace que te he puesto más arriba con la explicación: http://jldexcelsp.blogspot.com.es/2013/05/manejo-de-fechas-y-tiempo-en-excel.html

0voto

midnightnymph comentado

pues me sale que es tipo date, no entiendo por que no funciona con Month(). He leido el enlace que me has pasado y es muy interesante pero lamentablemente no me ayuda con mi problema, igualmente muchas gracias por la respuesta voy a ver como lo soluciono, voy a intentar tratarlo como si fuera un string y extraer el mes con alguna funcion para strings. Por cierto, sabes si para recorrer toda la tabla es correcto tal y como lo estoy haciendo?? tambien me da un error con eso me dice que "espera un arrray" y me da un error en la variable Tabla

1 Respuesta

2votos

carlossevi Puntos63520

Yo probaría a hacer cast del valor a tipo Date:

' En lugar de :
MesT = Month(Range("P" & Index).Value)
' Usar:
MesT = Month(CDate(Range("P" & Index).Value))

Respecto al error que comentas, es porque la fución UBound tiene como parámetro de entrada un Array de datos y tu le estás pasando un Worksheet entero.

Para acceder a los valores, prefiero utilizar la función Cell(x,y) en lugar de Range(x) porque me parece más directa, pero no sé si en rendimiento se nota mucho.

Yo para recorrer hojas utilizo mucho:

Dim Fila As Long
Fila = ActiveCell.Row + 2
Do While (Not (IsEmpty(Cells(Fila, 1).Value)))
    ' Tu código
    Fila = Fila + 1
Loop

Aunque hay más formas, como por ejemplo utilizando un for each para recorrer las filas:

For Each rw In Worksheets(1).Rows 
    valor = rw.Cells(1, 1).Value 
Next

0voto

midnightnymph comentado

gracias por la respuesta! me estas ayudando mucho la verdad, xd perdona tantas molestias. Una cosa, en el bucle foreach por ejemplo podria coger varios valores de la tabla de la fila actual ?. es decir:

si quiero coger el valor de la columna M y de la fila actual sobre la que itere el bucle seria asi?

 TipoT = Cells(rw, 13).Value    'esto referenciaria al valor d ela columna M de la fila actual?????
Lo mismo seria para otros valores no?
            EquipoT = Cells(rw,  33).Value
            fecha = Cells( rw, 16).Value

0voto

carlossevi comentado

Sí, dentro del bucle puedes hacer todas las operaciones que quieras.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta