指定したシート内のオブジェクト一覧を作成する2023.07.01
指定したシート内に存在する、画像や図形、チャートといったオブジェクトの情報を取得し、新規ブックに一覧を作成するマクロです。
取得する情報は、オブジェクトの名前、タイプ、タイプ番号です。
※「入力規則」の「ドロップダウンリスト」は対象外としています
■参考動画
アクティブシート内のオブジェクト情報を取得する
次のサンプルコードを実行すると、プロシージャ「GetObjgectInfo」に移り、オブジェクト情報を取得します。
サンプルコードでは「GetObjgectInfo」の第1引数に「ActiveSheet」を指定しているため、アクティブシートのオブジェクト情報を取得します。
アクティブシートではなく任意のシートを指定する場合は、第1引数に「Worksheets("シート名")」と指定してください。
取得したオブジェクト情報は、「GetObjgectInfo」の第2~4引数に1次元配列として設定されます。そのため第2~4引数にはVariant型の変数を指定してください。
Excelマクロ管理ツール
サンプルコード2023.07.01
'-------------------------------------------------------------------------------- ' 実行マクロ [ 新規ブックにアクティブシートのオブジェクト情報を出力 ] '-------------------------------------------------------------------------------- Sub ExampleOfUse_GetObjectInfo() Dim varObjName As Variant Dim varObjType As Variant Dim varObjTypeNum As Variant Dim lngCount As Long 'プロシージャ実行 lngCount = GetObjectInfo(ActiveSheet, varObjName, varObjType, varObjTypeNum) If lngCount = 0 Then MsgBox "オブジェクトはありません" Else '新規ブックを追加 Workbooks.Add '見出し設定 With Range("A1:C1") .Value = Array("オブジェクト名", "タイプ", "タイプ番号") .Interior.ThemeColor = xlThemeColorAccent5 .Interior.TintAndShade = 0.799981688894314 End With 'セルに展開 Dim i As Long For i = 0 To lngCount - 1 Range("A2:C2").Offset(i) = Array(varObjName(i), varObjType(i), varObjTypeNum(i)) Next '罫線設定 ActiveSheet.UsedRange.Borders.LineStyle = xlContinuous '列幅調整 Columns("A:C").AutoFit MsgBox lngCount & "つのオブジェクト情報を取得しました", vbInformation End If End Sub
'----------------------------------------------------------------------------------- ' 指定したシートのオブジェクト情報を取得 '----------------------------------------------------------------------------------- ' ※「入力規則」の「ドロップダウンリスト」は取得対象外としています '[引数] ' Sh :対象のシート ' Array1dName :任意のVariant型変数を指定 ' オブジェクトが存在した場合オブジェクト名が格納される ' Array1dType :任意のVariant型変数を指定 ' オブジェクトが存在した場合オブジェクトタイプが格納される ' Array1dTypeNumber:任意のVariant型変数を指定 ' オブジェクトが存在した場合オブジェクトタイプ番号が格納される '[戻り値] ' オブジェクトの数 '[作成日] ' 2023/06/23 '----------------------------------------------------------------------------------- Function GetObjectInfo(ByRef Sh As Worksheet, _ ByRef Array1dName As Variant, _ ByRef Array1dType As Variant, _ ByRef Array1dTypeNumber As Variant) As Variant 'オブジェクトがなければ抜ける If Sh.DrawingObjects.Count = 0 Then Exit Function 'msoShapeType列挙を配列に格納 Dim varObjectTypeList As Variant varObjectTypeList = Array("msoShapeTypeMixed", "", "", "msoAutoShape", _ "msoCallout", "msoChart", "msoComment", _ "msoFreeform", "msoGroup", "msoEmbeddedOLEObject", _ "msoFormControl", "msoLine", "msoLinkedOLEObject", _ "msoLinkedPicture", "msoOLEControlObject", _ "msoPicture", "msoPlaceholder", "msoTextEffect", _ "msoMedia", "msoTextBox", "msoScriptAnchor", _ "msoTable", "msoCanvas", "msoDiagram", "msoInk", _ "msoInkComment", "msoSmartArt", "msoSlicer", _ "msoWebVideo", "msoContentApp", "msoGraphic", _ "msoLinkedGraphic", "mso3DModel", "msoLinked3DModel") 'オブジェクトの名前・タイプ・タイプ番号を取得 Dim objShape As Shape Dim lngCount As Long Dim varObjectName() As Variant Dim varObjectType() As Variant Dim varObjectTypeNumber() As Variant For Each objShape In Sh.Shapes With objShape '入力規則の「リスト」は対象外 If Not (.Type = msoFormControl And Left$(.Name, 9) = "Drop Down") Then ReDim Preserve varObjectName(lngCount) ReDim Preserve varObjectTypeNumber(lngCount) ReDim Preserve varObjectType(lngCount) 'オブジェクト名・タイプ・タイプ番号を配列に格納 varObjectName(lngCount) = .Name varObjectTypeNumber(lngCount) = .Type varObjectType(lngCount) = varObjectTypeList(.Type + 2) lngCount = lngCount + 1 End If End With Next Array1dName = varObjectName Array1dType = varObjectType Array1dTypeNumber = varObjectTypeNumber GetObjectInfo = lngCount End Function
GetObjectInfoプロシージャの引数
Sh
対象とするWorksheetオブジェクトを指定します。
Array1dName
Variant型の変数を指定します。この変数にオブジェクトの名前が1次元配列として格納されます。
Array1dType
Variant型の変数を指定します。この変数にオブジェクトのタイプが1次元配列として格納されます。
タイプは、msoShapeType列挙の定義を表します。
Array1dTypeNumber
Variant型の変数を指定します。この変数にオブジェクトのタイプ番号が1次元配列として格納されます。
タイプ番号は、msoShapeType列挙に定義されている実体の数値を表します。
GetObjectInfoプロシージャの戻り値
戻り値は、オブジェクトの数になります。