I heard about 3D Objects from MrExcel. I’ve had fun combing a 3D model with VBA (it moves inside your spreadsheet!)
3D Objects
They have few practical uses but are fun to play with. In MrExcel’s words:
Unless you are an engineer, I am not sure how 3D Models has a business use. But it is a cool new feature.
MrExcel.com
I agree completely…not practical but definitely fun to play with.
Test: insert 3D Model
(older versions don’t have this feature). Follow these steps:
- on ribbon select Insert
- select Illustrations
- select 3D Models
- select Stock 3D models (select an ‘animated’ one!)
- select green Insert button

Once inserted you’ll notice it’s animated and you’ll see various options.

Why Use a 3D Model?
I used it to practice VBA . It’s silly but I learned/relearned a ton of VBA.
What Did I Do?
I added VBA so the dinosaur can move around and eat people!

Odd that the dinosaur is smaller than the people but you can resize them.
Instructions:
- click ‘Start’ button (repositions objects and resets stats)
- if dinosaur isn’t animated click it’s play button
- click green arrows to move the dinosaur
- figure out how to eat people (hints at bottom of post)
Where’s My Excel File?
It’s too large to include here but I explain how to rebuild it below.
Rebuilding My Excel File
XLSM Shell File
This small file has formulas, code, named ranges, buttons (but not the heavy 3D object).
Insert 3D Object & Icons
Insert 3D Dinosaur
Once again, steps to insert the dinosaur:
- on ribbon select Insert
- select illustrations
- select 3D models
- select dinosaur as seen below
- select green Insert button

Rename the dinosaur:
- ensure dinosaur is selected
- in name box (left of formula bar) rename it to Dino1
- press ‘Enter’ key to save changes
Note: the Excel file will now be about 28MB !!
Insert Cutout People
To insert cutout people icons:
- on ribbon select Insert
- select illustrations
- select icons
- select 5 Cutout People
- select green Insert button
To resize cutout people icons:
- select a person
- select ‘Picture Format’ on the ribbon
- resize to similar dimensions as pic below

To rename cutout people icons:
- select a person
- in name box rename to person1
- repeat for the other 4 people (renaming to: person2 person3 person4 person5)
Attach VBA to Buttons
5 buttons: start button and 4 arrow buttons. To attach vba to them:
Start Button
- right click button Start
- select ‘assign macro’
- select ‘RecolateTOPLEFT’
- select ‘OK’
Up Arrow Button
- right click up arrow button
- select ‘assign macro’
- select ‘DinoGOUP‘
- select ‘OK’
Repeat for the other 3 arrows (DinoGORIGHT, DinoGODOWN, DinoGOLEFT).
Moving The Dinosaur
You should now be able to use the 4 arrow buttons to move the dinosaur.
Eating Humans
It’s finnicky but moving right towards the head level of a person makes him/her disappear. The bottom right has click and chomp counts.
Restart
Click ‘Start’ to reset everything. Before you move the dinosaur you can reposition the people. Clicking any arrow button will redefine the positions.
VBA Code & Formulas
I tinker with VBA (I’m not a professional programmer). I figure out what I want to do and if I can’t write the code I google it and modify it. This file works based on the interaction between vba code and formulas.

