У Майка была проблема, когда он знал, что в его рабочей тетради были спрятаны предметы, и хотел найти их все. Похоже, он написал макрос, который скрывал некоторые объекты, но потом не отображал их.

Если вы хотите просто узнать имена объектов на листе, следующий макрос сделает это очень хорошо. Показывает не только название, но и тип объекта.

Sub ListObjects()

Dim objCount As Integer     Dim x As Integer     Dim objList As String     Dim objPlural As String     Dim objType(17) As String

'Set types for different objects     objType(1) = "Autoshape"

objType(2) = "Callout"

objType(3) = "Chart"

objType(4) = "Comment"

objType(7) = "EmbeddedOLEObject"

objType(8) = "FormControl"

objType(5) = "Freeform"

objType(6) = "Group"

objType(9) = "Line"

objType(10) = "LinkedOLEObject"

objType(11) = "LinkedPicture"

objType(12) = "OLEControlObject"

objType(13) = "Picture"

objType(14) = "Placeholder"

objType(15) = "TextEffect"

objType(17) = "TextBox"



objList = ""



'Get the number of objects     objCount = ActiveSheet.Shapes.Count

If objCount = 0 Then         objList = "There are no shapes on " & _           ActiveSheet.Name     Else         objPlural = IIf(objCount = 1, "", "s")

objList = "There are " & Format(objCount, "0") _           & " Shape" & objPlural & " on " & _           ActiveSheet.Name & vbCrLf & vbCrLf         For x = 1 To objCount             objList = objList & ActiveSheet.Shapes(x).Name & _               " is a " & objType(ActiveSheet.Shapes(x).Type) _               & vbCrLf         Next x     End If

MsgBox (objList)



End Sub

Этот макрос возвращает имена и типы всех объектов на листе.

Однако другой подход состоит в том, чтобы отобразить все имена объектов, а затем, если объект скрыт, спросить, хотите ли вы, чтобы он отображался. Следующий макрос делает именно это:

Sub ShowEachShape1()

Dim sObject As Shape     Dim sMsg As String     For Each sObject In ActiveSheet.Shapes         sMsg = "Found " & IIf(sObject.Visible, _           "visible", "hidden") & " object " & _           vbNewLine & sObject.Name         If sObject.Visible = False Then             If MsgBox(sMsg & vbNewLine & "Unhide ?", _               vbYesNo) = vbYes Then                 sObject.Visible = True             End If         Else             MsgBox sMsg         End If     Next End Sub

Если вы хотите, чтобы макрос работал только со скрытыми объектами и игнорировал видимые, вы можете изменить макрос на следующее:

Sub ShowEachShape2()

Dim sObject As Shape     Dim sMsg As String     For Each sObject In ActiveSheet.Shapes         If sObject.Visible = False Then             sMsg = "Object & sObject.Name & _               " is hidden. Unhide it?"

If MsgBox(sMsg, vbYesNo) = vbYes Then                 sObject.Visible = True             End If         End If     Next End Sub

Чтобы просто сделать все объекты видимыми за один шаг, вы можете еще больше укоротить макрос:

Sub ShowEachShape3()

Dim sObject As Shape     For Each sObject In ActiveSheet.Shapes         sObject.Visible = True     Next End Sub

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2025) применим к Microsoft Excel 97, 2000, 2002 и 2003.