VBA – Add Shape to Range in Excel
Adding shapes to a range in VBA with Excel is actually a trivial task, if you are aware of the Shapes.AddShape method. It has 5 parameters, 4 of which could be pretty easily remapped to the parameters of the range:
- Left – The position (in points) of the upper-left corner of the AutoShape’s bounding box relative to the upper-left corner of the document.
- Top – The position (in points) of the upper-left corner of the AutoShape’s bounding box relative to the upper-left corner of the document.
- Width – The width of the AutoShape’s bounding box, in points.
- Height – The height of the AutoShape’s bounding box, in points.
So, once we get a range that we want to add a shape to, the following method could be used:
Sub RangeToShape(myRange As Range, Optional customstyle As Long = 11)
Dim posLeft As Long
Dim posTop As Long
Dim posWidth As Long
Dim posHeight As Long
Dim myShape As Shape
posLeft = myRange.Left
posTop = myRange.Top
posWidth = myRange.Width
posHeight = myRange.Height
With myRange.Parent
Set myShape = .Shapes.AddShape(msoShapeRectangle, posLeft, posTop, posWidth, posHeight)
myShape.shapeStyle = customstyle
End With
End Sub
With the usage of it, once a range is passed, a form covering that exact range is returned. In the example below, all the cells with some values in them are covered by a consecutively colored form:
Option Explicit
Sub Main()
Dim myCell As Range
Dim customstyle As Long: customstyle = 11
For Each myCell In Worksheets(1).Range("A1:Z20")
If myCell.Value2 <> "" Then
If customstyle > 15 Then customstyle = 11
RangeToShape myCell, customstyle
customstyle = customstyle + 1
End If
Next myCell
End Sub
This is the initial input:

And the result, after running the code looks like this:

Enjoy it! 🙂