ファイルの整理をしていたら、アウトライナーもどきの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です!