Como optimizar codigo largo IF - Else

Tengo este código y quisiera saber como optimizarlo o mejor dicho reducirlo, estoy utilizando If-Else.

Muy agradecido de antemano.

Private Sub combo_coordinador_Change()
Sheets("ENERO").Activate
If combo_coordinador.Value = ActiveSheet.Range("B5") Then
ListBox1.RowSource = "COOR_ENERO1"
Else
If combo_coordinador.Value = ActiveSheet.Range("B26") Then
ListBox1.RowSource = "COOR_ENERO2"
Else
If combo_coordinador.Value = ActiveSheet.Range("B46") Then
ListBox1.RowSource = "COOR_ENERO3"
Else
If combo_coordinador.Value = ActiveSheet.Range("B67") Then
ListBox1.RowSource = "COOR_ENERO4"
Else
If combo_coordinador.Value = ActiveSheet.Range("B88") Then
ListBox1.RowSource = "COOR_ENERO5"
Else
If combo_coordinador.Value = ActiveSheet.Range("B109") Then
ListBox1.RowSource = "COOR_ENERO6"
Else
If combo_coordinador.Value = ActiveSheet.Range("B130") Then
ListBox1.RowSource = "COOR_ENERO7"
Else
If combo_coordinador.Value = ActiveSheet.Range("B151") Then
ListBox1.RowSource = "COOR_ENERO8"
Else
If combo_coordinador.Value = ActiveSheet.Range("B171") Then
ListBox2.RowSource = "COOR_ENERO9"
Else
End If
End If
End If
End If
End If
End If
End If
End If
End If

Sheets("FEBRERO").Activate
If combo_coordinador.Value = ActiveSheet.Range("B5") Then
ListBox2.RowSource = "COOR_FEBRERO1"
Else
If combo_coordinador.Value = ActiveSheet.Range("B26") Then
ListBox2.RowSource = "COOR_FEBRERO2"
Else
If combo_coordinador.Value = ActiveSheet.Range("B46") Then
ListBox2.RowSource = "COOR_FEBRERO3"
Else
If combo_coordinador.Value = ActiveSheet.Range("B67") Then
ListBox2.RowSource = "COOR_FEBRERO4"
Else
If combo_coordinador.Value = ActiveSheet.Range("B88") Then
ListBox2.RowSource = "COOR_FEBRERO5"
Else
If combo_coordinador.Value = ActiveSheet.Range("B109") Then
ListBox2.RowSource = "COOR_FEBRERO6"
Else
If combo_coordinador.Value = ActiveSheet.Range("B130") Then
ListBox2.RowSource = "COOR_FEBRERO7"
Else
If combo_coordinador.Value = ActiveSheet.Range("B151") Then
ListBox2.RowSource = "COOR_FEBRERO8"
Else
If combo_coordinador.Value = ActiveSheet.Range("B171") Then
ListBox2.RowSource = "COOR_FEBRERO9"
Else
End If
End If
End If
End If
End If
End If
End If
End If
End If

Sheets("MARZO").Activate
If combo_coordinador.Value = ActiveSheet.Range("B5") Then
ListBox3.RowSource = "COOR_MARZO1"
Else
If combo_coordinador.Value = ActiveSheet.Range("B26") Then
ListBox3.RowSource = "COOR_MARZO2"
Else
If combo_coordinador.Value = ActiveSheet.Range("B46") Then
ListBox3.RowSource = "COOR_MARZO3"
Else
If combo_coordinador.Value = ActiveSheet.Range("B67") Then
ListBox3.RowSource = "COOR_MARZO4"
Else
If combo_coordinador.Value = ActiveSheet.Range("B88") Then
ListBox3.RowSource = "COOR_MARZO5"
Else
If combo_coordinador.Value = ActiveSheet.Range("B109") Then
ListBox3.RowSource = "COOR_MARZO6"
Else
If combo_coordinador.Value = ActiveSheet.Range("B130") Then
ListBox3.RowSource = "COOR_MARZO7"
Else
If combo_coordinador.Value = ActiveSheet.Range("B151") Then
ListBox3.RowSource = "COOR_MARZO8"
Else
If combo_coordinador.Value = ActiveSheet.Range("B171") Then
ListBox3.RowSource = "COOR_MARZO9"
Else
End If
End If
End If
End If
End If
End If
End If
End If
End If

Sheets("ABRIL").Activate
If combo_coordinador.Value = ActiveSheet.Range("B5") Then
ListBox4.RowSource = "COOR_ABRIL1"
Else
If combo_coordinador.Value = ActiveSheet.Range("B26") Then
ListBox4.RowSource = "COOR_ABRIL2"
Else
If combo_coordinador.Value = ActiveSheet.Range("B46") Then
ListBox4.RowSource = "COOR_ABRIL3"
Else
If combo_coordinador.Value = ActiveSheet.Range("B67") Then
ListBox4.RowSource = "COOR_ABRIL4"
Else
If combo_coordinador.Value = ActiveSheet.Range("B88") Then
ListBox4.RowSource = "COOR_ABRIL5"
Else
If combo_coordinador.Value = ActiveSheet.Range("B109") Then
ListBox4.RowSource = "COOR_ABRIL6"
Else
If combo_coordinador.Value = ActiveSheet.Range("B130") Then
ListBox4.RowSource = "COOR_ABRIL7"
Else
If combo_coordinador.Value = ActiveSheet.Range("B151") Then
ListBox4.RowSource = "COOR_ABRIL8"
Else
If combo_coordinador.Value = ActiveSheet.Range("B171") Then
ListBox4.RowSource = "COOR_ABRIL9"
Else
End If
End If
End If
End If
End If
End If
End If
End If
End If

Sheets("MAYO").Activate
If combo_coordinador.Value = ActiveSheet.Range("B5") Then
ListBox5.RowSource = "COOR_MAYO1"
Else
If combo_coordinador.Value = ActiveSheet.Range("B26") Then
ListBox5.RowSource = "COOR_MAYO2"
Else
If combo_coordinador.Value = ActiveSheet.Range("B46") Then
ListBox5.RowSource = "COOR_MAYO3"
Else
If combo_coordinador.Value = ActiveSheet.Range("B67") Then
ListBox5.RowSource = "COOR_MAYO4"
Else
If combo_coordinador.Value = ActiveSheet.Range("B88") Then
ListBox5.RowSource = "COOR_MAYO5"
Else
If combo_coordinador.Value = ActiveSheet.Range("B109") Then
ListBox5.RowSource = "COOR_MAYO6"
Else
If combo_coordinador.Value = ActiveSheet.Range("B130") Then
ListBox5.RowSource = "COOR_MAYO7"
Else
If combo_coordinador.Value = ActiveSheet.Range("B151") Then
ListBox5.RowSource = "COOR_MAYO8"
Else
If combo_coordinador.Value = ActiveSheet.Range("B171") Then
ListBox5.RowSource = "COOR_MAYO9"
Else
End If
End If
End If
End If
End If
End If
End If
End If
End If
End Sub

1 Respuesta

Respuesta
1

No creo que sea la mejor forma de llevar el control de los coordinadores y sus empleados, suponiendo que el primer coordinador tuviera un empleado más, entonces el siguiente coordinador no va a empezar en Range("B26"), entonces tendrías que modificar todos los rangos en todo el código. Además tendrías que cambiar todos los nombres de rangos que creaste. Esto no es práctico.

Te sugiero que le pongas en otra columna una marca a cada coordinador, de esa forma cuando seleccionen un coordinador en el combo, lo buscas en cada hoja, lo encuentras y cargarías todos los empleados que están abajo del coordinador hasta el siguiente coordinador. Esto lo puedes hacer en un ciclo.

Tal como te lo puse en este código:

hojas = Array("ENERO", "FEBRERO", "MARZO")
    n = 1
    For h = LBound(hojas) To UBound(hojas)
        Set h1 = Sheets(hojas(h))
        Set b = h1.Columns("B:D").Find(ComboBox1, lookat:=xlWhole)
        If Not b Is Nothing Then
            f = b.Row + 1
            Do While True
                If Not h1.Cells(f, "B").MergeCells And h1.Cells(f, "B") <> "" Then
                    Controls("ListBox" & n).AddItem h1.Cells(f, "B")
                    Controls("ListBox" & n).List(Controls("ListBox" & n).ListCount - 1, 1) = h1.Cells(f, "C")
                    Controls("ListBox" & n).List(Controls("ListBox" & n).ListCount - 1, 2) = h1.Cells(f, "D")
                Else
                    Exit Do
                End If
                f = f + 1
            Loop
        End If
        n = n + 1
    Next

En ese código tienes todas las hojas, todos los coordinadores, todos los empleados, todos los listbox, todos los meses.

Con es código no importa que agregues o borres coordinadores, o agregues o borres empleados a los coordinadores.

Solamente tienes que identificar de alguna manera quién es coordinador y quién es empleado.

Hola Dante, gracias por responder.

Para cada coordinador le agrege un Rango de 20 filas, porque el dueño de la empresa me indico que cualquier coordinador debia tener como máximo 20 empleados.

Por ello cree 9 filas donde ingresan Coordinador, en cada fila de coordinador tienen 20 filas para ingresar sus empleados.

Por ejemplo: Para el primer coordinador le asigne 20 filas para que ingrese sus empleados, a ese Rango le asigne un nombre en este caso Mes de Diciembre, le asigne el nombre de: COOR_DICIEMBRE1, al siguiente coordinador COORD_DICIEMBRE2, y asi sucesivamente hasta el coordinador 9.

De ese modo, cuando ingreso un nombre en ComboBox, la macro verifica si ese nombre se encuentra en el COORDINADOR1, si el nombre ingresado es igual al coordinador1(imagen de arriba) entonces copia en rango de COORDINADOR1 al LISTBOX Diciembre, el cual es "COOR_DICIEMBRE1" y lo muestra en listbox Diciembre. Si el nombre no es igual al COORDINADOR1 entonces baja al siguiente COORDINADOR2, si el nombre es igual al coordinador2 entonces copia el rango de COORDINADOR2 "COOR_DICIEMBRE2". y asi sucesivamente, y si no encuentra el nombre en ninguna celda de coordinador entonces no muestra nada.
Entonces, ¿el código que me estas brindando, me ayudaria con lo que quiero?

El código hace lo que necesitas, pero tienes que ponerle una característica a cada coordinador, en la pregunta anterior tenías el coordinador en una celda combinada. Pero puedes utilizar una columna, excel tiene decenas de columnas, de hecho tu mismo estás utilizando la columna A para poner el texto "COORDINADOR"

Con la macro no tienes que poner 20 filas ni crear los Nombres.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas