Sumar columnas salteadas con opción de saltear 3 o 4 columnas

Del foro, quisiera saber si hay una fórmula o código que me permita sumar filas de varias columnas(e5:e100;h5:h100;k5:k100... Etc)sin tener que introducir las columnas sino que ponga el rango(e5:w100) y cuantas columnas debe saltearse;el resultado seria de cada fila(ejemplo:

1)e5+h5+k5...=x 2)e6+h6+k6=x,etc hasta la fila 100)

1

1 respuesta

Respuesta
1

Este es el código que debes utilizar:

Sub sumar()

rango = InputBox("Rango", "Rango", vbOKOnly)
saltar = InputBox("Columnas a saltar", "Salto", vbOKOnly)
Range(rango).Select
w = Selection.Rows.Count
Selection.Cells(1, 1).Select
celda = ActiveCell.Address

j = 0
For i = 1 To w
j = j + 1
numero = ActiveCell.Value

Do While ActiveCell.Value <> ""
ActiveCell.Offset(0, saltar + 1).Select
numero = numero + ActiveCell.Value
Loop

ActiveCell.Value = numero
Range(celda).Select
ActiveCell.Offset(j, 0).Select
Next

End Sub

Cuando ejecutes la macro, te saldrá un inputbox para el rango donde deberás teclear por ejemplo A1:J32

Luego otro inputbox para las columnas que quieras saltar, si tecleas 2, significa que dos columnas las va a excluir, o sea que sumaria las columnas 1,4,7 etc

La suma de cada fila se pone al final de cada fila del rango.

Espero te sirva, te dejo un enlace por si quieres descargar el ejemplo

Un saludo

https://www.dropbox.com/s/2cbya4demdl1yfy/cuenta%20y%20salta.xlsm?dl=0 

La verdad, me encanto ... una maravilla;pero te comento algo que tal vez fue mi error en no aclararlo bien;en vez del input box,podrás decirme como es "anotandolo"en el código(como el "' Sub sumar()
Ya que la cantidad de columnas la determinare una sola vez al igual que el rango de celdas, que aun no lo determine bien(por ejemplo "e10:cu100" columnas a saltear "2"Por otro lado el resultado quiero que lo ponga en la ultima columna elegida(ahora no lo hace)y que sume así como ahora pero cada fila de todas las columnas

(e10:cu10=20              e11:cu11=25     e12:cu12=53 ,etc y el resultado en cv 10,cv11,cv12,etc

Creía que el rango seria variable, por eso puse el inputbox.

No acabo de ver clara cual es tu necesidad. ¿Puedes hacer un ejemplo en un excel y poner la imagen comentándola?

ok,te pido disculpas,agradezco tu paciencia, adjunto lo solicitado y te agrego algo mas de ser factible;lo que suma son las celdas sombreadas en cada columna y lo pone al final(achique la cantidad de columnas para

poder visualizarlo,ya que en realidad creo que llego a la columna "cv10" y  a la fila 100)

lo que agregue ,si se puede,es que sume en esa otra columna,solamente aquellos valores donde la fecha coincida o sea inferior(0<)q la fecha del dia,es decir que todo lo que este x debajo de la fecha del dia los sumara alli(en la 2da fila donde suma x fecha me equivoque,deberia decir 1,no 3)

El código que te servirá sera:

Sub sumar()

Range("A2:R12").Select
w = Selection.Rows.Count
v = Selection.Columns.Count
Selection.Cells(1, 1).Select
celda = ActiveCell.Address
Numero = ActiveCell.Value

j = 0
inicio:
Range(celda).Select
ActiveCell.Offset(j, 0).Select
Numero = ActiveCell.Value
For i = 1 To v
ActiveCell.Offset(0, 1).Select
If IsNumeric(ActiveCell.Value) = True Then
Numero = Numero + ActiveCell.Value
Else
End If
Next
ActiveCell.Value = Numero
j = j + 1
If j < w Then
GoTo inicio
Else
End If

j = 0
inicio2:
Numero = 0
Range(celda).Select
ActiveCell.Offset(j, 1).Select
If ActiveCell.Value <= Date Then
ActiveCell.Offset(0, -1).Select
Numero = ActiveCell.Value
Else
ActiveCell.Offset(0, -1).Select
Numero = 0
End If
For i = 1 To v
ActiveCell.Offset(0, 1).Select
If IsNumeric(ActiveCell.Value) = True Then
ActiveCell.Offset(0, 1).Select
If ActiveCell.Value <= Date And ActiveCell.Value <> "" Then
ActiveCell.Offset(0, -1).Select
Numero = Numero + ActiveCell.Value
Else
ActiveCell.Offset(0, -1).Select
End If
Else
End If
Next
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Numero
j = j + 1
If j < w Then
GoTo inicio2
Else
End If

End Sub

Solo es necesario que cambies el rango en negrita A2:R12 por el tuyo

Te dejo mi archivo en dropbox

Un saludo

https://www.dropbox.com/s/97ty575ofzu84gs/cuenta%20y%20salta3.xlsm?dl=0 

Hola, ante todo, es esp... pec... ta... cu.. lar, te felicito ;te hago un comentario y consulta

1)Si lo ejecutas 1 vez sale bien, pero la 2da vez que lo ejecutas, en vez de sumar las columnas,también suma el resultado anterior de la ultima columna y lo suma medio raro y la 3era vez más raro aun;debería borrar el saldo anterior sumado y que quede el nuevo valor en ambas columnas finales al ejecutar la macro

2)Solo para aprender, ¿dónde es que debería cambiar el numero de columnas a saltear?

3)Que me aconsejarías estudiar para este tipo de programación(por ahora solo manejo fórmulas y "programo"jejejeje con el grabador de macros y agrego a veces un poco de lógica)

