Funcionamiento erratico al establecer mediante vba un formato condicional

mailmaster

New Member
Joined
Jun 13, 2010
Messages
14
Ante todo, agradecer la atencion que se me preste e indicar que esta misma pregunta en mi mejor ingles posible esta posteada en el foro general.

Tengo una funcion y un procediminto en un modulo:
La funcion comprueba si hay una formula en una celda:
Code:
Function NoEsFormula(rRango As Range) As Boolean
    NoEsFormula = True
    If rRango.HasFormula = True Then
        NoEsFormula = False
    End If
End Function
y el procedimiento establece el formato condicional al rango:
Code:
Sub marcaSinformulas(rRango As Range)
    Dim miCondicion As FormatCondition
    Dim sPrimeraCelda As String
    Dim sCondicion As String
    Dim sCondicionR1C1 As String
    Dim sFormulaAbsuluta As String
    Dim rCelda As Range
    rRango.FormatConditions.Delete
    sPrimeraCelda = rRango.Cells(1, 1).Address
    sPrimeraCelda = Replace(sPrimeraCelda, "$", "")
    sCondicion = "=NoEsFormula(" & sPrimeraCelda & ")"
    'sCondicion = "=NoEsFormula(RC[-3])"
    On Error Resume Next
    rRango.FormatConditions.Add(Type:=xlExpression, Formula1:=sCondicion).Interior.ColorIndex = 36
End Sub
Pues bien, cuando trato de trazar la ejecucion, el excel se pierde, pero no da error que me pueda orientar, ni se cuelga, simplemente se detiene (detiene:desaparece la linea amarilla que marca el traceo de la ejecucion y esta no continua). Esto ocurre tras la ejecucion de la linea
Code:
rRango.FormatConditions.Add(Type:=xlExpression,  Formula1:=sCondicion).Interior.ColorIndex = 36
, independientemente de si pongo el
Code:
On Error Resume Next
o no. Ademas, si despues voy al rango y manualmente reviso el formato condicional de las celdas del rango, estas tienen la condicion bien puesta pero el formato esta sin asignar.

Intuyo que pueda ser un error de idioma o de traduccion de formato de direcciones A1 a R1C1 pero no se ni por que ni como solucionarlo.

La posible solucion de asignar con otra macro el formato tras usar esta para la condicion no es asumible puesto que el hilo de ejecucion se pierde de lo que puede derivar un comportamiento erratico.

Como no hay error que me pueda orientar, ando perdido.

Muchas gracias.
 

Excel Facts

Is there a shortcut key for strikethrough?
Ctrl+S is used for Save. Ctrl+5 is used for Strikethrough. Why Ctrl+5? When you use hashmarks to count |||| is 4, strike through to mean 5.
¡Hola!

Estuve probando tu macro y me parece que el problema se da al tratar de introducir como fórmula una Función Definida por el Usuario... en este caso la UDF NoEsFormula().



He probado tu misma macro ingresando cualquier otra función nativa de Excel y no he tenido problema... pero cuando se intenta ingresar la UDF se presenta el problema que mencionas:

Esto tiene problemas:

Code:
rRango.FormatConditions.Add(Type:=xlExpression, Formula1:="[COLOR="Blue"]=NoEsFormula(a1)[/COLOR]").Interior.ColorIndex = 36

Esto funciona bien:

Code:
rRango.FormatConditions.Add(Type:=xlExpression, Formula1:="[COLOR="Blue"]=esnumero(a1)[/COLOR]").Interior.ColorIndex = 36

estuve probando varias alternativas pero no logré encontrar ninguna que funcionara usando la UDF en el formato condicional (desde VBA).

¿Exactamente qué quieres hacer? Digo, porque si la intención es resaltar las celdas que no tienen fórmula depronto puedas probar algo así (o igual si explicas qué quieres hacer de pronto se pueda encontrar una buena alternativa):

Code:
Sub marcaSinformulas2(rRango As Range)


    On Error Resume Next
    
    
    With rRango
        
        .Interior.ColorIndex = 36
        
        .SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = xlNone
        
    End With

    
End Sub
 
Last edited:
Upvote 0
¿Exactamente qué quieres hacer? Digo, porque si la intención es resaltar las celdas que no tienen fórmula depronto puedas probar algo así (o igual si explicas qué quieres hacer de pronto se pueda encontrar una buena alternativa):
Lo que quiero es eso pero en modo dinamico, de modo que si cambio una formula por un dato quede reflejado de modo visual.
Es decir que tengo una hoja con datos que provienen de otras hojas (en modo formula) pero a veces necesito "redondear" esos datos manualmente y lo que quiero es que quede reflejado cuando cambio una formula por un dato numerico, de ahi el uso del formato condicional.
Lo tengo implementado en otras hojas y funciona bien, pero en esta me esta haciendo dar vueltas al asunto. Si quieres recibir una hoja con ambas implementaciones hazmelo saber.;)
 
Upvote 0
Lo que quiero es eso pero en modo dinamico, de modo que si cambio una formula por un dato quede reflejado de modo visual.
Es decir que tengo una hoja con datos que provienen de otras hojas (en modo formula) pero a veces necesito "redondear" esos datos manualmente y lo que quiero es que quede reflejado cuando cambio una formula por un dato numerico, de ahi el uso del formato condicional.

¿Y si usas una macro de evento? De pronto algo así en la hoja en la que quieres que lo que describes pase (sobre la pestaña de la hoja, con el botón derecho del ratón selecciona "ver código" y allí en el editor de VB, en el espacio en blanco, copias el código):

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    Target.Interior.ColorIndex = VBA.IIf(Target.HasFormula, xlNone, 36)
            
End Sub

Lo tengo implementado en otras hojas y funciona bien, pero en esta me esta haciendo dar vueltas al asunto.

Y en los casos en que sí te funciona, también lo estás haciendo con la UDF... es que por las pruebas que hice me parece bastante claro que el problema es por la UDF, que al ingresarla por medio de VBA en el formato condicional es 'rechazada'.... se me ocurre que debe ser porque de alguna forma VBA no reconoce la función y de ahí el fallo... claro, si creas el formato condicional directamente en Excel no tienes problemas ingresando la UDF, pero con VBA parece que sí hay problemas..... bueno, igual estoy especulando, que al igual que tú estoy en terreno desconocido con esta falla que tu encontraste :D.
 
Upvote 0
¿Y si usas una macro de evento?
Ya lo tengo hecho mediante un procedimiento que va recorriendo los distintos rangos y alli donde no hay una formula modifica el formato pero creo que seria mas eficiente y elegante via formato condicional.

igual estoy especulando, que al igual que tú estoy en terreno desconocido con esta falla que tu encontraste :D.
A mi me da que debe tener que ver con las traducciones internas del excel de funciones o de formato R1C1 - A1.
Abundando en mis pruebas, probando a introducir mi funcion manualmente (no programaticamente) en un formato condicional no da problemas. Si grabo la macro de la introduccion manual, me devuelve esto
(codigo rudo)
Code:
Sub Macro1()
    Range("C3:I19").Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=NoEsFormula(C3)"
    Selection.FormatConditions(1).Interior.ColorIndex = 36
End Sub
pero si trato de ejecutar ese codigo obtengo los mismos resultados que con mi procedimiento.
 
Upvote 0
MailMaster,

Muchas gracias por haber provisto un vínculo a la otra hilera donde Rory le ayudó. Hice una prueba con el sigiente UDF y me brindó el resultado esperado en el formateo condional haciendo las pruebas con Excel 2007.
Code:
Function udfNoEsFormula(rngInput As Excel.Range) As Boolean
 
    Application.Volatile True
 
    Let udfNoEsFormula = Not rngInput.Cells(1, 1).HasFormula
 
End Function
¿Con qué tipo de datos estaba fallando su UDF?
 
Last edited:
Upvote 0

Forum statistics

Threads
1,213,536
Messages
6,114,202
Members
448,554
Latest member
Gleisner2

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top