引数あれこれ
かつて、一次元配列のソートについて紹介したことがあった。
infoment.hatenablog.com
昨日こちらを眺めていて、「あれ?」と思うことがあったので書いてみる。
配列ソートのコードを再掲してみる。こんな感じだ。
昇順・降順選択用の列挙型
Public Enum SortOrder myAscending myDescending End Enum
配列ソート
Public Function SortSeq(seq As Variant, _ Optional sort_type As SortOrder = myAscending) As Variant Dim aryList As Object Dim s As Variant Set aryList = CreateObject("System.Collections.ArrayList") For Each s In seq Call aryList.Add(s) Next Select Case sort_type Case myAscending ' 昇順でソート。 Call aryList.Sort Case myDescending ' 昇順でソートののち、降順へ反転。 Call aryList.Sort Call aryList.Reverse End Select SortSeq = aryList.ToArray End Function
その昔、私は引数について良く判っていなかった。だから、当時の私がこれを作成したら、恐らく
- 昇順ソート用
- 降順ソート用
の用途に合わせて決め打ちで作成し、さらにユーザー定義関数としての切り分けもしていなかったことだろう。
例)昇順
Sub サンプル() Dim aryList As Object Dim s As Variant ' 中略 配列 = なにがしかのデータ範囲 ' 昇順ソート Set aryList = CreateObject("System.Collections.ArrayList") For Each s In 配列 Call aryList.Add(s) Next aryList.Sort 配列 = aryList.ToArray ' 後略 End Sub
その後、引数で昇順や降順を選択できるようになるわけだが、このときはEnumの存在を知らないため、再現すればこのようになるだろう。
Public Function SortSeq(seq As Variant, _ Optional sort_type As Long = 1) As Variant
区別できれば何でもよい訳で、例えばLong型で変数を準備し、
- 1の場合:昇順
- 2の場合:降順
のような使い分けをしたに違いない。しかし、1や2という数字に意味はなく、ルールを知らなければ知り得ないものになったことだろう。
そのうちにEnumの存在を知り、冒頭に掲載した内容に落ち着いた。しかし、久しぶりに過去の成果物を見ていて思った。指定が何でも良いなら、既存のメンバーを使えばよいのでは?
Public Function SortSeq(seq As Variant, _ Optional sort_order As Excel.XlSortOrder = xlAscending) As Variant
これなら、Enumで独自のメンバーを設定する必要が無いし、既存のものであるため、第三者でも迷いなく理解できるなどの効果が期待できる。
Public Function SortSeq(seq As Variant, _ Optional sort_order As Excel.XlSortOrder = xlAscending) As Variant Dim aryList As Object Dim s As Variant Set aryList = CreateObject("System.Collections.ArrayList") For Each s In seq Call aryList.Add(s) Next Select Case sort_order Case xlAscending ' 昇順でソート。 Call aryList.Sort Case xlDescending ' 昇順でソートののち、降順へ反転。 Call aryList.Sort Call aryList.Reverse End Select SortSeq = aryList.ToArray End Function
知っている人にとっては、「どうってことない話」かも知れない。しかし、
Optional sort_order As Excel.XlSortOrder = xlAscending
って記述(が出来るようになったこと)は、ノンプログラマーの自分にとってかなり「お洒落」な感じがして嬉しいというか、気に入っている。
所詮は、自己満足かもしれませんが。
参考まで。