条文シートの条文にインデックスを振ってみる
<<第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を押下
以上で、ボタンにマクロが紐付けられました。
ダイアログを表示して、ボタン操作で マクロを実行してみましょう!