※当サイトはアフィリエイトプログラムによる収益を得ています。

アウトライナーもどきをExcelマクロで自作していた、1999年。



大橋悦夫ファイルの整理をしていたら、アウトライナーもどきのExcelシート(マクロ)が出てきました。

  • 「-」のセルを選択して「展開折り畳み」をクリックすると折りたたみ。
  • 「+」のセルを選択して「展開折り畳み」をクリックすると展開。

選択したセルの配下にある行の非表示・表示を切り替えるだけのマクロですが(動作スピードも極めて遅いですが)、当時はこれで十分でした。

これを作ったのは1999年(会社員3年目)で、当然のごとくWorkflowやDynalistなどは存在しなかったので自作したのですが、Wordのアウトラインモードを使えば済むところです。

要するに当時はマクロ作りに夢中だったわけです。

見ていただくとわかるとおり、目標設定のために作りました。

ソース

以下がソースです。シート上にボタンを作り、「FoldMain」をマクロ登録すると動きます。キーボードショートカットを割り当てても良いでしょう(手順は割愛します)。

 
Option Explicit
Public Const mlngMaxLevel As Long = 6

'「展開折り畳み」ボタンに登録
Sub FoldMain()
    Dim lngRowDef As Long
    
    lngRowDef = Selection.Row
    With Application
        .ScreenUpdating = False
        Call SetFoldRows(lngRowDef)
        .ScreenUpdating = True
    End With
End Sub

Sub SetFoldRows(lngRowDef As Long)
    Dim lngLevelDef As Long
    Dim lngRow As Long
    Dim lngLevel As Long
    
    'Default Row,Level
    lngRow = lngRowDef
    lngLevelDef = Cells(lngRow, 1)
    lngLevel = lngLevelDef
    
    'Is Existence of Contents
    If lngLevel = 0 Then
        Exit Sub
    End If
    
    'Is Existence of Child(ren)
    If lngLevel >= Cells(lngRow + 1, 1) Then
        Exit Sub
    End If
    
    'Add Mark "+/-"
    AddMark lngRow, lngLevel
    
    'Fold/Expand
    Call FoldRows(lngRow, lngLevel, Left(Selection, 1))
    
    'Set Cursor on the Mark
    Cells(lngRowDef, lngLevelDef + 1).Select
End Sub

Sub AddMark(plngRow As Long, plngLevel As Long)
    If Cells(plngRow + 1, 1).RowHeight = 0 Then
        'Add "-" for Expanded
        With Cells(plngRow, plngLevel + 1)
            Select Case Left(.Value, 1)
                Case "-"
                Case "+"
                    .Value = "'- " & Right(.Value, Len(.Value) - 2)
                Case Else
                    .Value = "'- " & Right(.Value, Len(.Value))
            End Select
        End With
    Else
        'Add "+" for Folded
        With Cells(plngRow, plngLevel + 1)
            Select Case Left(.Value, 1)
                Case "+"
                Case "-"
                    .Value = "'+ " & Right(.Value, Len(.Value) - 2)
                Case Else
                    .Value = "'+ " & Right(.Value, Len(.Value))
            End Select
        End With
    End If
End Sub

Sub FoldRows(plngRowE As Long, plngLevelDef As Long, pstrMark As String)
    Dim lngRowHeightDef As Long
    Dim lngRowHeight As Long
    Dim lngRowS As Long
    Dim lngLevel As Long
    Dim isBreak As Boolean
        
    'Choose Fold(+) or Expand(-)
    Select Case pstrMark
        Case "+"
            lngRowHeight = 0
        Case "-"
            lngRowHeight = Selection.RowHeight
        Case Else
            Call ErrorEnd("プログラム内部エラー/Sub FoldRows")
    End Select
    
    'Set Fold/Expand Range
    lngLevel = plngLevelDef + 1
    isBreak = False
    
    Do Until lngLevel <= plngLevelDef
        plngRowE = plngRowE + 1
        If isBreak = False Then
            lngRowS = plngRowE
            isBreak = True
        End If
        lngLevel = Cells(plngRowE, 1)
    Loop
    
    'Fold/Expand
    With Range(Cells(lngRowS, 1), Cells(plngRowE - 1, mlngMaxLevel))
        If lngRowHeight > 0 Then
            'Replace + to -
            .Replace What:="+", Replacement:="-", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False
            .EntireRow.AutoFit
        Else
            .RowHeight = lngRowHeight
        End If
    End With
End Sub

Sub ErrorEnd(pstrMsg As String)
    If pstrMsg <> "" Then
        Call MsgBox(pstrMsg, , "エラー")
    End If
    Application.ScreenUpdating = True
    End
End Sub


参考文献:

目下、Excelの最新版に合わせてVBAの勉強をやり直しているのですが、以下の本はある程度VBAの経験がある人でも意外と見落としがちなポイントも丁寧に解説してあり、幅広くおすすめできます。


コーディング時にちょいちょい参照するリファレンスとしては以下。960ページもの大ボリュームなのでKindle版が良いですね。

ただ、固定レイアウトのため、ハイライトや検索には対応していません。


最後に、中級者向けにはなるのですが、大村あつしさんの逆引き本です。VBAを学び始めた当初から大村あつしさんの本ばかりを読んでいたのですが、現在もご活躍なのが個人的にはうれしいです。

なお、Kindle版は固定レイアウトではないので、ハイライトや検索もOKです!