disculpa,no se si me explique bien de cual es el error que hace

¿Puede ser que hayas incluido en el rango los sumatorios?

Escribí otra solución sin macros, solo con fórmulas, pero no se ha publicado. El lunes tendré acceso y lo reenvío.

no,no esta incluido en el rango;yo puedo subirte si hace falta el archivo al dropbox,avisame

Para evitar el error que comentas debes escribir al principio de la macro:

Range("S2:T12").Select

Selection. Clearcontents

Cambiando el rango S2:T12 por tu rango de resultados

El numero de columnas a saltar no lo especifica, ya que solo suma números, con lo cual saltará las casillas de quengan fechas, blancos etc...

hola, que tal

1)con el clearContents queda perfecto;2)el libro ese lo empezare a leer de inmediato(jejeej)(mil gracias);3)la solución sin macros, solo con fórmulas aun no la subiste,no?

La subí, pero no se que pasa que a veces no publica.

La solución con fórmulas que he hecho es:

En la primera imagen puedes ver en formato fórmulas y en la segunda el resultado final

La idea es usar una columna de cálculo intermedio, en es te caso la C y la F para que ponga la cantidad en negativo si la fecha es mayor que hoy. Esta columna puedes ubicarla donde quieras.

Luego utilizando la fórmula SUMAR. SI y SUMAR. SI. CONJUNTO ya obtienes los resultados

La única condición para que funciones es que la cantidad no sea superior a 42.000 unidades. En caso de superar habría que pensar un poco más como solucionarlo :-)

Hola,recién hoy me pude conectar, disculpa la demora;la 2da parte de loa fórmula me da error;podrás subir el excel al dropbox para verla

Perdón por la demora, pues estuve unos días afuera;por ahora estoy trabajando con las fórmulas y parece ir todo bien;ni bien confirme todo te voto así lo doy por cerrado;gracias

Ok

Bueno, la verdad... maravilloso lo tuyo, anda perfecto todo (seria lindo si pudiera haber una manera de que si pudiera "especificar la cant de columnas a saltear"por si quisiera usar esto a futuro en otro tipo de planilla y hubiere columnas que no quiera sumar, pero al menos en esta planilla me anda barbaro;millón de gracias y te felicito por la solución que me distes
gracias y saludos

Si no funciona en otros, con alguna pequeña modificación funcionará

:-)

Ja ja, si es cierton pero esa modificación la deberás hacer vos ya que yo no se como gracias, abrazo

disculpa,me encuentro con un problema que no habia previsto;cuando llega a la fecha(columna c=0)se puede agregar un comando que borre los datos de la fila a y b(si c2=0;a2 y b2="")(esto luego de que yo ejecuto una macro donde copio y pego esos valores;se entiende?(¿O sea que seria un comando para agregar a mi macro)tal vez debería mandarte el archivo para que se entienda mejor?

A ver si lo he entendido. Quieres que si c2 = 0 entonces borre a2 y b2.

Ten en cuenta que eso modificará las columnas de totales

Así es porque previamente a que los borre,en la macro que ejecuto, copio y pego esos valores en otro lado(en realidad es (si F10=0;BORRA D10 Y E10);en realidad no copio esos valores sino la diferencia con los nuevos... por las dudas te adjunto la macro pero sino pásame el código que yo luego lo inserto en donde lo deseo

(Los datos los copio desde acá:

Range("cx10:cx90").Select
Selection.Copy)

Pero solo para comentártelo

Sub copiaingresoacolado()
'
' copiaingresoacolado Y AGREGUE Q COPIA NUEVOS VENCIDOS Macro
'
'
    Range("B10:B90").Select
    Selection.Copy
    ActiveSheet.Next.Select
    Range("E10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("F10:F90").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("D10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("E10:E90").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    ActiveSheet.Previous.Select
    Range("b10").Select
    ' copiaypeganuevosvencidos Macro
'
    Range("cx10:cx90").Select
    Selection.Copy
    Sheets("STOCK").Select
    Range("J10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    'aca pegar de nuevo lo anterior pero en col e y que se reste de f y lo pegue en d
    Range("e10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("K10:K90").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("I10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
   Range("j10:j90").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("G10:G90").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("D10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("E10:E90").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("D10").Select
    Sheets("carga diaria").Select
    Range("cv10:cv90").Select
    Selection.Copy
    Range("cw10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("d10").Select
End Sub

Te adjunto un par de códigos:

Sub borra()
If Range("F10").Value = 0 Then
Range("D10:E10").Value = ""
End If
End Sub

Este simplemente evalúa si F10 = 0 y en caso afirmativo borra D10 y E10

Sub borra2()
ultlinea = Range("F" & Rows.Count).End(xlUp).Row - 9
Range("F10").Select
For i = 1 To ultlinea
If ActiveCell.Value = 0 Then
Range(Cells(ActiveCell.Row, 4), Cells(ActiveCell.Row, 5)).Value = ""
End If
ActiveCell.Offset(1, 0).Select
Next

End Sub

Este otro supone que los datos empiezan en F10 y sigue en F11, F12, F13... hasta el final

buen dia!la 2da opcion funciona pérfectisimo,solo que deberia funcionar en todas las columnas;(o sea que busca el 0 en F,I,L,O ....etc)el unico problema que le veo es que es medio lento el avance,no?pero funcionar funciona perfecto

Es decir, esta ok la 2da opción pero para el rango de columnas que le indique, no solo para 1 columna

¿Cuántas columnas tienes por evaluar?

Utiliza nuevos hilos para nuevas preguntas

Hola, no es nueva pregunta, solo que en vez de sumar una columna debe sumar, respondiendo a tu consulta, en un rango de aprox.50 columnas(al margen te comento que estoy usando la opción de las fórmulas y anda excelente,así que puedo dejar esa opción y listo

Entre "como sumar una fila saltándose X columnas" y "si una celda es 0 borrar las dos contiguas" yo veo una diferencia...

He escrito este código basándome en la primera imagen de este post pero con la primera columna en F, no en E, supongo que te funcionará:

Sub borra2()

ultlinea = Range("F" & Rows.Count).End(xlUp).Row - 9
Range("F10").Select
celda = ActiveCell.Address
n = 0
inicio:
For i = 1 To ultlinea
If ActiveCell.Value = 0 Then
Range(Cells(ActiveCell.Row, 4 + n), Cells(ActiveCell.Row, 5 + n)).Value = ""
End If
ActiveCell.Offset(1, 0).Select
Next
n = n + 3
Range(celda).Select
ActiveCell.Offset(0, n).Select

If ActiveCell.HasFormula = True Then
Application.ScreenUpdating = True
Exit Sub
Else
GoTo inicio
End If
End Sub

1)Tienes razón, ahora veo lol de las 2 preguntas 2)aun sigue funcionando solo para el primer grupo de columnas(d/e/f) y no con las siguientes

¿En la celda I10 hay una fórmula?

Así es;como figura en la foto, las columnas en rojo tienen la misma fórmula hasta la columna CR

Entonces prueba así:

Sub borra2()

ultlinea = Range("F" & Rows.Count).End(xlUp).Row - 9
Range("F10").Select
celda = ActiveCell.Address
n = 0
inicio:
For i = 1 To ultlinea
If ActiveCell.Value = 0 Then
Range(Cells(ActiveCell.Row, 4 + n), Cells(ActiveCell.Row, 5 + n)).Value = ""
End If
ActiveCell.Offset(1, 0).Select
Next
n = n + 3
Range(celda).Select
ActiveCell.Offset(0, n).Select

If ActiveCell.HasFormula = True Then

GoTo inicio
Else
Application.ScreenUpdating = True
Exit Sub
End If
End Sub

Bárbaro, ahora si, solo que como te dije debe ir solo hasta la columna cr, ya que después tengo otras fórmulas y me las borro

Entonces amplia la restricción a:

If ActiveCell.HasFormula = True And Activecell.Column < 97 Then

Prueba ahora

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas