' プロシージャ名 : prcツール構造情報出力
' 機能概要 : 選択されたExcelツールブックの構造情報を抽出し、現在のブックに出力する
' 留意点 : 対象ツールはファイルダイアログで指定し、出力は本ブックの新規シートに行う
Sub prcツール構造情報出力()
Dim shtOutput As Worksheet
Dim shtTarget As Worksheet
Dim lngRow As Long
Dim wbTool As Workbook
Dim strFilePath As String
Dim fd As FileDialog
Dim strName As String
Dim nmDefinedName As Name
Dim shpObj As Shape
Dim rngCell As Range
Dim vbComp As Object
Dim vbProj As Object
Application.ScreenUpdating = False
' ファイルダイアログでツール選択
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "構造情報を取得するExcelファイルを選択してください"
.Filters.Clear
.Filters.Add "Excelファイル", "*.xls; *.xlsx; *.xlsm"
.AllowMultiSelect = False
If .Show <> -1 Then Exit Sub
strFilePath = .SelectedItems(1)
End With
' ツールブックを開く(読み取り専用)
Set wbTool = Workbooks.Open(Filename:=strFilePath, ReadOnly:=True)
' 出力シート初期化
On Error Resume Next
ThisWorkbook.Worksheets("構造情報出力").Delete
On Error GoTo 0
Set shtOutput = ThisWorkbook.Worksheets.Add
shtOutput.Name = "構造情報出力"
lngRow = 1
' --- シート情報 ---
shtOutput.Cells(lngRow, 1).Value = "■ シート情報"
lngRow = lngRow + 1
For Each shtTarget In wbTool.Worksheets
With shtTarget
shtOutput.Cells(lngRow, 1).Value = "シート名"
shtOutput.Cells(lngRow, 2).Value = .Name
shtOutput.Cells(lngRow, 3).Value = "表示状態"
Select Case .Visible
Case xlSheetVisible: shtOutput.Cells(lngRow, 4).Value = "表示"
Case xlSheetHidden: shtOutput.Cells(lngRow, 4).Value = "非表示"
Case xlSheetVeryHidden: shtOutput.Cells(lngRow, 4).Value = "VeryHidden"
End Select
shtOutput.Cells(lngRow, 5).Value = "UsedRange"
shtOutput.Cells(lngRow, 6).Value = .UsedRange.Address
shtOutput.Cells(lngRow, 7).Value = "セル数"
shtOutput.Cells(lngRow, 8).Value = .UsedRange.Cells.Count
shtOutput.Cells(lngRow, 9).Value = "行固定"
shtOutput.Cells(lngRow, 10).Value = .ScrollRow
shtOutput.Cells(lngRow, 11).Value = "列固定"
shtOutput.Cells(lngRow, 12).Value = .ScrollColumn
shtOutput.Cells(lngRow, 13).Value = "保護状態"
shtOutput.Cells(lngRow, 14).Value = IIf(.ProtectContents, "保護中", "未保護")
shtOutput.Cells(lngRow, 15).Value = "非表示行数"
shtOutput.Cells(lngRow, 16).Value = WorksheetFunction.CountIf(.Rows.Hidden, True)
shtOutput.Cells(lngRow, 17).Value = "非表示列数"
shtOutput.Cells(lngRow, 18).Value = WorksheetFunction.CountIf(.Columns.Hidden, True)
lngRow = lngRow + 1
End With
Next shtTarget
lngRow = lngRow + 1
' --- 名前定義 ---
shtOutput.Cells(lngRow, 1).Value = "■ 名前定義"
lngRow = lngRow + 1
For Each nmDefinedName In wbTool.Names
shtOutput.Cells(lngRow, 1).Value = nmDefinedName.Name
shtOutput.Cells(lngRow, 2).Value = nmDefinedName.RefersTo
lngRow = lngRow + 1
Next nmDefinedName
lngRow = lngRow + 1
' --- ボタン・オブジェクト情報 ---
shtOutput.Cells(lngRow, 1).Value = "■ シート内ボタン・オブジェクト概要"
lngRow = lngRow + 1
For Each shtTarget In wbTool.Worksheets
For Each shpObj In shtTarget.Shapes
shtOutput.Cells(lngRow, 1).Value = shtTarget.Name
shtOutput.Cells(lngRow, 2).Value = shpObj.Name
shtOutput.Cells(lngRow, 3).Value = shpObj.Type
On Error Resume Next
shtOutput.Cells(lngRow, 4).Value = shpObj.OnAction
On Error GoTo 0
lngRow = lngRow + 1
Next shpObj
Next shtTarget
lngRow = lngRow + 1
' --- 入力規則 ---
shtOutput.Cells(lngRow, 1).Value = "■ 入力規則情報(シート別)"
lngRow = lngRow + 1
For Each shtTarget In wbTool.Worksheets
shtOutput.Cells(lngRow, 1).Value = "【" & shtTarget.Name & "】"
lngRow = lngRow + 1
For Each rngCell In shtTarget.UsedRange
If Not rngCell.Validation Is Nothing Then
If rngCell.Validation.Type <> -4160 Then
shtOutput.Cells(lngRow, 2).Value = rngCell.Address
shtOutput.Cells(lngRow, 3).Value = rngCell.Validation.Formula1
lngRow = lngRow + 1
End If
End If
Next rngCell
Next shtTarget
lngRow = lngRow + 1
' --- 数式情報 ---
shtOutput.Cells(lngRow, 1).Value = "■ 数式情報(シート別)"
lngRow = lngRow + 1
For Each shtTarget In wbTool.Worksheets
shtOutput.Cells(lngRow, 1).Value = "【" & shtTarget.Name & "】"
lngRow = lngRow + 1
For Each rngCell In shtTarget.UsedRange
If rngCell.HasFormula Then
shtOutput.Cells(lngRow, 2).Value = rngCell.Address
shtOutput.Cells(lngRow, 3).Value = rngCell.Formula
lngRow = lngRow + 1
End If
Next rngCell
Next shtTarget
lngRow = lngRow + 1
' --- モジュール構成(対象外:別ブックVBAへの直接アクセス不可) ---
shtOutput.Cells(lngRow, 1).Value = "■ モジュール構成(省略)"
lngRow = lngRow + 1
wbTool.Close SaveChanges:=False
MsgBox "構造情報の出力が完了しました。", vbInformation
Application.ScreenUpdating = True
End Sub
コメント