2016年11月29日火曜日

LibreBasicにいま持ってる知識で立ち向かってみる  法律勉強プログラムを作ってみるの巻 第3回

条文シートの条文にインデックスを振ってみる

<<第1回  <第2回                                                            第4回>

↑A列に条文に対応したIDを振ります

必要なもの:

・コンピュータ言語上、「逐次、選択、繰り返し」がわかる程度の知識と経験
・「マクロからシートを操作する」という言葉の意味がわかる程度の知識と経験
・自己責任を許容できる寛容な心
・プログラムを書く時間と勇気

手順:

1. 条文シート加工
2. インデックス挿入サブルーチン作成
3. ダイアログにボタンを追加してサブルーチンを割り当てる

 1. 条文シート加工

第2回能書きで、「条文シートはデータベース的な役割」と書いておいてアレですが、いきなりデータベースに手を入れます

全ての条文シートについてA列をインデックス用に空けます。

条文のシートをすべて選択した状態で列を選択します。
こうすることで全てのシートでA列が選択されるので、この状態で右クリックからの列挿入


条文の左側に列が追加されました。


2.インデックス追加のためにサブルーチンを作成します

条文の並びを観察して、上下の空白行を使ってインデックスを振って行きたいと思います。




以下、おもむろにサブルーチンを書きますが、動作を要約すると…
・条文本編が始まり(stt)、終わり(end)を検知して
・stt、endの間にある空白行に挟まれた塊を、「条文のような何か」としてインデックスをつけています
・インデックスには行番号を利用しています


'各法律のN条に対してインデックスを振る
'空白で挟まれているものをひとかたまりでインデックスを振る
Sub AddIndex

    Dim i,j,k as integer
    Dim sttflag as integer
    Dim flgchk as string
    Dim Flags&
  
    MsgBox "ID振り直します。お待ちください。ダイアログが出るまでお待ちください。"
  
    dim oSheets as object
    oSheets = ThisComponent.Sheets
    For i = 0 to oSheets.getCount()-1  '一応すべてのワークシートに対して繰り返す
  
            sttflag = 0
  
            ' 一度法条文シートのIDを消す
            Flags=com.sun.star.sheet.CellFlags.STRING + _
                       com.sun.star.sheet.CellFlags.VALUE + _
                      com.sun.star.sheet.CellFlags.FORMULA
            osheets(i).getcellrangebyname("A:A").clearContents(Flags)
              
             'はじめに「第一編」「第一章」「第一条」のどれかが現れるまで読み飛ばすまでのフラグを入力していく
            call addSttEndFlg(oSheets(i))
  
            '以下、各シートの条番号(上下を空白行で挟まれた文に)インデックスをつけていく
           ' 以下、とりあえず各シート5000行サーチする
           For j = 0 to 10000
                Dim onesomestring as string  
                '空白で挟まれた部分を発見する
                 '正規表現を使って「第N条」「第N条のSの…」に反応させる
                '()書きは無視
                 'インデックスをつける
                onesomestring = oSheets(i).getcellbyposition(1, j).string ' getcellbyposition(列、行)
                flgchk = oSheets(i).getcellbyposition(0, j).string
              
                ' stt~endに挟まれた部分を判定して、bookに唯一のIDを振リ直す
                if sttflag = 1 and onesomestring="" and flgchk = "end" then
                            exit for
                elseif sttflag = 1 and onesomestring="" then
                            oSheets(i).getcellbyposition(0, j+1).string = i * 100000 + j
                elseif sttflag = 0 and flgchk = "stt" then
                            sttflag = 1
                            oSheets(i).getcellbyposition(0, j+1).string = i * 100000 + j
                            j=j+1
                end if
              
           next j
    Next i
  
    MsgBox "ID振り直しが完了しました。 法条文シートをご確認ください。"
  
end sub


sub addSttEndFlg(sheet)
        Dim precellstr, cellstr, postcellstr as string
        Dim i,j,k as integer
        Dim sttflg,endflg as integer
      
        sttflg = 0
        for i=0 to 10000
            cellstr = sheet.getcellbyposition(1, i).string
          
            '第一編、第一章という単語を含む文字列の前後の行が空白なら、本文スタートと判断して、sttフラグを入力
            if sttflg = 0 and _
                instr(cellstr, "第一編") or _
                  instr(cellstr, "第一章") then
              
                precellstr = sheet.getcellbyposition(1, i-1).string
                postcellstr = sheet.getcellbyposition(1, i+1).string
                if precellstr = "" and postcellstr = "" then
                    sheet.getcellbyposition(0, i-1).string = "stt"
                    sttflg = 1
                end if
            end if
          
            ''二行空白が続けば終了と判断してendフラグを入力
            if sttflg = 1 and cellstr = "" then

                if sheet.getcellbyposition(1, i+1).string = "" then
                    sheet.getcellbyposition(0, i).string = "end"
                    exit for
                end if
            end if
          
        next i  
end sub

3. ダイアログにボタンを追加してサブルーチンを割り当てる


ボタンのウィジェットは画面下の方に並んでいます。
ダイアログ上適当なところにボタンを配置してみてください。
すると画面左側のプロパティウィンドウが現れるので、「タイトル」を変更してください。画面上のボタンの表記が変わると思います。
プログラム上のボタン名と、ボタンの見た目の表記は別々に管理されるので、混乱しないようにしてください。

 次に、ボタンへのアクションを割り当てます。
ダイアログ上のボタンを選択した状態で、プロパティウィンドのイベントタブを選択します
マウスを押した時の、「…」ボタンを押下
アクションのわりあてウィンドウで「マクロ」を押下
先ほど作成したサブルーチン「AddIndex」を選択してOKを押下
以上で、ボタンにマクロが紐付けられました。

ダイアログを表示して、ボタン操作で マクロを実行してみましょう!