Okay, I have a semi-solution after following Kenneth's rabbit hole! It works for any zoom level, but resized images do not work. I'm willing to accept a solution that assumes images are not resized. It is a bit slow, taking usually a second or two, but it's much faster than doing it by hand!
I started with the GetPixelColorFromExcelShape module from https://www.mrexcel.com/forum/excel-...-function.html
I then wrote the following (I didn't write the array search myself, I adapted it from some other code I previously found for a related project, but I don't have any source to properly credit I'm afraid):
Sub DeleteAllTickmarks()'
' Keyboard Shortcut: Ctrl+Shift+T
'
If MsgBox("This will delete ALL Engagement checkmarks in this workbook!" & Chr(10) & "All other tickmarks such as PY, A, or 1 will be left intact." & Chr(10) & "Proceed?", vbYesNo, "Confirm Delete") = vbYes Then
Dim Tickmark As Shape
Dim wSheet As Worksheet
Dim ToDelete(2) As String
ToDelete(0) = "42106672"
ToDelete(1) = "44281002"
ToDelete(2) = "42111145"
For Each wSheet In ActiveWorkbook.Worksheets
For Each Tickmark In wSheet.Shapes
'Determine whether or not to delete
'MsgBox (GenerateImageID(Tickmark)) 'Used to find values to delete
If IsInArray(CStr(GenerateImageID(Tickmark)), ToDelete) Then
Tickmark.Delete
End If
Next Tickmark
Next wSheet
End If
End Sub
Function PixelColor(thisShape As Shape, xyCoord As Integer) As Long
Dim tPt As POINTAPI
Dim tPicSize As Size
tPt.x = xyCoord
tPt.y = xyCoord
PixelColor = GetPixelColorFromExcelShape(thisShape, tPt, tPicSize)
End Function
Function GenerateImageID(thisShape As Shape) As Long
Dim shapeSize As Long
Dim primeNumbers(1 To 16) As Long
Dim i As Integer
primeNumbers(1) = 1
primeNumbers(2) = 2
primeNumbers(3) = 3
primeNumbers(4) = 5
primeNumbers(5) = 7
primeNumbers(6) = 11
primeNumbers(7) = 13
primeNumbers(8) = 17
primeNumbers(9) = 19
primeNumbers(10) = 23
primeNumbers(11) = 29
primeNumbers(12) = 31
primeNumbers(13) = 37
primeNumbers(14) = 41
primeNumbers(15) = 43
primeNumbers(16) = 47
shapeSize = 16
GenerateImageID = 0
For i = 1 To 16
GenerateImageID = GenerateImageID + PixelColor(thisShape, i) / primeNumbers(i)
Next i
End Function
Private Function IsInArray(searchVar As Variant, thisArray As Variant) As Boolean
Dim arrayElement As Variant
On Error GoTo IsInArrayError:
For Each arrayElement In thisArray
If arrayElement = searchVar Then
IsInArray = True
Exit Function
End If
Next arrayElement
Exit Function
IsInArrayError:
On Error GoTo 0
IsInArray = False
End Function