¿Como puedo ajustar este código?

He hecho este código

Private Sub cmdcalc_Click()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim Ncond_Ini As Range
Dim Vitem_Ini As Range
Dim Vins_Ini As Range
Dim Evn_Ini As Range
Set Ncond_Ini = Range("A4")
Set Vitem_Ini = Range("T3")
Set Vins_Ini = Range("E4")
Set Evn_Ini = Range("A4")
'
Ncond = Ncond_Ini.Value
Vitem = Vitem_Ini.Value
Vins = Vins_Ini.Value
Evn = Evn_Ini.Select
Set h = ActiveSheet
'
For i = 4 To h.Range("A" & Rows.Count).End(xlUp).Row 'Se inicia desde la fila 4 y se va hasta la última fila con datos
    If Ncond <> 1 Then 'Ncond siempre será un dato de la Columna A y si este dato es diferente de 1...
        Evn = ActiveCell.Offset(0, 18).Select 'Se ira a la Columna S y hará una pegara el resultado de una multiplicacion
        Resl = Vins * Vitem 'Acá se multiplican las variables cuyos datos se extraen de las columnas E y T respectivamente
        ActiveCell = Resl
        ' En toda esta sección se actualizan la variables para hacer el mismo proceso anterior con la fila siguiente
        Set Ncond_Ini = Ncond_Ini.Offset(1, 0)
        Set Vins_Ini = Vins_Ini.Offset(1, 0)
        Set Evn_Ini = Evn_Ini.Offset(1, 0)
        Ncond = Ncond_Ini.Value
        Vitem = Vitem_Ini.Value
        Vins = Vins_Ini.Value
        Evn = Evn_Ini.Select
    Else 'Si el valor de la columna A es 1 solo se actualizan los datos para hacer el mismo proceso con la fila siguiente
        Set Ncond_Ini = Ncond_Ini.Offset(1, 0)
        'Set Vitem_Ini = Vitem_Ini.Offset(1, 0)
        Range("T27").Select 'Esta linea y la siguiente son las que debo modificar
        Selection.End(xlDown).Select
        Set Vins_Ini = Vins_Ini.Offset(1, 0)
        Set Evn_Ini = Evn_Ini.Offset(1, 0)
        Ncond = Ncond_Ini.Value
        Vitem = Vitem_Ini.Value
        Vins = Vins_Ini.Value
        Evn = Evn_Ini.Select
    End If
Next i
Application.ScreenUpdating = True
Application.DisplayAlerts = True

La razón por la que debo corregir las lineas que mencione en el código es que cada vez que el valor de la Columna "A" sea 1 se debe hacer la función equivalente a Ctrl + Flecha abajo para que los Vins se multipliquen con el Vitem que les corresponde, tratare de explicarme con las siguiente imagen

La idea que los datos de la Columna E se multipliquen por los de la columna T, si se fijan en la columna V les muestro el resultado esperado, y en la columna X una formula con la que les ejemplifico como es la multiplicación. Entonces en la imagen podrán ver que si A4 es diferente de 1, E4 se multiplicara con T3 y así hasta llegar a A8 (en este caso) ya que A9 (aunque no se vea) es 1, por lo cual debe hacer caso omiso y seguir a A10 con el cual se hará la misma formula solo que está vez en caso de que se cumpla la condición se multiplicara con T9 y así sucesivamente (adjunto el archivo para que ustedes mismos vean como trabaja) Este es el archivo

El problema es que como tengo planteada las 2 lineas problemas siempre se trabajara con T9. Espero lograr transmitir mi problema con claridad, en caso de que necesiten más claridad tratare de dárselas.
Nota: Cuando en la Columna A aparece un 1, inmediatamente se debe pasar a multiplicar con el siguiente, pues como verán en la siguiente imagen cuando hay un 1 en la Columna A, aparece un nuevo valor en la Columna T

Nota 2: En el archivo que adjunte verán 2 hojas, una en la que ya corrí la macro (Esta hoja se llama Inf) y les muestro el resultado de la macro(El resultado es el de la Columna S en las celdas pintadas) y les muestro el resultado esperado (Que es el de la Columna V (Este resultado esperado lo hice con la formula, la cuál también les puede ayudar para tener mejor claridad)). Y la hoja 2 (llamada Inf (Limpia) es para que ustedes mismo ejecuten la macro con el Botón que allí se ve.

1 respuesta

Respuesta
3

Te anexo la macro

Private Sub btncalc_Click()
'Por Dante Amor
    For i = 3 To Range("A" & Rows.Count).End(xlUp).Row
        If Cells(i, "A").Value = 1 Then
            fila = i
        Else
            Cells(i, "S").Value = Cells(i, "E").Value * Cells(fila, "T").Value
        End If
    Next
    MsgBox "Fin"
End Sub

Antes de ejecutar la macro, revisa las siguientes celdas:

T748, T822, T878, T1184, T1216, T1430

Al parecer tienes un espacio en blanco, eso provoca un error en la macro, simplemente borra la celda o escribe un cero.



'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 

Muchas gracias Dante, el código funciona perfecto y te agradezco también que me notificaras lo de las celdas. Me encanta la diferencia entre mi código que es largo y complicado, y el tuyo que es corto y elegante; aún me queda mucho por aprender para llegar a ese nivel de que con corto código haces una gran cantidad de cosas. Nuevamente muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas