Llevo la macro a mi hoja de trabajo y no funciona

Hola Valero

Hace unos días me enviaste esta macro respondiendo a mi pregunta del día 27 de Septiembre:

Private Sub Worksheet_Change(ByVal Target As Range)
'ValeroASM y DAM
Dim i, j, FilaFinal, repes As Integer
Dim UltChar, celda As String
Dim Datos() As Variant
If Not Intersect(Target, Range("A:C")) Is Nothing Then
    Columns("D:F").ClearContents
    Datos = Array("H", "Z", "X", "M", "Y", "P")
    For j = 1 To 3
        UltChar = UCase(Cells(1, j))
        repes = 1
        FilaFinal = Cells(Rows.Count, j).End(xlUp).Row
        For i = 2 To FilaFinal
            celda = UCase(Cells(i, j))
            If celda <> UltChar Or (celda <> Datos(j - 1) And celda <> Datos(j + 2)) Then
                UltChar = celda
                repes = 1
            Else
                repes = repes + 1
                If repes >= 3 Then
                    Cells(i + 1, j + 3) = 2 ^ (repes - 3) & IIf(UltChar = Datos(j - 1), Datos(j + 2), Datos(j - 1))
                End If
            End If
        Next
    Next
End If
End Sub

Funciona perfectamente cuando la pruebo en una hoja de Excel nueva. Hace exactamente lo que yo necesito.

El problema me surge cuando la pongo en el libro de Excel donde tengo los datos. Allí no hace nada.

Pensé que trasladando solo los contenidos de las celdas a otras en las cuales aplicar tu macro funcionaria y por eso te repregunté y luego realice la pregunta del dia 2, pero tampoco funciona.

He llegado a la conclusión de que debe ser porque las celdas de mi hoja de trabajo tienen una formula por la que llego a esa letra, concretamente son las siguientes:

COLUMNA A

=SI(I5="";"";SI(RESTO(I5;2)=0;"H";"M"))

COLUMNA B

=SI(I5="";"";SI(I5>50;"Y";SI(I5<50;"Z")))

COLUMNA  C    

=SI(I5="";"";SI(I5=0;"CERO";SI(I5=1;"X";SI(A5=2;"P";))))

El caso es que estoy atascado. Tengo la solución perfecta a lo que necesito pero no se hacerle funcionar.

Si pudieras ayudarme a resolverlo te estaría enormemente agradecido.

Un cordial saludo.

(PD) Si necesitas un ejemplo gráfico de la cuestión puedo enviártelo a donde me digas)

1 Respuesta

Respuesta
1

Mucho mejor que un ejemplo gráfico será que me mandes el libro a:

[email protected]

Lo que pasa es que ahora tengo que dormir y luego varias horas de trabajo, tardaré en verlo.

Ya está. Es que en el enunciado no habías planteado todo el problema. Nosotros pensábamos que tu modificabas directamente las columnas A, B y C, por eso habíamos hecho que la macro solo se ejecutase al modificarse una celda de esas columnas. Pero si se hace indeirectamente a trave de una fórmula y la modificación real se hace en la columna I al llegar al código como se está modificando otra columna no hace nada. Lo que no entiendo es porque si realmente se modifican celdas de A, B y C no se ejecute. Debe ser que excel solo genera el evento Change para celdas modificadas directamente por teclado, la verdad que no lo entiendo.

Pero lo que importa es que ya sabemos que no funciona y por qué y se le puede dar una solución fácil, hacer que se ejecuten los cáculos cuando se cambien los valores de la columna I, simplemente hay que cambiar esta línea

If Not Intersect(Target, Range("A:C")) Is Nothing Then

por esta otra

If Not Intersect(Target, Range("A:C")) Is Nothing  Or (Not Intersect(Target, Range("I:I")) Is Nothing) Then

con lo cual la macro completa queda así

Private Sub Worksheet_Change(ByVal Target As Range)
'ValeroASM y DAM
Dim i, j, FilaFinal, repes As Integer
Dim UltChar, celda As String
Dim Datos() As Variant
If Not Intersect(Target, Range("A:C")) Is Nothing _
    Or (Not Intersect(Target, Range("I:I")) Is Nothing) Then
    Columns("D:F").ClearContents
    Datos = Array("H", "Z", "X", "M", "Y", "P")
    For j = 1 To 3
        UltChar = UCase(Cells(1, j))
        repes = 1
        FilaFinal = Cells(Rows.Count, j).End(xlUp).Row
        For i = 2 To FilaFinal
            celda = UCase(Cells(i, j))
            If celda <> UltChar Or (celda <> Datos(j - 1) And celda <> Datos(j + 2)) Then
                UltChar = celda
                repes = 1
            Else
                repes = repes + 1
                If repes >= 3 Then
                    Cells(i + 1, j + 3) = 2 ^ (repes - 3) & IIf(UltChar = Datos(j - 1), Datos(j + 2), Datos(j - 1))
                End If
            End If
        Next
    Next
End If
End Sub

Y eso es todo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas