3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Visual BasicAdvent Calendar 2024

Day 24

EXCEL VBAのフォームのオブジェクト一覧を自動作成

Last updated at Posted at 2024-12-23

VBAフォーム定義

VBAのユーザーフォームの定義表を作成するツールです。
対象のエクセルブックを開きますので、自己責任で注意して使ってください。
IMEモードをコード番号から日本語にしたものを掲載します。
型名順、名前順にソート設定が間違っていたので直しました。

.Sort.SortFields.Add Key:= とすべきところを
.Sort.SortFields.Add Keys:=  としていました。

このまちがいはコンパイルエラーにも実行時エラーにもならないので困りますね。

見当たらないけど一覧表に出るコントロール

著作権の関係で現物を載せられないのですが、あるフォームの定義表をこのツールで作成したら、クリックしても見つからないオプションボタンが出てくるのですが、出来ればDELETEしたいと思います。作り直す以外で何かいい方法があれば教えて下さい。

出力例

form2.png

プログラム

Option Explicit

'定数、変数
Const TITLE_ROW = 2
'下記項目の列位置表
Enum F_COL
    左端 = 1
    フォーム名
    型名
    名前
    IMEモード
    キャプション
    可視
    使用可
    ロック
    カラム数
    カラム幅
    使用カラム
    表示カラム
    上位置
    左位置
    高さ
    
    タブインデックス
    タブストップ
End Enum
Const MAX_COL = 19

Dim I As Long
Dim bookName As String
Dim outWorkbook As Workbook

'--------------------------------------------------------------------------------
'フォームのコントロールの種類、名前などを新規ブックの各シートに出力(メイン処理)
'--------------------------------------------------------------------------------
Public Sub makeFormDocument()

    '新規ワークブックに出力する
    Set outWorkbook = Workbooks.Add
    '分析対象のワークブックを選択する
    bookName = openVBAFILE
    '選択しなければ終了
    If bookName = "" Then Exit Sub
    
    '各モジュールを分析する
    Dim xlModule As Object
    For Each xlModule In Workbooks(bookName).VBProject.VBComponents
          
        If xlModule.Type = 3 Then
            'ユーザーフォームならオブジェクト定義一覧表を作成する
            Call getFormControls(xlModule)
            
        End If
        
    Next xlModule
    
    If bookName <> ThisWorkbook.Name Then Workbooks(bookName).Close False
    
    Windows(ThisWorkbook.Name).Activate
    Windows(outWorkbook.Name).Activate

End Sub

'------------------------------------------------------------------
'オブジェクト定義一覧表を作成する
'------------------------------------------------------------------
Private Sub getFormControls(ByVal fom As Object)

    Dim myCtrl As Object
    I = TITLE_ROW
    Worksheets.Add after:=ActiveSheet
    outWorkbook.ActiveSheet.Name = fom.Name
    
    With outWorkbook.ActiveSheet
        .Cells(I, F_COL.フォーム名) = "フォーム名"
        .Cells(I, F_COL.型名) = "型名"
        .Cells(I, F_COL.名前) = "名前"
        .Cells(I, F_COL.IMEモード) = "IMEモード"
        .Cells(I, F_COL.キャプション) = "キャプション"
        .Cells(I, F_COL.可視) = "可視"
        .Cells(I, F_COL.使用可) = "使用可"
        .Cells(I, F_COL.ロック) = "ロック"
        .Cells(I, F_COL.カラム数) = "カラム数"
        .Cells(I, F_COL.カラム幅) = "カラム幅"
        .Cells(I, F_COL.使用カラム) = "使用カラム"
        .Cells(I, F_COL.表示カラム) = "表示カラム"
        .Cells(I, F_COL.上位置) = "上位置"
        .Cells(I, F_COL.左位置) = "左位置"
        .Cells(I, F_COL.高さ) = "高さ"
        .Cells(I, F_COL.幅) = "幅"
        .Cells(I, F_COL.タブインデックス) = "タブインデックス"
        .Cells(I, F_COL.タブストップ) = "タブストップ"
    
'    列幅設定
        .Cells(I, F_COL.フォーム名).ColumnWidth = 10
        .Cells(I, F_COL.型名).ColumnWidth = 10
        .Cells(I, F_COL.名前).ColumnWidth = 20
        .Cells(I, F_COL.IMEモード).ColumnWidth = 8
        .Cells(I, F_COL.キャプション).ColumnWidth = 20
        .Cells(I, F_COL.可視).ColumnWidth = 6
        .Cells(I, F_COL.使用可).ColumnWidth = 6
        .Cells(I, F_COL.ロック).ColumnWidth = 6
        .Cells(I, F_COL.カラム数).ColumnWidth = 6
        .Cells(I, F_COL.カラム幅).ColumnWidth = 10
        .Cells(I, F_COL.使用カラム).ColumnWidth = 6
        .Cells(I, F_COL.表示カラム).ColumnWidth = 6
        .Cells(I, F_COL.上位置).ColumnWidth = 6
        .Cells(I, F_COL.左位置).ColumnWidth = 6
        .Cells(I, F_COL.高さ).ColumnWidth = 6
        .Cells(I, F_COL.幅).ColumnWidth = 6
        .Cells(I, F_COL.タブインデックス).ColumnWidth = 6
        .Cells(I, F_COL.タブストップ).ColumnWidth = 6
    
    For Each myCtrl In fom.Designer.Controls
    
        I = I + 1
        
        'Typeによっては、存在しないプロパティもあるのでエラーなら飛ばす
        On Error Resume Next
        
        .Range(.Cells(I, 1), .Cells(I, F_COL.タブストップ)).ClearContents
        
        .Cells(I, F_COL.フォーム名) = fom.Name
        .Cells(I, F_COL.型名) = TypeName(myCtrl)
        .Cells(I, F_COL.名前) = myCtrl.Name
        .Cells(I, F_COL.IMEモード) = fg_imeMode(myCtrl.IMEMode) ' 20241224UPDATE
        .Cells(I, F_COL.キャプション) = myCtrl.Caption
        .Cells(I, F_COL.可視) = myCtrl.Visible
        .Cells(I, F_COL.使用可) = myCtrl.Enabled
        .Cells(I, F_COL.ロック) = myCtrl.Locked
        .Cells(I, F_COL.カラム数) = myCtrl.columncount
        .Cells(I, F_COL.カラム幅) = myCtrl.columnwidths
        .Cells(I, F_COL.使用カラム) = myCtrl.boundcolumn
        .Cells(I, F_COL.表示カラム) = myCtrl.textcolumn
        .Cells(I, F_COL.上位置) = myCtrl.Top
        .Cells(I, F_COL.左位置) = myCtrl.Left
        .Cells(I, F_COL.高さ) = myCtrl.Height
        .Cells(I, F_COL.幅) = myCtrl.Width
        .Cells(I, F_COL.タブインデックス) = myCtrl.tabindex
        .Cells(I, F_COL.タブストップ) = myCtrl.tabstop
    Next
    
    'ソートする(なぜかうまくソートされてない?)
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=.Cells(TITLE_ROW, F_COL.型名), Order:=xlAscending
    .Sort.SortFields.Add Key:=.Cells(TITLE_ROW, F_COL.名前), Order:=xlAscending
    .Sort.SetRange .Range(.Cells(TITLE_ROW, F_COL.左端), .Cells(I, F_COL.タブストップ))
    .Sort.Header = xlYes
    .Sort.Apply
    
    'オートフィルター設定
    .Range("B2").AutoFilter
    
    'ウインドウ枠固定
    Range("E3").Select
    ActiveWindow.FreezePanes = True
    '項目名は折り返し表示
    .Range(Cells(TITLE_ROW, 1), Cells(TITLE_ROW, MAX_COL)).WrapText = True
    '縮小表示
    .Range(Cells(TITLE_ROW + 1, 2), Cells(I, 3)).ShrinkToFit = True
    '折り返し表示
    .Range(Cells(TITLE_ROW + 1, 4), Cells(I, MAX_COL)).WrapText = True
    '罫線を引く
   .Range(Cells(TITLE_ROW, 2), Cells(I, MAX_COL)).Borders.LineStyle = xlContinuous
   'タイトル設定
   .Cells(1, 3).Value = bookName & "(" & Format(Now, "YYYY/MM/DD") & ")"
    '印刷範囲設定
   .PageSetup.PrintArea = .Range(Cells(1, 2), Cells(I, MAX_COL)).Address
    
   End With

End Sub

'------------------------------------------------------------------
'対象ファイルをオープンしてファイル名を返す
'------------------------------------------------------------------
Private Function openVBAFILE() As String

    Dim targetFileName As String
    
    targetFileName = Application.GetOpenFilename("マクロ有効 EXCELブック, *.xlsm")
    If targetFileName = "False" Then Exit Function
    
    Application.EnableEvents = False
    Workbooks.Open targetFileName, ReadOnly:=True
    Application.EnableEvents = True
    
    If Not (ActiveWindow Is Nothing) Then
        ActiveWindow.Visible = False
    End If
    openVBAFILE = Mid(targetFileName, InStrRev(targetFileName, "\") + 1)
 
End Function

IMEモードを日本語化

MEモードをコード番号から日本語にしたものを掲載します。

'------------------------------------------------------------------
'IMEモード(数字)を日本語にして返す
'------------------------------------------------------------------
Private Function fg_imeMode(ByVal ime As String) As String

    If IsNull(ime) Then
          fg_imeMode = ""
          Exit Function
    End If
    
    Select Case ime
        Case "0"
           fg_imeMode = "制御なし"
        Case "1"
          fg_imeMode = "オン"
        Case "2"
          fg_imeMode = "オフ英語モード"
        Case "3"
          fg_imeMode = "使用不可"
        Case "4"
          fg_imeMode = "全角ひらがな"
        Case "5"
          fg_imeMode = "全角カタカナカタカナ"
        Case "6"
          fg_imeMode = "半角カタカナ"
        Case "7"
          fg_imeMode = "全角英数字"
        Case "8"
          fg_imeMode = "半角英数字"
        Case Else
           fg_imeMode = ""
    End Select
 
End Function

出力例

IMEJapan.png

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?