リストHOME  リストOpen Source

Config設定

概要

 日頃、コンピュータや携帯などで、アプリを使っていると設定画面などを利用することも有りますが、ここでは、そのシステム設定画面のサンプルコードを公開しています。画面は、架空のアプリ『水槽管理システム』となっており、ファイルにシステム設定値を保存する仕様となっています。この仕様は、複数のエクセルブックで設定値を共有できる点が、利点かと思います。

 ソースコードは、Microsoft社の製品 エクセル向けに書いたものなので、利用するには、ご使用のコンピュータに、エクセルがインストールされていることが、必須条件です。


 以下は、サンプル画面です。

システム設定画面のサンプル


技術ポイント


改善案

 今回の仕様は、Config値をファイルにて管理するものです。複数のエクセルブックで、Config値を共有する場合には、非常に便利ですが、もし、自身のエクセルブックだけに必要なシステム設定値であれば、エクセルのシートに保存する仕様をお勧めします。エクセルシートのVisibleプロパティをFalseにすることで、非表示の隠しシートにすることも可能です。
 またデータ数が多いようであれば、クイックソートを利用したソートに改善するべきと思います。


二分木探索について

 二分木探索の説明の前に、まず通常のFor文による検索について説明したいと思います。この方式のメリットは単純で、分かりやすいというところだと思います。また、他の検索には必要な、データの並び替え(ソート)も不要です。デメリットは、状況にもよりますが、総合的に検索速度が遅いことが挙げられるでしょう。特にデータ数が多くなればなるほど、二分木探索に比べると遅くなる可能性が高くなります。
 検索値となるデータがループの先頭近くにあれば、For文の場合、効率的に処理されますが、逆に検索値が最後の方に、位置していると、その分処理が遅くなることは、容易に理解できるかと思います。データ数が20あって、仮に、検索値がデータの最後にあれば、当然20回のループ処理を有することになります。


'*** For文によるデータ検索 ***
Private Function NormalSearch( _
                                ByVal v_name As String, _
                                ByVal lft As Long, _
                                ByVal rgt As Long) As Long
    Dim i As Long
    
    For i = LBound(CfgRecs) To UBound(CfgRecs)
        'Found
        If CfgRecs(idx).v_name = v_name Then
            NormalSearch = i
            Exit Function
            
        End If

    Next i
    
    'Not found.
    NormalSearch = False
    
End Function


 続いて、二分木探索は、一言で言うと、検索範囲を半分ずつに絞っていき、データを検索する方式です。 これは、データが20個あっても最大で、5回の検索処理で目的のデータにたどり着けます。

  2の4乗(16) < 20 < 2の5乗(32)


二分木探索の例

 For文が最悪の場合で、20回のループ処理が必要となっていたわけですが、二分木探索を採用すると、最悪でも5回の処理で検索値を見つけ出すことができます。For文の1回の処理と、二分木探索の1回の処理が同等と言うわけではありませんが、総合的にみて、二分木探索の方が、パフォーマンスが良いといえます。但し、二分木探索を利用するには、あらかじめ、検索されるデータが検索値を基準に(昇順もしくは、降順に)ソートされている必要性があります。


'*** 二分木探索 ***
Private Function BinarySearch( _
                                ByVal v_name As String, _
                                ByVal lft As Long, _
                                ByVal rgt As Long) As Long
    Dim idx As Long

    If rgt < lft Then
        '再帰呼び出しの終了
        BinarySearch = -1
        Exit Function

    End If

    '中間値
    idx = (lft + rgt) / 2

    If CfgRecs(idx).v_name = v_name Then
        BinarySearch = idx
        Exit Function

    '昇順に並んでいるので、検索値の方が小さかったら前半分を検索
    ElseIf v_name < CfgRecs(idx).v_name Then
        '再帰呼び出し 前半分を検索
        idx = BinarySearch(v_name, lft, idx - 1)

    '昇順に並んでいるので、検索値の方が大きかったら後ろ半分を検索
    Else
        '再帰呼び出し 後半分を検索
        idx = BinarySearch(v_name, idx + 1, rgt)

    End If

    BinarySearch = idx

End Function

ダウンロード

免責事項

 作者は、本ソフトウェアの使用または使用不能から生じるコンピュータの故障、情報の消失、その他あらゆる直接的及び間接的被害に関して一切の責任を負いません。

不具合の報告

 ご使用にあたり、改善の要望、不具合の発生等ありましたら、画面下のアドレスまで、ご連絡頂きますよう、宜しくお願いいたします。ご面倒、ご不便をお掛けしますが、宜しくお願いいたします。


休日判定・ページのフッター
管理者のメールアドレス