Visual Basic para Aplicaciones - Mejorar Codigo

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Mejorar Codigo

Publicado por Javier Ruiz (2 intervenciones) el 10/04/2018 20:25:16
Muy buen día a todos,

tengo este código, que es un contador tiene varias condicionantes alguien cree que haya alguna manera de mejorarlo o así está bien.

Saludos!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim MOV As Object
Dim RangoMOV As Range
Dim NombreRangoMOV As String
Dim ContaMov As Integer
Public HojaOrigen As Worksheet
 
NombreRangoMOV = P.Address & ":" & Range(P.Address).End(xlDown).Address
 
Set RangoMOV = HojaOrigen.Range(NombreRangoMOV)
 
Set MOV = HojaOrigen.Range(P.Address)
If MOV.Offset(1, 0).Value = MOV.Value Then
    Do While MOV.Offset(1, 0).Value = MOV.Value
        For Each MOV In RangoMOV
            If MOV.Offset(1, 0).Value = MOV.Value Then
                ContaMov = ContaMov + 1
            Else
                ContaMov = ContaMov + 1
                Exit Do
            End If
        Next MOV
    Loop
Else
ContaMov = ContaMov + 1
End If
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Mejorar Codigo

Publicado por Norberto (34 intervenciones) el 17/04/2018 14:23:38
Hola.

No sé muy bien el sentido de ContaMov y por qué se incrementa en la línea 24. Si no es muy significativo, se puede prescindir el If...End If de las líneas 12 y 25 ya que el Do While tendría el mismo efecto (solo que no haría el incremento).

También puedes simplificar un poco el código de las líneas 15 a 20 así:

1
2
3
4
5
6
...
            ContaMov = ContaMov + 1
            If MOV.Offset(1, 0).Value <> MOV.Value Then
                Exit Do
            End If
...

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Mejorar Codigo

Publicado por Javier (2 intervenciones) el 17/04/2018 18:07:00
ah, es que este contador es parte de un programa, la función de este modulo es obtener el numero de veces que se repite un valor en una columna, siempre y cuando el valor se encuentre inmediatamente, en cuanto el valor es diferente, se deja de incrementar el contador y se sale del proceso.

se incrementa en 3 ocasiones:

si el valor inmediato es igual:
1. si el valor inmediato es igual y repite el proceso
2. si el valor inmediato no es igual y sale del proceso, esto para dejar el valor en el contador igual a 1 (de no hacerlo así, el ultimo valor no lo tomaría en cuenta)

si el valor inmediato no es igual:
3.si el valor inmediato no es igual y sale del proceso, esto para dejar el valor en el contador igual a 1

Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Mejorar Codigo

Publicado por Norberto (34 intervenciones) el 18/04/2018 12:10:27
Hola de nuevo.

En ese caso podrías iniciar el contador en uno y solo incrementarlo cuando se repite el valor. Además no veo mucho sentido a hacer un bucle Do...Loop y luego salir de él con un Exit Do, teniendo en cuenta que anidas un For Each...Next.

Como no sé qué tiene la variable P no puedo probar si funcionaría de una manera más simple.

Te dejo este código, lo pruebas y, si no funciona, lo dejas como está.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim MOV As Object
Dim RangoMOV As Range
Dim NombreRangoMOV As String
Dim ContaMov As Integer
Dim HojaOrigen As Worksheet
 
NombreRangoMOV = P.Address & ":" & Range(P.Address).End(xlDown).Address
 
Set RangoMOV = HojaOrigen.Range(NombreRangoMOV)
 
Set MOV = HojaOrigen.Range(P.Address)
ContaMov = 1
If MOV.Offset(1, 0).Value = MOV.Value Then
    For Each MOV In RangoMOV
        ContaMov = ContaMov + 1
        If MOV.Offset(1, 0).Value <> MOV.Value Then
            Exit For
        End If
    Next MOV
End If
 
Set rango = Nothing
Set MOV = Nothing

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar