I wanted to expand on my previous post MS Excel Copy Gradient from One Cell or Range to Another so i came up with the following function that can handle both Solid and Gradient background fills.
'---------------------------------------------------------------------------------------
' Procedure : CopyBkGrnd
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website : http://www.cardaconsultants.com
' Purpose : Copy a Cell/Range's gradient fill properties from one Cell/Range to another
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' FromRange : Range that contains the Background properties to be copied
' ToRange : Range you wish to copy the Background properties to
'
' Usage:
' ~~~~~~
' CopyBkGrnd Range("B5"), Range("A1")
' CopyBkGrnd Sheet1.Range("B5"), Sheet2.Range("A1:B2")
'---------------------------------------------------------------------------------------
Function CopyBkGrnd(FromRange As Range, ToRange As Range)
On Error Resume Next
'Remove any existing settings
ToRange.ClearFormats
'Start Applying the new settings
ToRange.Interior.Pattern = FromRange.Interior.Pattern
If FromRange.Interior.Gradient.ColorStops.Count = 0 Then
'Solid Fill Color Properties
ToRange.Interior.PatternColorIndex = FromRange.Interior.PatternColorIndex
ToRange.Interior.Color = FromRange.Interior.Color
ToRange.Interior.TintAndShade = FromRange.Interior.TintAndShade
ToRange.Interior.PatternTintAndShade = FromRange.Interior.PatternTintAndShade
Else
'Gradient Fill Properties
ToRange.Interior.Gradient.RectangleLeft = FromRange.Interior.Gradient.RectangleLeft
ToRange.Interior.Gradient.RectangleRight = FromRange.Interior.Gradient.RectangleRight
ToRange.Interior.Gradient.RectangleTop = FromRange.Interior.Gradient.RectangleTop
ToRange.Interior.Gradient.RectangleBottom = FromRange.Interior.Gradient.RectangleBottom
ToRange.Interior.Gradient.Degree = FromRange.Interior.Gradient.Degree
ToRange.Interior.Gradient.ColorStops.Clear
For i = 1 To FromRange.Interior.Gradient.ColorStops.Count
With ToRange.Interior.Gradient.ColorStops.Add(i - 1)
.ThemeColor = FromRange.Interior.Gradient.ColorStops(i).ThemeColor
.TintAndShade = FromRange.Interior.Gradient.ColorStops(i).TintAndShade
.Color = FromRange.Interior.Gradient.ColorStops(i).Color
End With
Next i
End If
End Function
Thanks it was really helpful… however, it doesn’t work for all possible gradient formats possible by Cell Format > Fill Effects – Those with 3 colourstops don’t copy properly as the stops must be 0, 0.5, 1.
Here it clumsily modded but working version:
Function CopyBkGrnd(FromRange As Range, ToRange As Range)
On Error Resume Next
‘Remove any existing settings
ToRange.ClearFormats
‘Start Applying the new settings
ToRange.Interior.Pattern = FromRange.Interior.Pattern
If FromRange.Interior.Gradient.ColorStops.Count = 0 Then
‘Solid Fill Color Properties
ToRange.Interior.PatternColorIndex = FromRange.Interior.PatternColorIndex
ToRange.Interior.Color = FromRange.Interior.Color
ToRange.Interior.TintAndShade = FromRange.Interior.TintAndShade
ToRange.Interior.PatternTintAndShade = FromRange.Interior.PatternTintAndShade
ElseIf FromRange.Interior.Pattern = xlPatternLinearGradient Then
‘ case where a linear gradient with degree
ToRange.Interior.Gradient.Degree = FromRange.Interior.Gradient.Degree
ToRange.Interior.Gradient.ColorStops.Clear
If FromRange.Interior.Gradient.ColorStops.Count = 2 Then ‘ 2 colourstops gradient
For i = 1 To FromRange.Interior.Gradient.ColorStops.Count
Debug.Print i
With ToRange.Interior.Gradient.ColorStops.Add(i – 1)
.ThemeColor = FromRange.Interior.Gradient.ColorStops(i).ThemeColor
.TintAndShade = FromRange.Interior.Gradient.ColorStops(i).TintAndShade
.Color = FromRange.Interior.Gradient.ColorStops(i).Color
End With
Next i
ElseIf FromRange.Interior.Gradient.ColorStops.Count = 3 Then ‘ 3 colour stops!
For i = 1 To FromRange.Interior.Gradient.ColorStops.Count
Debug.Print i
With ToRange.Interior.Gradient.ColorStops.Add((i – 1) / 2) ‘range 0, 0.5, 1
.ThemeColor = FromRange.Interior.Gradient.ColorStops(i).ThemeColor
.TintAndShade = FromRange.Interior.Gradient.ColorStops(i).TintAndShade
.Color = FromRange.Interior.Gradient.ColorStops(i).Color
End With
Next i
Else ‘some other configuration, or not needed?
End If
Else
‘Gradient Fill Properties of boxes/squares
ToRange.Interior.Gradient.RectangleLeft = FromRange.Interior.Gradient.RectangleLeft
ToRange.Interior.Gradient.RectangleRight = FromRange.Interior.Gradient.RectangleRight
ToRange.Interior.Gradient.RectangleTop = FromRange.Interior.Gradient.RectangleTop
ToRange.Interior.Gradient.RectangleBottom = FromRange.Interior.Gradient.RectangleBottom
‘ToRange.Interior.Pattern = FromRange.Interior.Pattern
ToRange.Interior.Gradient.Degree = FromRange.Interior.Gradient.Degree
‘ToRange.Interior.Pattern = FromRange.Interior.Pattern ‘ davids mod
ToRange.Interior.Gradient.ColorStops.Clear
For i = 1 To FromRange.Interior.Gradient.ColorStops.Count
Debug.Print i
With ToRange.Interior.Gradient.ColorStops.Add(i – 1)
.ThemeColor = FromRange.Interior.Gradient.ColorStops(i).ThemeColor
.TintAndShade = FromRange.Interior.Gradient.ColorStops(i).TintAndShade
.Color = FromRange.Interior.Gradient.ColorStops(i).Color
End With
Next i
End If
End Function