Easier to examine the code in the file but here’s the code:
a_DinoMoves
Sub RelocateTOPLEFT()
ActiveSheet.Shapes("Dino1").Left = 15
ActiveSheet.Shapes("Dino1").Top = 18
Range("ChompCount").Value = 0
Call ResetClickCount
Call DinoGetLocation
Call UnHidePersons
Call GetLocationPerson1
Call GetLocationPerson2
Call GetLocationPerson3
Call GetLocationPerson4
Call GetLocationPerson5
End Sub
Sub DinoGORIGHT()
Application.ScreenUpdating = False
'add to count
Call AddToCount
'make Dino face right
Call DinoLOOKRIGHT
'get Dino's location & assign to cells
Call DinoGetLocation
'move Dino right
ActiveSheet.Shapes("Dino1").IncrementLeft 15
'check if close enough to hide a person
'Call HidePersons
Call HidePersons
Application.ScreenUpdating = True
End Sub
Sub DinoGOLEFT()
Application.ScreenUpdating = False
'add to count
Call AddToCount
Call DinoLOOKLEFT
Call DinoGetLocation
ActiveSheet.Shapes("Dino1").IncrementLeft -15
Call HidePersons
Application.ScreenUpdating = True
End Sub
Sub DinoGOUP()
Application.ScreenUpdating = False
'add to count
Call AddToCount
Call DinoLookForward
Call DinoGetLocation
ActiveSheet.Shapes("Dino1").IncrementTop -15
Call HidePersons
Application.ScreenUpdating = True
End Sub
Sub DinoGODOWN()
Application.ScreenUpdating = False
'add to count
Call AddToCount
Call DinoLookForward
Call DinoGetLocation
ActiveSheet.Shapes("Dino1").IncrementTop 15
Call HidePersons
Application.ScreenUpdating = True
End Sub
b_DinoFaceTowards
This turns the dinosaur to face the direction it will move.
Sub DinoLookForward()
ActiveSheet.Shapes("Dino1").Model3D.RotationX = 355
ActiveSheet.Shapes("Dino1").Model3D.RotationY = 2.3
ActiveSheet.Shapes("Dino1").Model3D.RotationZ = 360
End Sub
Sub DinoLOOKRIGHT()
'change direction Dino looks (not moves)
ActiveSheet.Shapes("Dino1").Model3D.RotationX = 8
ActiveSheet.Shapes("Dino1").Model3D.RotationY = 53
ActiveSheet.Shapes("Dino1").Model3D.RotationZ = 7
End Sub
Sub DinoLOOKLEFT()
ActiveSheet.Shapes("Dino1").Model3D.RotationX = 214
ActiveSheet.Shapes("Dino1").Model3D.RotationY = 277
ActiveSheet.Shapes("Dino1").Model3D.RotationZ = 146
End Sub
c_GetLocations
This reads the location of the objects and writes the positions (Left, Top, Height, Width) to column C. I could’ve used a loop but I ran out of energy and repeated the code for each different object.
Sub DinoGetLocation()
'used for: DinoGORIGHT sub
Dim wks As Worksheet
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
'get Dino's position
Set wks = Sheets("dino")
Xpos = wks.Shapes("Dino1").Left
Ypos = wks.Shapes("Dino1").Top
Hpos = wks.Shapes("Dino1").Height
Width = wks.Shapes("Dino1").Width
'assign position values to cells
Range("C12").Value = Round(Xpos, 3)
Range("C13").Value = Round(Ypos, 3)
Range("C14").Value = Round(Hpos, 3)
Range("C15").Value = Round(Width, 3)
End Sub
Sub GetLocationPerson1()
Dim wks As Worksheet, id As String
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
id = "1"
Set wks = Sheets("dino")
Xpos = wks.Shapes("Person" & id).Left
Ypos = wks.Shapes("Person" & id).Top
Hpos = wks.Shapes("Person" & id).Height
Width = wks.Shapes("Person" & id).Width
Range("C16").Value = Round(Xpos, 3)
Range("C17").Value = Round(Ypos, 3)
Range("C18").Value = Round(Hpos, 3)
Range("C19").Value = Round(Width, 3)
End Sub
Sub GetLocationPerson2()
Dim wks As Worksheet, id As String
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
id = "2"
Set wks = Sheets("dino")
Xpos = wks.Shapes("Person" & id).Left
Ypos = wks.Shapes("Person" & id).Top
Hpos = wks.Shapes("Person" & id).Height
Width = wks.Shapes("Person" & id).Width
Range("C20").Value = Round(Xpos, 3)
Range("C21").Value = Round(Ypos, 3)
Range("C22").Value = Round(Hpos, 3)
Range("C23").Value = Round(Width, 3)
End Sub
Sub GetLocationPerson3()
Dim wks As Worksheet, id As String
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
id = "3"
Set wks = Sheets("dino")
Xpos = wks.Shapes("Person" & id).Left
Ypos = wks.Shapes("Person" & id).Top
Hpos = wks.Shapes("Person" & id).Height
Width = wks.Shapes("Person" & id).Width
Range("C24").Value = Round(Xpos, 3)
Range("C25").Value = Round(Ypos, 3)
Range("C26").Value = Round(Hpos, 3)
Range("C27").Value = Round(Width, 3)
End Sub
Sub GetLocationPerson4()
Dim wks As Worksheet, id As String
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
id = "4"
Set wks = Sheets("dino")
Xpos = wks.Shapes("Person" & id).Left
Ypos = wks.Shapes("Person" & id).Top
Hpos = wks.Shapes("Person" & id).Height
Width = wks.Shapes("Person" & id).Width
Range("C28").Value = Round(Xpos, 3)
Range("C29").Value = Round(Ypos, 3)
Range("C30").Value = Round(Hpos, 3)
Range("C31").Value = Round(Width, 3)
End Sub
Sub GetLocationPerson5()
Dim wks As Worksheet, id As String
Dim Xpos As Double, Ypos As Double, Width As Double, Hpos As Double
id = "5"
Set wks = Sheets("dino")
Xpos = wks.Shapes("Person" & id).Left
Ypos = wks.Shapes("Person" & id).Top
Hpos = wks.Shapes("Person" & id).Height
Width = wks.Shapes("Person" & id).Width
Range("C32").Value = Round(Xpos, 3)
Range("C33").Value = Round(Ypos, 3)
Range("C34").Value = Round(Hpos, 3)
Range("C35").Value = Round(Width, 3)
End Sub
d_HideUnhidePeople
Procedures UnHidePersons & HidePersonsX loop but procedure HidePersons doesn’t (various If…End If statements check named ranges to see if Dino is close enough to each person to eat them).
Sub HidePersons()
If Range("person1hide").Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person1")).Visible = msoFalse
End If
If Range("person2hide").Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person2")).Visible = msoFalse
End If
If Range("person3hide").Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person3")).Visible = msoFalse
End If
If Range("person4hide").Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person4")).Visible = msoFalse
End If
If Range("person5hide").Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person5")).Visible = msoFalse
End If
Dim xobj As Shape
Range("ChompCount").Value = 0
For Each xobj In ActiveSheet.Shapes
If xobj.Visible = False Then Range("ChompCount").Value = Range("ChompCount").Value + 1
Next
End Sub
Sub UnHidePersons()
Dim sObject As Shape
For Each sObject In ActiveSheet.Shapes
sObject.Visible = True
Next
End Sub
Sub HidePersonsX()
'if dino touches person then hide
For x = 1 To 5
If Range("person1hide" & x).Value = "Yes" Then
ActiveSheet.Shapes.Range(Array("person" & x)).Visible = msoFalse
Call AddToChompCount
End If
Next x
End Sub
e_ClickCount
Simple procedures to increase or clear the counts.
Sub AddToCount()
Range("ClickCount").Value = Range("ClickCount") + 1
End Sub
Sub ResetClickCount()
Range("ClickCount").Value = 0
End Sub
Sub AddToChompCount()
Range("ChompCount").Value = Range("ChompCount") + 1
End Sub
Recap
I got stuck several times while building this but somehow finished it. There is a better way to determine if two objects overlap but the code was too complex for me. I found an alternative way to do it by writing each object’s position into cells, using formulas to calculate proximity, and finally reading the named range (eg person1hide) ‘Yes’ or ‘No’ values back into the code (sub HidePersons).
A nice thing about a personal blog…I can decide what to play around with. There’s no commercial use for this post but I was able to practice VBA. I often watch an NBA game or listen to a podcast in Spanish while a play around in Excel. It works to forget about what’s happening these days.
About Me

I drew this a few years ago. Kind of funny, kind of lame. Anyway, my name is Kevin Lehrbass. I’m a Data Analyst and major Excel fan. I often get curious about whether or not something is possible in Excel and spend hours working on it. I always learn a lot.

Can you share the excel file, send to my email [email protected]
Thans
Sorry Rangga…I’m not sure where it is. But I do remember that it was too large to include in the post or share.