Mi VBA actual proporciona una función de suma para columnas predefinidas dentro de hojas de trabajo que se especifican y definen en el código. Esto funciona bien, sin embargo, estoy agregando nuevas hojas de trabajo a este libro de trabajo a diario y, por lo tanto, no es posible editar el código todos los días para agregar una nueva hoja de trabajo y un rango para sumar.

¿Hay alguna manera de que pueda editar mi código actual para que realice la función de suma para cada hoja de trabajo en el libro de trabajo? Adjunto el código actual como referencia a continuación.

    Sub AutoSum()
Sheets("MASTER ACCOUNT REVENUE").Select
Range("D4").Select
Selection.End(xlDown).Select
ActiveCell.Offset(2, 0).Select
Dim cel1 As String, cel2 As String
cel1 = ActiveCell.Offset(-2, 0).End(xlUp).Address
cel2 = ActiveCell.Offset(-1).Address
ActiveCell.Value = "=sum(" & (cel1) & ":" & (cel2) & ")"
End Sub
0
NHure92 16 oct. 2018 a las 18:03

2 respuestas

La mejor respuesta

Sí, simplemente recorre las hojas. NOTA: Es mejor evitar el uso de .Select / {{X1 }}

Sub autoSum_AllSheets()
Dim ws As Worksheet
Dim cel1 As String, cel2 As String
Dim firstCel As Range

For Each ws In ActiveWorkbook.Worksheets
    With ws
        Set firstCel = .Range("D4").End(xlDown).Offset(2, 0)
        cel1 = firstCel.Offset(-2, 0).End(xlUp).Address
        cel2 = firstCel.Offset(-1).Address
        firstCel.Value = "=SUM(" & cel1 & ":" & cel2 & ")"
    End With
Next ws

End Sub

Nota: Soy consciente de las redundancias en las partes Offset(), pero las guardé para OP para ver cómo evitar más fácilmente .Select / .Activate.

Editar: para recorrer un montón de columnas, una forma (aunque kludgy) es simplemente agregar las letras de las columnas a una matriz:

Sub autoSum_AllSheets()
Dim ws As Worksheet
Dim cel1 As String, cel2 As String
Dim firstCel As Range

Dim cols() As Variant
cols = Array("D", "E", "F")

Dim i As Long
For Each ws In ActiveWorkbook.Worksheets
    With ws
        For i = LBound(cols) To UBound(cols)
            Set firstCel = .Range(cols(i) & "4").End(xlDown).Offset(2, 0)
            firstCel.Select
            cel1 = firstCel.Offset(-2, 0).End(xlUp).Address
            cel2 = firstCel.Offset(-1).Address
            firstCel.Value = "=SUM(" & cel1 & ":" & cel2 & ")"
        Next i
    End With
Next ws

End Sub

Sin embargo, tenga en cuenta que si la columna no tiene información en una celda después de la fila 5, obtendrá un error (porque la .XlDown va a la última fila y puede ' t luego Offset(2,0) desde allí.)

2
BruceWayne 16 oct. 2018 a las 15:27

Sí agregue:

Dim wscount as long
dim i as long
     wscount = Activeworkbook.Worksheets.Count
 for i = 1 to wscount
Sheets(i).Select
Range("D4").Select
 Selection.End(xlDown).Select
ActiveCell.Offset(2, 0).Select
Dim cel1 As String, cel2 As String
cel1 = ActiveCell.Offset(-2, 0).End(xlUp).Address
cel2 = ActiveCell.Offset(-1).Address
ActiveCell.Value = "=sum(" & (cel1) & ":" & (cel2) & ")"
next i 

End Sub

0
yossup 16 oct. 2018 a las 15:07