La macro se basa en un truco publicado por "sagrat" en el foro de Ayuda Excel: Pegar color del formato condicional.
Sagrat menciona que se puede copiar el rango de datos con formato condicional a Word y luego copiarlo de vuelta a Excel, lo que hace que el formato dado por el formato condicional quede como formato de celda.
La macro, que se basa en este truco, crea una instancia invisible de Word y pasa a copiar a Word e inmediatamente a copiar de vuelta a Excel las celdas con formato condicional de cada una de las hojas del libro activo. Esto tiene 3 efectos:
- Convierte todas las fórmulas de las celdas con formato condicional de cada hoja del libro activo a valores;
- Convierte el formato condicional de todas las celdas con formato condicional de cada hoja del libro activo a formato de celda;
- Usa la precisión visible en la celda. Es decir, si la celda con formato condicional tiene formato para mostrar dos decimales, pero el valor en la celda tiene más de dos decimales, tras ejecutar la macro, el valor resultante sólo tendrá los dos decimales visibles, perdiéndose los demás.
Sub BorrarFormatoCondicional_LibroActivo()
Dim WordApp As Object
Dim wsHoja As Excel.Worksheet
Dim rngArea As Excel.Range
Dim rngCeldasFormatoCondicional As Excel.Range
On Error GoTo err_BorrarFormatoCondicional
With Application
.ScreenUpdating = False
.StatusBar = "Creando instancia de Word..."
End With
Set WordApp = CreateObject("Word.Application")
For Each wsHoja In ActiveWorkbook.Worksheets
Set rngCeldasFormatoCondicional = wsHoja.UsedRange.SpecialCells(xlCellTypeAllFormatConditions)
If Not rngCeldasFormatoCondicional Is Nothing Then
wsHoja.Select
For Each rngArea In rngCeldasFormatoCondicional.Areas
With rngArea
.Select
.Copy
End With
With WordApp
.documents.Add
With .Selection
.PasteSpecial
.wholestory
.Copy
.Delete
End With
End With
wsHoja.PasteSpecial "HTML"
Next rngArea
End If
Next wsHoja
Salir:
If Not WordApp Is Nothing Then
WordApp.Quit False
Set WordApp = Nothing
End If
With Application
.StatusBar = False
.ScreenUpdating = True
End With
Exit Sub
err_BorrarFormatoCondicional:
If Err.Number = 1004 Then
Resume Next
Else
MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, Err.Source
Resume Salir
End If
End Sub
Si sólo se desea copiar uno o varios rangos de una hoja, se puede probar de la siguiente forma, seleccionando cuando la macro lo pida los rangos en cuestión:
Sub BorrarFormatoCondicional_Seleccion()
Dim WordApp As Object
Dim rngTrabajo As Excel.Range
Dim rngArea As Excel.Range
Dim rngCeldasFormatoCondicional As Excel.Range
On Error GoTo err_BorrarFormatoCondicional
Set rngTrabajo = Application.InputBox(Prompt:="Por favor, seleccione el rango de celdas con el que desea trabajar.", _
Title:="Fijar formato condicional", _
Type:=8)
Application.ScreenUpdating = False
Set rngCeldasFormatoCondicional = rngTrabajo.SpecialCells(xlCellTypeAllFormatConditions)
If Not rngCeldasFormatoCondicional Is Nothing Then
Set WordApp = CreateObject("Word.Application")
For Each rngArea In rngCeldasFormatoCondicional.Areas
With rngArea
.Select
.Copy
End With
With WordApp
.documents.Add
With .Selection
.PasteSpecial
.wholestory
.Copy
.Delete
End With
End With
Selection.Parent.PasteSpecial "HTML"
Next rngArea
Set rngCeldasFormatoCondicional = Nothing
End If
Salir:
If Not WordApp Is Nothing Then
WordApp.Quit False
Set WordApp = Nothing
End If
Application.ScreenUpdating = True
Exit Sub
err_BorrarFormatoCondicional:
If Err.Number <> 424 Then
MsgBox "Error " & Err.Number & ": " & Err.Description, vbInformation, Err.Source
End If
Resume Salir
End Sub
Hola soy sagrat
ResponderSuprimirEsta muy interesante tu macro,ya que pudiste resolver lo que yo hice artesanalmente paso a paso.
Esta solucion se que le servira a muchas personas que tienen el mismo problema y es primera vez que encuentro una solucion mas automatizada.
Muchas gracias.