A shape can be assigned a hyperlink, by RClick on shape and assign hyperlink. A shape can be created from a cell, from the Drawing Toolbar, from the Forms Toolbar among what I presume are many other places where shapes can be created. More information on bitmaps in Excel can be found at More on Bitmaps
When copying and pasting from a webpage to Excel 2000 sometimes buttons get copied, you
can delete the created shapes. A better way of copying a web page is to Open the URL directly from Excel 2000, which gives the best rendition and column widths.
| A | B | C | D | E | F | G | |
| 1 | Worksheet | Shape | Type | OnAction | Hyperlink | TopLeft | BotRight |
| 2 | colorize on letter | Comment 3 | 4 | B1 | L5 | ||
| 3 | Sheet6 | Text Box 1 | 17 | d:\mysite\excel.htm | D2 | D5 | |
| 4 | Hotel Rooms | Comment 11 | 4 | B11 | B15 | ||
| 5 | Hotel Rooms | Comment 12 | 4 | J11 | L15 | ||
| 6 | Hotel Rooms | Comment 13 | 4 | B13 | B17 | ||
| 7 | Hotel Rooms | Comment 14 | 4 | J13 | L17 | ||
| 8 | Sarnia | List Box 5 | 8 | vlookup.xls!ListBox5_Change | G8 | I21 | |
| 9 | Sheet10 | Picture 1026 | 13 | E886 | E886 | ||
| 10 | Sheet15 | Drop Down 13 | 8 |
You will find code for macros on the page in code/shapes.txt
and possibly in code/buildtoc.txt as this page was
originally split off from Build Table of Contents (buildtoc.htm).
| This page contains some VBA macros. If you need assistance to install or to use a macro please refer to my «Getting Started with Macros« or delve into it deeper on my Install page. |
Sub getShapeProc()
'List of buttons/shapes ON THE worksheets
'based on Shawn Foley, programming group, 1999-09-10
'-- http://groups.google.com/groups?as_umsgid=7rbk95%24b44%241%40nntp8.atl.mindspring.net
Dim Wks As Worksheet
Dim shp As Shape
Dim nRow As Long
Sheets.Add 'Don't destroy the active sheet
Cells.Clear '-- added due to on Error
Cells(1, 1) = "Worksheet"
Cells(1, 2) = "Shape"
Cells(1, 3) = "Type"
Cells(1, 4) = "OnAction"
Cells(1, 5) = "Hyperlink"
Cells(1, 6) = "TopLeft"
Cells(1, 7) = "BotRight"
Cells(1, 8) = "Height"
Cells(1, 9) = "Width"
Cells(1, 10) = "Autoshape"
Cells(1, 10).AddComment "Autoshape Type"
Cells(1, 11) = "Form"
Cells(1, 11).AddComment "Form Control Type"
nRow = 1
On Error Resume Next 'hyperlinks, topLeftCell, BottomRightCell
For Each Wks In ActiveWorkbook.Worksheets
For Each shp In Wks.Shapes
nRow = nRow + 1
Cells(nRow, 1) = "'" & Wks.Name 'i.e. Worksheet 1999-01-10
Cells(nRow, 2) = shp.Name
Cells(nRow, 3) = shp.Type
Cells(nRow, 4) = shp.OnAction
Cells(nRow, 5) = shp.Hyperlink.Address 'additional information
Cells(nRow, 6) = shp.TopLeftCell.Address(0, 0)
Cells(nRow, 7) = shp.BottomRightCell.Address(0, 0)
Cells(nRow, 8) = shp.Height
Cells(nRow, 9) = shp.Width
Cells(nRow, 10) = shp.AutoShapeType
Cells(nRow, 11) = shp.FormControlType 'i.e. autofilter button is 2
'Debug.Print wks.Name & Chr(9) & shp.Name & Chr(9) & shp.OnAction
'------no/no shp.Delete
Next shp
'If wks.Name = "Abuse" Then GoTo done 'testing D.McRitchie
Next Wks
done: nRow = nRow + 0
End Sub
Sub CheckShape()
'Find names of objects on a sheet -- Tom Ogilvy 01Nov199
'untested (dmcr) has a range("myzone")
Dim varArr()
Dim shpRange As ShapeRange
ReDim varArr(1 To 1)
i = 0
For Each shp In Worksheets("sheet1").Shapes
If shp.Type = msoFreeform Then
If Not Intersect(Range("MyZone"), _
shp.TopLeftCell) Is Nothing Then
i = i + 1
ReDim Preserve varArr(1 To i)
varArr(i) = shp.Name
End If
End If
Next
Set shpRange = ActiveSheet.Shapes.Range(varArr)
Debug.Print shpRange.Count
For Each shp In shpRange
Debug.Print shp.Name, shp.TopLeftCell.Address
Next
shpRange.Select
End Sub
Sub delShapesOnSht()
'Dave Peterson, misc 2001-11-12, no loop required
If ActiveSheet.Shapes.Count = 0 Then
MsgBox "No Shapes on page for deletion"
Exit Sub
End If
ActiveSheet.Shapes.SelectAll '*** warning DELETE all Shapes
Selection.Delete
End Sub
' Dave Peterson provided another example in programming 2001-11-13
' to delete shapes with upper left corner within a selection range.
' -- had -- ActiveSheet.Range("a37:o50")) Is Nothing Then
Sub delShapesSel()
'Delete shapes within selection range,
' Dave Peterson, programming, 2001-11-13
Dim myshape As Shape
For Each myshape In ActiveSheet.Shapes
If Intersect(myshape.TopLeftCell, _
Selection) Is Nothing Then
'do nothing
Else
myshape.Delete
End If
Next myshape
End Sub
Missed the specific range in the above, it would be better to use Selection. instead of ActivesSheet.Range("a37:o50") -- one person used BottomRightCell instead of TopLeftCell
due to the way that multiple shapes hit one cell. Modify to suit your needs.
You can manually select all objects on a sheet regardless of what cells are selected with
Edit, GoTo (Ctrl+G), Special, Objects.
Sub selShapesOnSht()
Dim shp As Shape
For Each shp In ActiveWorkbook.ActiveSheet.Shapes
ans = MsgBox("DELETE Shape" & Chr(10) & shp.Name & " " _
& shp.TopLeftCell.Address & Chr(10) & " -- " _
& shp.AlternativeText, vbYesNoCancel + vbDefaultButton2)
If ans = 2 Then
shp.Select 'Select shape and exit
Exit Sub
End If
If ans = 6 Then shp.Delete 'Delete the shape
Next shp
End Sub
Code for Particular Shapes:
If sp.AutoShapeType = msoShapeRectangle Then shp.Delete
If sp.AutoShapeType = msoShapeTriangle Then shp.Delete
Code to delete all Rectangular shapes on a sheet
Since you can't collectively select them as a group of rectangles
you have to select all of the shapes and then check them one by
one. If there are no shapes then no shapes are tested.
Sub delAllRectangularShapesOnSht()
Dim shp As Shape
For Each shp In ActiveWorkbook.ActiveSheet.Shapes
'check shape code for Particular Shapes:
If shp.AutoShapeType = msoShapeRectangle Then shp.Delete
Next shp
End Sub
Code to find out who called a macro attached to a shape:
msgbox "This macro was called by: " & _
ActiveSheet.Shapes(Application.Caller).Name 'returns string
To Manually create your own selection of shapes
Sub testme3()
Dim myCell As Range, myShape As Shape
Set myCell = Range("A1")
For Each myShape In ActiveSheet.Shapes
If Intersect(myShape.TopLeftCell, myCell) Is Nothing Then
'do nothing
Else
MsgBox myShape.Name
Exit For
End If
Next myShape
End Sub
A shape's default .Placement property value is xlMoveAndSize. Change it to xlFreeFloating if desired -- then the the image is anchored to the upper left corner of the spreadsheet and removal of columns does not affect it's position. (see code on right below)
JE McGimpsey, public.excel, 2004-08-30.
With Range("J4")
ActiveSheet.Shapes.AddShape _
Type:=msoShapeSmileyFace, _
Left:=.Left, _
Top:=.Top, _
Width:=.Width, _
Height:=.Height
End With
|
With Range("K10")
With ActiveSheet.Shapes.AddShape( _
Type:=msoShapeSmileyFace, _
Top:=.Top, Left:=.Left, _
Width:=.Width, _
Height:=.Height)
.Placement = xlFreeFloating
End With
End With
|
Sub ddStartInsertRectBar_Click()
Set ddBarLength = ActiveSheet.Range("b" & ActiveCell.Row)
With ActiveCell
ActiveSheet.Shapes.AddShape _
Type:=msoShapeRectangle, _
Left:=.Left, _
Top:=.Top + 5, _
Width:=ddBarLength.Value * (.Width), _
Height:=5
End With
End Sub
Sub IDthisShape()
'Identify selected shape, David McRitchie, programming, 2002-12-20
' http://www.mvps.org/dmcritchie/excel/shapes.htm
' http://google.com/groups?threadm=uV1T2%23FqCHA.2484@TK2MSFTNGP12
Dim str As String, i As Long, cnt As Long
cnt = 0
On Error Resume Next
cnt = Selection.Count
cnt = Selection.ShapeRange.Count '-- err if none selected
str = "There are " & ActiveSheet.Shapes.Count _
& " shapes on this worksheet" _
& Chr(10) & "of which " & cnt _
& IIf(cnt = 1, " was selected", " were selected") _
& Chr(10) & Chr(10)
If cnt = 0 Then
'-- can at least report a single chart but not a single textboxl
str = str & "Actually, Selected shape is: " & Selection.Name
MsgBox str
Exit Sub
End If
For i = 1 To Selection.ShapeRange.Count
MsgBox str & i & " of " & Selection.ShapeRange.Count _
& " in selection. The selected shape is " _
& Chr(10) & " " & Selection.ShapeRange.Item(i).Name
Next i
End Sub
Sub ExtractLinkToRightOfShapes()
'Extract hyperlink and place to right of cells with shapes
'Dick Kusleika, 2003-03-26 in excel.links, modified from
' http://google.com/groups?threadm=efcLbz%238CHA.2820%40TK2MSFTNGP11.phx.gbl
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
On Error Resume Next
shp.BottomRightCell.Offset(0, 1).Value = "'--"
shp.BottomRightCell.Offset(0, 1).Value = shp.Hyperlink.Address
On Error GoTo 0
Next shp
End Sub
Sub Macro19()
Dim wfactor As Double
Dim shp As Shape
'Delete all shapes to begin test
For Each shp In ActiveWorkbook.ActiveSheet.Shapes
shp.Delete '****** warning DELETE all Shapes found
Next shp
'Create some shapes
ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
36#, 151.5, 202.5, 125.25).Select
ActiveSheet.Shapes.AddShape(msoShapeOval, _
544.5, 154.5, 57#, 41.25).Select
'Resize each shape to 4 inches height and width
For Each shp In ActiveWorkbook.ActiveSheet.Shapes
shp.Height = 4 * 72
shp.Width = 4 * 72
Next shp
'Rescale each shape to 2 inches width and scale height
For Each shp In ActiveWorkbook.ActiveSheet.Shapes
wfactor = 2 * 72 / shp.Width
shp.Height = shp.Height * wfactor
shp.Width = shp.Width * wfactor
Next shp
'insert an image and resize width
Dim PictureName As String
PictureName = "C:\copiedsite\dmcritchie\icons\bl-green.gif"
Range("A4").Select
ActiveSheet.Pictures.Insert(Picturename).Select
Selection.Width = 4 * 72
MsgBox TypeName(Selection) 'shows up as Picture
End Sub
=HYPERLINK("c:\camera-canon20d\img_" & "TEXT(A2,"0000") & ".jpg","[pic]")
="<img src=""file:///c:/camera-canon20d/img_" & TEXT(A2,"0000") & ".jpg"" alt=""[" & TEXT(A2,"0000") & "["" title=""" & B2 & " width=""250px"">"
<img src="file:///c:/camera-canon20d/img_0109.jpg" alt="[0109]" title="Bumble Bee" width="250">
Please send your comments concerning this web page to: David McRitchie send email comments
Copyright © 1997 - 2006, F. David McRitchie, All Rights Reserved