¿Cómo usar dos macros casi iguales en un mismo libro?

Tengo una macro para hacer una suma dependiendo de lo que ponga en otras dos celdas, una de ellas especifica la hoja en que sumará y otra específica la palabra que se encontrará en la fila y así poder sumar dependiendo de la ubicación que ponga, necesito hacer el mismo proceso 2 veces, es decir, uso una tabla para registrar los gastos de cada mes, ahora quiero usar dos tablas, independientes, pero con la misma fórmula, solo necesito cambiar las celdas, el problema es que me da error, porque para que la macro funcione, en la celda en donde me dará el resultado llevará esto: =SI.ERROR(fcnCalcular(D13;"A";F13;"SUM");"") ,  entonces pongo =SI.ERROR(fcnCalcular(D14;"A";F14;"SUM");"")  en la celda en donde quiero la otra suma y me da error. Yo hice otro módulo y pegué la misma macro solo con las celdas modificadas y me da error, ¿qué podría hacer? 

1 Respuesta

Respuesta
1

Debieras dejar las macros publicadas aquí para una mejor comprensión de tu problema.

Y una imagen con la celda donde se pueda ver la fórmula (barra de fórmulas).

En la celda D15 y en la F15 hay dos listas desplegables para seleccionar la ubicación de donde se hará la suma, en la celda H15 es donde necesito duplicar la macro, si te fijas solo cambian las celdas, es la misma macro, pero no sé cómo ponerlo. 

Function fcnCalcular(rngCeldaCat As Range, strColCat As String, rngCeldaMes As Range, _
                     Optional strOp As String = "CUENTA") As Double
    'Por GP'
    Dim strMeses() As Variant
    Dim strCeldaCat As String, strCeldaMes As String, strCeldaResult As String
    Dim i As Integer, nFilas As Integer
    strMeses = Array("Todos", "ene", "feb", "mar", _
                    "abr", "may", "jun", "jul", _
                    "ago", "sep", "oct", "nov", "dic")
    If LCase(rngCeldaMes) = "todos" Then                    'Todos los meses'
        If LCase(rngCeldaCat) = "en general" Then           'Todas las categorías'
            For i = 1 To 12
                nFilas = Sheets(strMeses(i)).Range("E200").End(xlUp).Row
                If strOp = "SUM" Then
                    fcnCalcular = fcnCalcular + WorksheetFunction.Sum(Sheets(strMeses(i)).Range("E6:E" & nFilas))
                Else
                    fcnCalcular = fcnCalcular + WorksheetFunction.Count(Sheets(strMeses(i)).Range("E6:E" & nFilas))
                End If
            Next
        Else
            For i = 1 To 12                                 'Una categoría específica'
                nFilas = Sheets(strMeses(i)).Range("E200").End(xlUp).Row
                If strOp = "SUM" Then
                    fcnCalcular = fcnCalcular + WorksheetFunction.SumIf( _
                                                Sheets(strMeses(i)).Range(strColCat & "6:" & strColCat & nFilas), _
                                                LCase(rngCeldaCat), _
                                                Sheets(strMeses(i)).Range("E6:E" & nFilas))
                Else
                    fcnCalcular = fcnCalcular + WorksheetFunction.CountIf( _
                                                Sheets(strMeses(i)).Range(strColCat & "6:" & strColCat & nFilas), _
                                                LCase(rngCeldaCat))
                End If
            Next
        End If
    Else                                                    'Un mes específico'
        With Sheets(LCase(rngCeldaMes))
            nFilas = .Range("E200").End(xlUp).Row
            If LCase(rngCeldaCat) = "en general" Then       'Todas las categorías'
                If strOp = "SUM" Then
                    fcnCalcular = WorksheetFunction.Sum(.Range("E6:E" & nFilas))
                Else
                    fcnCalcular = WorksheetFunction.Count(.Range("E6:E" & nFilas))
                End If
            Else                                            'Una categoría específica'
                If strOp = "SUM" Then
                    fcnCalcular = WorksheetFunction.SumIf( _
                                        .Range(strColCat & "6:" & strColCat & nFilas), _
                                        LCase(rngCeldaCat), _
                                        .Range("E6:E" & nFilas))
                Else
                    fcnCalcular = WorksheetFunction.CountIf( _
                                        .Range(strColCat & "6:" & strColCat & nFilas), _
                                        LCase(rngCeldaCat))
                End If
            End If
        End With
    End If
End Function

Esa es la macro, como uso la misma dos veces, solo cambiando las celdas. Ahí está todo el proceso que se agotó para hacer esta macro por si te sirve de ayuda, gracias. ¿Se puede hacer una fórmula o macro para que recorra varias hojas contando lo que le especifique en otra celda?

No sé porqué mencionas que necesitas 2 macros si la función debe servir para cualquier celda.

Si observas en la imagen, lo que hice fue arrastrar la fórmula desde H14 a H15 tal como se hace con cualquier fórmula de Excel. Y el resultado es correcto según tu ejemplo de hoja que aparece en consulta anterior.

Sdos!

Y si necesitas la misma fórmula pero en otra tabla, usarás la misma ajustando las referencias, es decir dónde estarán tus datos.

Hice otro módulo y pegué la misma macro ...NO puedes tener 2 macros con el mismo nombre.

Sdos!

Saludos, gracias por tu ayuda amigo... En cuanto a tu respuesta, por eso te dije que creia necesario dos macros, pero me daba error, lo hize mal. Uso esa macro para 12 hojas con una tabla, pero ahora agregue otra tabla en cada una de las hojas, copie la macro en otro modulo y modifique las celdas y me da error, me gustaría saber si me puedes ayudar, ya que he intentado varias cosas y me da error, aqui te dejo una foto de la estructura de las 12 hojas: 

La idea es que en donde dice categoría ponga la categoría del gasto, en donde dice mes la hoja y en la tercera celda me haga la suma... Tengo dos celdas para cada tabla. Pero la segunda tabla la categoría está en la columna G, de la fila 6 a la 200 y el Importe está en la columna J de la fila 6 a la 200, entonces, son rangos diferentes a los que tiene la macro original. Yo no entiendo mucho estos temas, espero que me puedas ayudar y hacer entender esto, ya que soy un ignorante en estos temas... Gracias de antemano amigo. 

En primer lugar sería amiga, me llamo Elsa ;)

En otro módulo coloca esta otra función. Es la misma pero tiene otro nombre y nuevos rangos de suma. En lugar de col E se hará referencia a J.

Y en todos los resultados (en la macro) se debe hacer mención al nuevo nombre de la función.

Function fcnCalculando(rngCeldaCat As Range, strColCat As String, rngCeldaMes As Range, _
                     Optional strOp As String = "CUENTA") As Double
    'Por GP - Adaptada x Elsamatilde
    Dim strMeses() As Variant
    Dim strCeldaCat As String, strCeldaMes As String, strCeldaResult As String
    Dim i As Integer, nFilas As Integer
    strMeses = Array("Todos", "ene", "feb", "mar", _
                    "abr", "may", "jun", "jul", _
                    "ago", "sep", "oct", "nov", "dic")
    If LCase(rngCeldaMes) = "todos" Then                    'Todos los meses'
        If LCase(rngCeldaCat) = "en general" Then           'Todas las categorías'
            For i = 1 To 12
                nFilas = Sheets(strMeses(i)).Range("J200").End(xlUp).Row
                If strOp = "SUM" Then
                    fcnCalculando = fcnCalculando + WorksheetFunction.Sum(Sheets(strMeses(i)).Range("J6:J" & nFilas))
                Else
                    fcnCalculando = fcnCalculando + WorksheetFunction.Count(Sheets(strMeses(i)).Range("J6:J" & nFilas))
                End If
            Next
        Else
            For i = 1 To 12                                 'Una categoría específica'
                nFilas = Sheets(strMeses(i)).Range("E200").End(xlUp).Row
                If strOp = "SUMA" Then
                    fcnCalculando = fcnCalculando + WorksheetFunction.SumIf( _
                                                Sheets(strMeses(i)).Range(strColCat & "6:" & strColCat & nFilas), _
                                                LCase(rngCeldaCat), _
                                                Sheets(strMeses(i)).Range("J6:J" & nFilas))
                Else
                    fcnCalculando = fcnCalculando + WorksheetFunction.CountIf( _
                                                Sheets(strMeses(i)).Range(strColCat & "6:" & strColCat & nFilas), _
                                                LCase(rngCeldaCat))
                End If
            Next
        End If
    Else                                                    'Un mes específico'
        With Sheets(LCase(rngCeldaMes))
            nFilas = .Range("J200").End(xlUp).Row
            If LCase(rngCeldaCat) = "en general" Then       'Todas las categorías'
                If strOp = "SUMA" Then
                    fcnCalculando = WorksheetFunction.Sum(.Range("J6:J" & nFilas))
                Else
                    fcnCalculando = WorksheetFunction.Count(.Range("J6:J" & nFilas))
                End If
            Else                                            'Una categoría específica'
                If strOp = "SUM" Then
                    fcnCalculando = WorksheetFunction.SumIf( _
                                        .Range(strColCat & "6:" & strColCat & nFilas), _
                                        LCase(rngCeldaCat), _
                                        .Range("J6:J" & nFilas))
                Else
                    fcnCalculando = WorksheetFunction.CountIf( _
                                        .Range(strColCat & "6:" & strColCat & nFilas), _
                                        LCase(rngCeldaCat))
                End If
            End If
        End With
    End If
End Function

 En la imagen se observa la escritura de la misma:

Sdos y no olvides valorar la respuesta (opciones: Excelente o buena)

Elsa

http://aplicaexcel.galeon.com/manuales.htm

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas