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 Respuesta
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)
¿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.
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
El archivo en dropbox
https://www.dropbox.com/s/97ty575ofzu84gs/cuenta%20y%20salta3.xlsm?dl=0
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
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
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
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
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
- Compartir respuesta