Eliminar muchos "IF" y utilizar el FOR para Excel Macros

Intento hacer un super código pero no logro hacerlo bien solo con los IF. Estoy tratando de recorrer las filas de una tabla y preguntar a cada rato si el nombre de la columna contiene la palabra Cierre.

Si en caso la contiene entonces tiene que coger la celda siguiente si es que esta llena, sino hacerle un control left para obtener el siguiente registro. Este es mi código que es enorme porque tengo como varios IF donde pregunto si la cabecera contiene la palabra cierre. Ayuda urgente please.

Tengo 3 botones: Procesar, Insertar y Actualizar. En el botón actualizar esta este código.

El objetivo es obtener le letra de la columna para poder aplicar esta fórmula, que también en esta en el código.

Les adjunto mi excel: http://1drv.ms/1KtLjuC 

For i = 3 To uf
    If (Cells(i, COLUMNA1) = "" Or Cells(i, COLUMNA1) = "n.d" Or Cells(i, COLUMNA2) = "" Or Cells(i, COLUMNA2) = "n.d") Then
    Cells(i, COLUMNA) = "S.D."
    Else
    Cells(i, COLUMNA) = Cells(i, COLUMNA1) - Cells(i, COLUMNA2)
    End If
Next

1 respuesta

Respuesta
1

Explícame con ejemplos reales lo que necesitas, no puedo descargar el archivo que pusiste, solamente puedo visualizar la hoja, pero no viene explicado lo que necesitas.

Si puedes poner imágenes de lo que necesitas.

Ok bien pero necesitas ver el código para que me puedas ayudar mejor.

Te explico, Tengo la Columna "Var Sem". La cual en esta columna realizo un cálculo automático por macro tomando las 2 columnas anteriores a la Columna Var Sem.

For i = 3 To uf
    If (Cells(i, COLUMNA1) = "" Or Cells(i, COLUMNA1) = "n.d" Or Cells(i, COLUMNA2) = "" Or Cells(i, COLUMNA2) = "n.d") Then
    Cells(i, COLUMNA) = "S.D."
    Else
    Cells(i, COLUMNA) = Cells(i, COLUMNA1) - Cells(i, COLUMNA2)
    End If
Next

Si te das cuenta en el archivo que te envié existe columnas de Cierre de Marzo, Cierre de Abril y mas adelante Cierre de Mayo hasta Diciembre.

Y también puedes notar que hay columnas 15/05, 22/05,etc.

Lo que yo hago es restar las dos columnas anteriores cuando estas sean diferentes de vacio y n.d. Si fuese el caso les pongo S.D.

Hasta ahora todo va bien. El problema viene ahora:

Me han pedido que filtre esos SD (Columna Var Sem)  y que obtenga por cada fila el valor mas cercano existente y que la cabecera o nombre del campo no contenga el nombre CIERRE. Es decir:

Esta imagen comienza de derecha a izquierda.

1. Filtro todos los SD.

2.tengo que buscar 2 valores para restarlos que en su nombre de campo no contenga la palabra Cierre.

3. Si en caso contiene la palabra cierre debe seguir buscando a la izquierda. Hasta encontrar 2 valores para restar.

4. Cuando encuentre el primero. Debe guardarse en una variable. y Continuar para buscar el siguiente.

5. Cuando encuentre el siguiente tambien guardarse en una variable.

6. Finalmente hacer el calculo para reemplazar el S.D. por la diferencia de los valores encontrados.

Te anexo la macro

Sub CambiarValorSd()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set b = Rows(2).Find("Var. Sem.", lookat:=xlWhole)
    If Not b Is Nothing Then
        col = b.Column
        fil = 3
        If ActiveSheet.AutoFilterMode Then [A2].AutoFilter
        u = Range("A" & Rows.Count).End(xlUp).Row
        [A2].AutoFilter
        ActiveSheet.Range(Cells(2, 1), Cells(u, col)).AutoFilter Field:=col, Criteria1:="S.D."
        For Each c In Range(Cells(3, col), Cells(u, col)).SpecialCells(xlCellTypeVisible)
            x = c.Column
            y = c.Row
            For j = c.Column To Columns("J").Column Step -1
                If IsNumeric(Cells(y, j)) And Cells(y, j) <> "" And Not UCase(Cells(2, j)) Like "*CIERRE*" Then
                    If var1 <> 0 Then
                        var2 = Cells(y, j)
                        Cells(y, x) = var1 - var2
                        var1 = 0
                        var2 = 0
                        Exit For
                    Else
                        var1 = Cells(y, j)
                    End If
                End If
            Next
        Next
    End If
    MsgBox "terminado"
End Sub

No entendí si era la variable1 menos la variable2, pero en esta línea de la macro puedes cambiarlas:

Cells(y, x) = var1 - var2

Saludos. Dante Amor

Recuerda valorar la respuesta.

¡Gracias! Vaya Dante. Es alucinante lo que puedes hacer. Ahora lo que voy hacer es aprender tu código para mejorar el mio en el futuro. Mil Gracias.

Dante, encontré un pequeño error. Al momento de crear una columna vacía(sin nombre) antes de la columna VAR. SEM. Y ejecutar el botón actualiza (tu código) me sale error en la siguiente línea:

ActiveSheet.Range(Cells(2, 1), Cells(u, col)).AutoFilter Field:=col, Criteria1:="S.D."

Yo hago esta prueba para que el código soporte de todo. Gracias

Está bien que realices todas las pruebas ya que pueden ser varias y no tengo todos los elementos que tú conoces para recrear todos los escenarios.

¿Dime qué error te envía?

Si, es cuando creo una columna vacía y presiono el botón actualizar. Me sale esto.

Gracias

Tienes que ponerle un texto al encabezado, todos los encabezados tienen que tener un texto

Tambien me sale esto:

Gracias

Eso sucede porque ya no hay datos con "S.D."

Para que no te aparezca ese error, antes del for pon esta línea

If Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Si esta correcto. Pero como le digo que quite los filtros al hacer el exit sub?

If Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Entonces cambia la línea por estas:

        If Range("A" & Rows.Count).End(xlUp).Row = 2 Then
            If ActiveSheet.AutoFilterMode Then [A2].AutoFilter
            Exit Sub
        End If

¡Gracias! Je je también estaba intentando eso pero me había olvidado cerrar el if. Gracias Dante. Estoy colgando otra pregunta ya que me han solicitado eso pero es un poco más complejo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas