LeagalAC用 司法書士業務と身近なデジタル

 法務系Advent Calendar2021 6日目担当です。keibunibu さんから引き継ぎました。沖縄県で司法書士をしています。宮城直です。1人事務所で職員はいません。弁護士、企業の法務部の方が多いようなので、私に有益な情報が出せるのか分かりませんが、1つでも気付き等があれば幸いです。

<a href=”https://adventar.org/calendars/6159″>https://adventar.org/calendars/6159</a>

裏LeagalACは、ぼっち法務(Shun Yamashita)_Hubbleさんです。私も読んでみます。

1.とりあえず作ってみたものを発表。改善点等あれば、指摘をお願いします。私の技術で対応出来そうであれば、やりたいと思います。

 参考までにファイルのリンクを貼っていますが、セキュリティ面からダウンロードなどは危ないのかなと思います(誰も必要としていなかったらすみません。)。

https://scrapbox.io/okinanananawawawa/

Emotetの解析結果について 2021年11月26日警察庁

https://www.jpcert.or.jp/at/2019/at190044.html?fbclid=IwAR2SpZ5H3ZbW8jUXZVztHD2bsGIhseGKnZW8GRF7S5Kau65IP3xnU2ThUKU

メールに添付された文書ファイルを開いた時に、マクロやセキュリティに関する警告が表示された場合には、マクロを有効にしたり、セキュリティ警告を無視するような操作をしない。

1番 ライト 「条文検索_法令検索API」

・環境・・・MicrosoftExcel2016

・利用方法・・・法令APIボタンを押して、法令・条項を選択し、検索ボタンを押す。

・スクリーンショット

・中身

Option Private Module
'---------------------------------------------------------------------
' HTTP通信用定義。
'---------------------------------------------------------------------
Sub E_Gav(eType As Long, Article As Long, Plus As Long, Item As Long, f As UserForm)
Dim objXMLHttp As Object, XMLstr  As String, str As String, tx As String, Bodystr As String, V(20), n(20)
'--------------------------------------------------------------------
'HTTPリクエストをするIXMLHTTPRequestオブジェクト。
'文字列変換。指定した数だけ繰り返した文字列を取得。階差有り。
'--------------------------------------------
Dim i As Long, num As Long, tmp As String, ArtStr As String, KakkoFlg As Long
    Set objXMLHttp = CreateObject("MSXML2.XMLHTTP")
    objXMLHttp.Open "GET", E_URL(eType, Article, Plus, ArtStr)
    objXMLHttp.Send
'---------------------------------------------------------------------
'500000回実行したら、プログラムは終了(一旦ファイルを閉じる。)
'--------------------------------------------
    For i = 1 To 500000
        If objXMLHttp.readyState = 4 Then Exit For
        DoEvents
        If i = 500000 Then MsgBox "ネット接続がありません": Exit Sub
    Next
    XMLstr = objXMLHttp.responseText
    f.Title = E_StrSearch(XMLstr, "ArticleCaption")

    For i = 1 To 20
       n(i) = E_NoSearch(XMLstr, "Paragraph", i)
       If n(i) = 0 Then n(i) = E_NoSearch(XMLstr, "Paragraph Hide=""false""", i)
       If n(i) = 0 Then n(i) = Len(XMLstr)
'---------------------------------------------------------------------
'見回りを止めて文字列を返す場合を定義。tmp・・・一時的に値を格納。
'--------------------------------------------
    Next
    For i = 1 To 20
        If n(i + 1) = n(i) Then Exit For
        For j = n(i) To n(i + 1)
            tmp = Mid(XMLstr, j, 1)
            If tmp = ">" Then
                flg = True
            ElseIf tmp = "<" Then
                flg = False
            End If
            If flg And tmp <> ">" And tmp <> " " Then
                V(i) = V(i) & tmp
            End If
'---------------------------------------------------------------------
'表示されるフォームの設定。
'--------------------------------------------
        Next
        V(i) = Replace(V(i), vbLf, "\")
        V(i) = Replace(V(i), vbCrLf, "\")
        V(i) = Replace(V(i), vbCr, "\")
        V(i) = Replace(V(i), "\" & "\" & "\" & "\", "\")
        V(i) = Replace(V(i), "\" & "\" & "\", "\")
        V(i) = Replace(V(i), "\" & "\", "\")
        If Left(V(i), 1) = "\" Then V(i) = Mid(V(i), 2)
        If Right(V(i), 1) = "\" Then V(i) = Mid(V(i), 1, Len(V(i)) - 1)
        If IsNumeric(Left(V(i), 1)) Then V(i) = Mid(V(i), 2)
        If Left(V(i), 1) = "\" Then V(i) = Mid(V(i), 2)
        V(i) = Replace(V(i), "\", "<Br>")
'---------------------------------------------------------------------
'表示されるフォームの設定。
'--------------------------------------------
    Next
    tx = "<b>" & f.Controls("OptionButton" & eType).Caption & ArtStr & "</b><Br>"
    For i = 1 To 20
        If V(i) <> "" Then
            If i = Item Then tx = tx & "<FONT COLOR=#0000DD>"
            tx = tx & "<b>【第" & i & "項】</b>" & "<Br>" & V(i) & "<Br>"
            If i = Item Then tx = tx & "</FONT>"
        End If
'---------------------------------------------------------------------
'括弧書きフラグ。開始位置、場合、とき等の処理。
'--------------------------------------------
    Next
        KakkoFlg = 0
        For j = 1 To Len(tx)
            tmp = Mid(tx, j, 1)
            If tmp = "(" Or tmp = "(" Then
                Bodystr = Bodystr & "<FONT COLOR=#777777>("
                KakkoFlg = KakkoFlg + 1
            ElseIf tmp = ")" Or tmp = ")" Then
                Bodystr = Bodystr & ")</FONT>"
                KakkoFlg = KakkoFlg - 1
            ElseIf Mid(tx, j, 1) = "。" And KakkoFlg = 0 Then
                Bodystr = Bodystr & "<b>。</b>"
            ElseIf Mid(tx, j, 2) = "場合" Then
                Bodystr = Bodystr & "<FONT COLOR=#009900>場合</FONT>"
                j = j + 1
            ElseIf Mid(tx, j, 2) = "とき" Then
                Bodystr = Bodystr & "<FONT COLOR=#009900>とき</FONT>"
                j = j + 1
                
            ElseIf Mid(tx, j, 2) = "除く" Then
                Bodystr = Bodystr & "<FONT COLOR=#FF3366>除く</FONT>"
                j = j + 1
                
            ElseIf Mid(tx, j, 2) = "及び" Then
                Bodystr = Bodystr & "<FONT COLOR=#FF9900>および</FONT>"
                j = j + 1
            ElseIf Mid(tx, j, 3) = "並びに" Then
                Bodystr = Bodystr & "<FONT COLOR=#FFCC00>並びに</FONT>"
                j = j + 2
                
            ElseIf Mid(tx, j, 2) = "又は" Then
                Bodystr = Bodystr & "<FONT COLOR=#FF9900>又は</FONT>"
                j = j + 1
            ElseIf Mid(tx, j, 4) = "若しくは" Then
                Bodystr = Bodystr & "<FONT COLOR=#FFCC00>若しくは</FONT>"
                j = j + 3
                
            ElseIf Mid(tx, j, 3) = "ただし" Then
                Bodystr = Bodystr & "<FONT COLOR=#FF0000><b>ただし</b></FONT>"
                j = j + 2
            ElseIf InStr("一二三四五六七八九十百千", tmp) > 0 Then
                num = E_number(num, tmp)
            ElseIf num <> 0 Then
                Bodystr = Bodystr & num & tmp
                num = 0
            Else
                Bodystr = Bodystr & tmp
            End If
'---------------------------------------------------------------------
'今後、htmlなどを省略する。
'---------------------------------------------------------------------
        Next
    With f.WebBrowser1
        .Navigate "about:blank"
        DoEvents
        .Document.Write "<HTML>"
        .Document.Write "<HEAD>"
        .Document.Write "<font size=""3"" face=""Meiryo UI"">"
        .Document.Write Replace(Bodystr, "_未", "<FONT COLOR=red>_未</FONT>")
        .Document.Write "</BODY>"
        .Document.Write "</HTML>"
        .Document.Body.Style.overflow = "hidden"
    End With
End Sub
'---------------------------------------------------------------------
'開始文字で分ける準備。十、百、千は次の文字列を探す。
'--------------------------------------------
Function E_number(n As Long, tmp As String)
    Select Case tmp
    Case "一"
        E_number = n + 1
    Case "二"
        E_number = n + 2
    Case "三"
        E_number = n + 3
    Case "四"
        E_number = n + 4
    Case "五"
        E_number = n + 5
    Case "六"
        E_number = n + 6
    Case "七"
        E_number = n + 7
    Case "八"
        E_number = n + 8
    Case "九"
        E_number = n + 9
    Case "十"
        buf = n Mod 10
        If buf = 0 Then buf = 1
        E_number = Int(n / 100) * 100 + buf * 10
    Case "百"
        buf = n Mod 10
        If buf = 0 Then buf = 1
        E_number = Int(n / 1000) * 1000 + buf * 100
    Case "千"
        buf = n Mod 10
        If buf = 0 Then buf = 1
        E_number = Int(n / 10000) * 10000 + buf * 1000
    End Select
End Function
'---------------------------------------------------------------------
'<で始まり、>で終わらない文字列は検索から弾く。
'--------------------------------------------
Function E_NoSearch(XMLstr As String, str As String, no As Long) As Long
    E_NoSearch = InStr(XMLstr, "<" & str & " Num=""" & no & """>")
End Function
'---------------------------------------------------------------------
'<,/,>なども文字列として返す。
'--------------------------------------------
Function E_StrSearch(XMLstr As String, str As String) As String
Dim wLen As Long, wStartPoint As Long, wEndPoint As Long
    wLen = Len(str)
    wStartPoint = InStr(XMLstr, "<" & str & "") + wLen + 2
    wEndPoint = InStr(XMLstr, "</" & str & ">")
    If wEndPoint - wStartPoint < 1 Then Exit Function
    E_StrSearch = Mid(XMLstr, wStartPoint, wEndPoint - wStartPoint)
End Function

Function E_URL(Typ As Long, Article As Long, Plus As Long, ArtStr As String) As String
Dim ArtUrl As String, LawUrl As String, TmpRng As Range
    Select Case Typ
    Case 1
       LawUrl = encodeURL("明治二十九年法律第八十九号")
    Case 2
       LawUrl = encodeURL("平成十六年法律第百二十三号")
    Case 3
       LawUrl = encodeURL("平成十六年政令第三百七十九号")
    Case 4
       LawUrl = encodeURL("平成十七年法務省令第十八号")
    Case 5
       LawUrl = encodeURL("平成十七年法律第八十六号")
    Case 6
       LawUrl = encodeURL("平成十七年法律第八十七号")
    Case 7
       LawUrl = encodeURL("平成十八年法務省令第十二号")
    Case 8
       LawUrl = encodeURL("昭和三十八年法律第百二十五号")
    Case 9
       LawUrl = encodeURL("昭和三十九年法務省令第二十三号")
    Case 10
       LawUrl = encodeURL("平成十九年法律第二十二号")
    Case 11
       LawUrl = encodeURL("昭和二十五年法律第百九十七号")
    Case 12
       LawUrl = encodeURL("昭和二十二年法律第二百二十四号")
    Case 13
       LawUrl = encodeURL("昭和二十二年司法省令第九十四号")
    Case 14
       LawUrl = encodeURL("平成十八年法律第百八号")
    Case 15
       LawUrl = encodeURL("平成十九年法務省令第四十一号")
    Case 16
       LawUrl = encodeURL("昭和三十二年法律第二十六号")
    End Select
    For i = 1 To 9999   
'NUMBERSTRINGが関数としてしか動かないので空いてるセルを探して一時使用
        If Cells(1, i) = "" Then Set TmpRng = Cells(1, i): Exit For
    Next
'---------------------------------------------------------------------
'返す文字列の定義。条、項、号。
'--------------------------------------------
        TmpRng.FormulaR1C1 = "=NUMBERSTRING(" & Article & ",1)"
        Calculate
        ArtStr = "第" & TmpRng.Value & "条"
        If Plus <> 0 Then
            TmpRng.FormulaR1C1 = "=NUMBERSTRING(" & Plus & ",1)"
            Calculate
            ArtStr = ArtStr & "の" & TmpRng.Value
        End If
'---------------------------------------------------------------------
'別のファイルからExcelファイルに格納する。法令検索APIから「1」の法令を取得。
'--------------------------------------------
        TmpRng.Value = ""
    ArtUrl = encodeURL(ArtStr)
    E_URL = "https://elaws.e-gov.go.jp/api/1/articles;lawNum=" & LawUrl & ";article=" & ArtUrl
End Function

'---------------------------------------------------------------------
'UTF-8をサポートする。
'--------------------------------------------
Function encodeURL(ByRef str As String) As String
    For i = 1 To 9999
        If Cells(i, 1) = "" Then Set TmpRng = Cells(i, 1): Exit For
    Next
        TmpRng.FormulaR1C1 = "=ENCODEURL(""" & str & """)"
        Calculate
    encodeURL = TmpRng.Value
    TmpRng.Value = ""
End Function

・用途

 条文の仕組みを一定限度で知る。

・主な改善点

 法令番号を記載して法令検索APIに対してリクエストを送信しています。しかし、法令IDを記載すると、情報を取得できません。pythonなどコードからは取得することが出来ます。法令ID で情報を取得できないと、改正後未施行の法令を表示することが出来ません。

e-Gov 法令 API 仕様書(Version 1)1.3 版2020 年 11 月 24 日P4

法令API

https://elaws.e-gov.go.jp/apitop/

2番 ショート PDFファイルからテキストファイル(メモ帳)変換

・環境 windows10 python3 Visual Studio Code

#pdfminer. Pdfinterp.converter. ・・・pdfファイルからテキストを抽出する。#PDFResourceManager・・・抽出したテキストを管理。LAParams・・・pdfファイルの構造を保持する機能を提供。PDFPage・・・1ページずつ取得。
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage

#input_path =‘ファイル名.pdf’。pdfファイルを入れる。
input_path = 'page000001_00269.pdf'

#result.textという名前のファイル・拡張子でアウトプットする。
output_path = 'result.txt'

manager = PDFResourceManager()

#テキストへの変換のため、TextConverterを使用。for文でPDFに1ページずつアクセスしながら、テキストを抽出。
with open(output_path, "wb") as output:
    with open(input_path, 'rb') as input:
        with TextConverter(manager, output, codec='utf-8', laparams=LAParams()) as conv:
            interpreter = PDFPageInterpreter(manager, conv)
            for page in PDFPage.get_pages(input):
                interpreter.process_page(page)


・用途
 不動産の登記情報PDFファイルをテキスト化して、登記申請の際や顧客データベース入力の際に利用する。PDFファイルは、構造化されている必要があります。他にGoogleドライブを利用する方法などあると思いますが、各組織・個々人で利用しやすい方法を採れば良いのかなと思います。

PDFの規格について

PDFの基準が改訂されました 2021年1月5日

https://www.iso.org/news/ref2608.html

ISO 32000-1

https://www.iso.org/standard/51502.html

ISO 32000-2

https://www.iso.org/standard/75839.html

PDF のプロパティとメタデータ

https://helpx.adobe.com/jp/acrobat/using/pdf-properties-metadata.html

PDF Tool API「7.3 PDFファイルの判定」

https://www.antenna.co.jp/ptl/cookbook/vol4/i02-0054.html


3番 サード 会社法人等番号→法人番号

・環境・・・マイクロソフトExcel2016 関数

・下の関数だと、C2のセルに会社法人等番号を入力すると(登記情報のPDFファイルからコピー&ペーストすることを想定しています。)、D2のセルに法人番号が出力されます。

=IF(C2=””,””,9-MOD(SUMPRODUCT(MID(TEXT(C2,”0000000000000″),{2,3,4,5,6,7,8,9,10,11,12,13},1)*{2,1,2,1,2,1,2,1,2,1,2,1}),9))&C2

チェックデジットの計算

https://www.houjin-bangou.nta.go.jp/documents/checkdigit.pdf

・用途・・・顧客データベースの作成。法人名が難しい場合、法人番号から法人名とフリガナを知る、など。

・参考・・・法人番号に関する他の方の記事です。 

「会社法人等番号」を「法人番号」へと変換するRubyのコード

https://qiita.com/kawasaki/items/fc1abfd62db10fa082ca

「会社法人等番号」を「法人番号」へと変換するJavaScriptのコードhttps://qiita.com/kawasaki/items/d124b51a4d75ebec33fb

・寄り道・・・不動産IDも作成されるようです。

4番 センター ショートカットキー

・環境・・・マイクロソフトExcel2016

元コードのリンクです。

https://github.com/ExcelVBAer/RibbonEditorJP/blob/main/README.md

・スクリーンショット

・用途・・・Excelのショートカットキーを覚えるまでの練習。

5番 セカンド 比較

・環境・・・マイクロソフトExcel2016

・用途・・・官報の新旧対照表を成型して、比較するなど。

・参考 マイクロソフトサポート「形式を選択して貼り付け」

https://support.microsoft.com/ja-jp/office/%E5%BD%A2%E5%BC%8F%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91-e03db6c7-8295-4529-957d-16ac8a778719

・スクリーンショット

・中身
Sub StrDifEmphasis()
    Const Str1StartSetCell As String = "A2"   ' 文字列1の開始セルの設定セルを指定
    Const TargetCountSetCell As String = "B2" ' 対象行数の設定セルを指定
    
    Dim Str1StartCell As String '文字列1の開始セル
    Dim targetCount As Integer  '対象行数    
    
  Str1StartCell = ActiveSheet.Range(Str1StartSetCell).Value '文字列1の開始セルを取得
  targetCount = ActiveSheet.Range(TargetCountSetCell).Value '対象行数を取得
    
    Dim rowCount As Integer ' 行数のカウンター
    
    ' 対象行走査ループ。文字列1の開始セルから終了セル(対象行数分下)までループ
    For rowCount = 1 To targetCount
        
        ' 頻繁に使用する箇所を変数化(コードを短く且つ冗長性を排除するため)
        Dim str1cell As Range ' 文字列1セル
        Dim str2cell As Range ' 文字列2セル
        Dim resultCell As Range ' 結果セル

        Dim str1 As String ' 文字列1の値
        Dim str2 As String ' 文字列2の値        

        'セルを取得
        Set str1cell = ActiveSheet.Range(Str1StartCell).Offset(rowCount - 1, 0)
        Set str2cell = ActiveSheet.Range(Str1StartCell).Offset(rowCount - 1, 1)
        Set resultCell = ActiveSheet.Range(Str1StartCell).Offset(rowCount - 1, 2)
        
        '文字列1と2の値を取得
        str1 = str1cell.Value
        str2 = str2cell.Value

        'セルの状態を初期化。文字列セルを黒文字に、結果を空白にする
        resultCell.Value = ""
        str1cell.Font.Color = vbBlack
        str2cell.Font.Color = vbBlack

        ' 2つの文字列が異なる場合にのみ処理を行う
        If str1 <> str2 Then
            
            ' 結果セルにメッセージを設定
            resultCell.Value = "改正"
            
            Dim maxLen As Integer ' 2つの文字列の長い方の文字数
            
            ' 2つの文字列の長い方の文字数を設定
            If Len(str1) > Len(str2) Then
                ' 文字列1の方が長いため、文字列1の文字数を設定
                maxLen = Len(str1)
            Else
                ' 文字列2の方が長いため、文字列1の文字数を設定
                ' (文字数が同じ場合もこの処理。str1で行っても同じ)
                maxLen = Len(str2)
            End If
            
            Dim charCount As Integer ' 比較用文字数カウンター
            
            ' 文字比較ループ。大きいほうの文字列の文字数だけループ
            For charCount = 1 To maxLen
                Dim char1 As String '文字列1から抽出した1文字
                Dim char2 As String '文字列2から抽出した1文字
                
                Dim isChar1Under As Boolean ' 文字列1の文字数内か否か
                Dim isChar2Under As Boolean ' 文字列2の文字数内か否か
                
                '文字列1から1文字抽出
                If charCount <= Len(str1) Then
                    'charCountが文字数内に収まっているため1文字抽出
                    char1 = Mid(str1, charCount, 1)
                    isChar1Under = True
                Else
                    '文字数内に収まっていないため空白文字とする
                    char1 = ""
                    isChar1Under = False
                End If
                
                '文字列2から1文字抽出
                If charCount <= Len(str2) Then
                    'charCountが文字数内に収まっているため1文字抽出
                    char2 = Mid(str2, charCount, 1)
                    isChar2Under = True
                Else
                    '文字数内に収まっていないため空白文字とする
                    char2 = ""
                    isChar2Under = False
                End If
                
                ' 相違している文字を赤色に変更
               If char1 <> char2 Then
                If isChar1Under Then
                str1cell.Characters(Start:=charCount, Length:=1).Font.Color = vbRed
                    End If
                    
                If isChar2Under Then
                 str2cell.Characters(Start:=charCount, Length:=1).Font.Color = vbRed
                    End If
                End If                
            Next            
        End If        
    Next  
    MsgBox ("終了")

End Sub

・参考 GitHubで差分を出した場合(白抜きになっている部分が差分です。)。

6番 キャッチャー 会社・法人登録免許税計算

・環境・・・マイクロソフトExcel2016

・用途・・・会社・法人登記の登録免許税を計算してみる。

・改善点・・・見積書等に利用する際は、

1 登記、登録、特許、免許、許可、認可、認定、指定又は技能証明の事項について略称の追加

2 登記情報、登記事項証明書取得、議事録作成や交通費等の料金表マスターデータの追加

3 報酬基準マスターデータの追加

が必要なのかなと思います。利用した機能は、ドロップダウンリスト・IF関数、VLOOKUP関数・e-Gov法令検索のXMLファイルをExcelにインポート・VBAです。

・スクリーンショット

・中身

Dim 下端 As Integer                             '元データの下端
'---------------------------------------------------------------------------------
Sub 漢数字を半角数字に置き換える()
    Sheets("登録免許税").Select                        'シートを選択する ※1
        Columns("A:A").Copy
        Range("B1").PasteSpecial Paste:=xlAll   'すべて貼り付け
        Range("B1").Select                      '列見出し
            ActiveCell.Value = "半角英数"
        下端 = Range(Cells(1, 2), Cells(1, 2)).End(xlDown).Row '元データの下端検出
        リプレスする
End Sub
'---------------------------------------------------------------------------------
'---------------------------------------------------------------------------------
Private Sub リプレスする()
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="一件につき", replacement:=""
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="一万八千", replacement:="18000"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="一万五千", replacement:="15000"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="十五", replacement:="15"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="一", replacement:="1"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="二", replacement:="2"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="三", replacement:="3"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="四", replacement:="4"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="五", replacement:="5"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="六", replacement:="6"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="七", replacement:="7"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="八", replacement:="8"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="九", replacement:="9"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="○", replacement:="0"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="万", replacement:="0000"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="九千", replacement:="9000"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="二千", replacement:="2000"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="千分の", replacement:="1000/"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="千", replacement:="000"
        Range(Cells(2, 2), Cells(下端, 2)).Replace what:="十", replacement:="0"
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="・", replacement:="."
    Range(Cells(2, 2), Cells(下端, 2)).Replace what:="円", replacement:=""
    
End Sub

7番、8番、9番   ――――といきたいところですが、ここで息切れです。失敗を載せます。

7番 国税庁法人番号システムWEB‐APIを利用し、会社名を入力すると、法人番号・商号・本店所在地が出力されるようにする。3番の前に試してみました。 

国税庁法人番号公表サイト WEB-API仕様書(各バージョン)

https://www.houjin-bangou.nta.go.jp/webapi/kyuusiyousyo.html

・中身

'---------------------------------------
法人番号という名前で何かを作る。
'---------------------------------------
Sub 法人番号()
'---------------------------------------
文字列型で処理する。iは、長い整数として、箱に入れます。
'---------------------------------------
Dim CorpName As String
Dim i As Long
Dim arr As Variant
'---------------------------------------
1行目から最終行まで処理する。エラーが発生した場合、次のVBAコードに進む。
会社名(商号)は、リクエストする際のURLに格納する。
'---------------------------------------
For i = 2 To ThisWorkbook.Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row
CorpName = Cells(i, 2)
On Error Resume Next
arr = CorpCode(URL_Encode(CorpName))
'---------------------------------------
法人番号は、法人名を入力したセルから3つ離れたセルへ出力、法人の正式名称(商号)は、法人名を入力したセルから3つ離れたセルへ出力など。
'---------------------------------------
Cells(i, 3) = arr(4)
Cells(i, 4) = arr(9)
Cells(i, 5) = arr(12)
Cells(i, 6) = arr(13)
Cells(i, 7) = arr(14)

Next i
End Sub
'---------------------------------------
国税庁法人番号公表サイトに対して、リクエストを送信。
'---------------------------------------

Function CorpCode(CorpName As String) As String()
Dim objXMLHttp As Object
Dim tmp
Set objXMLHttp = CreateObject("MSXML2.XMLHTTP")
    objXMLHttp.Open "GET", "https://api.houjin-bangou.nta.go.jp/4/name?id=■■■ID■■■&type=02&mode=2&name=" & CorpName, False
    objXMLHttp.Send
'---------------------------------------
返ってきた情報を、区分に従って区切る。
'---------------------------------------
  
    tmp = Split(Replace(objXMLHttp.responseText, """", ""), ",")
    CorpCode = tmp
'---------------------------------------
End Function
'---------------------------------------
このリクエストはJScript で書かれている。UTF-8に基づいて文字列を出力する。
'---------------------------------------
Function URL_Encode(ByVal strOrg As String) As String
  With CreateObject("ScriptControl")
    .Language = "JScript"
    URL_Encode = .CodeObject.encodeURI(strOrg)
  End With
End Function

・スクリーンショット

でも。。。

 この方法だと金融機関などの場合は正確な情報が出てくるのですが、一般に複数使われているような会社名の場合、都道府県と市区町村を絞り込んで国税庁法人番号システムWEB‐APIにリクエストすることが必要となります。そこまでするのだったら、国税庁の法人番号公表サイトや経済産業省のgBizINFO(ジービズインフォ)サイトで検索をかけた方が速いし正確だ、という判断となり途中で止めました。

8番 法令施行日カレンダー

法令検索APIから、施行日が取得できないので諦めました。

9番 実質的支配者の判定計算

法務省 実質的支払リスト制度の創設(令和4年1月31日運用開始)

https://www.moj.go.jp/MINJI/minji06_00116.html

・株主が実質的支配者に該当するか、判定出来るようにしたかったのですが、間接保有の合算が出来ませんでした。

・スクリーンショット

2 何故、作るのか。

 私は業務用ベンダーソフトや、他のサービスも利用しています。それらがどのような仕組みで動いているのか知りたかったのと、実際のデータを持っている私が、資金や技術、時間の制約の中で作ったらどうなるのか、試してみたかったということがあります。

 自分で出来なかった部分は、改めてベンダーソフトやサービスの凄さを実感し、まだ使い倒してないんじゃないか、もっと色々な使い方があるんじゃないかと感じます。また、1人情シスSlackグループで、質問が出来るようになりました。

3 何故、Excelを使っているのか。

 まず第一に、私の技術不足があります。まだ分からないことが多く、使いながら覚えようとしているつもりでも、忘れています。私がこの半年間で作ってみたものは、ほとんどマイクロソフトExcelを利用しています。現在、CSV、Googleスプレッドシートなど情報をデータベースとして利用するためのソフトには様々なものがあると思います。Excelが入っていないパソコンを使っている方もいらっしゃるかもしれません。

私は、半年ほど前までは、CSVやGoogleスプレッドシートを利用して、他の人が書いたコードを真似しながら自分が作りたいものを作ろうとしていました。

 マイクロソフトExcelに興味を持ったきっかけは、ツイッター上でエクセルに使い方をつぶやいてくださる士業の方(軍曹先生支援先生のざき先生など)がいたからです。それまではただの表、時々ワードの代わりに、箇条書きの文書を作成するのに使うソフトだと思っていました。書籍は論文を書く際に、Excelの本を1冊購入しただけでした。

 市販のExcelに関する書籍や、インターネット上の情報では興味が持てない理由は、業種(私の場合は士業)により全く使わない関数や、VBA(コード)があり、一般に販売されているExcel等の書籍では合わないのだと、Twitter上のExcel使いの方に教えてもらいました。今回作ってみたものも、ほぼマイクロソフトの公式サポートと、他の人が作ったものを参考にしています。

 また、Excelで作ることが出来れば、他のプログラミング言語でも実装できるのではないか、環境構築やブラウザ使用、インターネット使用の必要がないExcelは、外に出せない情報を扱う場合、そのまま内部で使うなら他のデータベースとプログラミング言語で実装する必要がない場合もあるのかなと感じます。

 もっと軽くて、意図しない形で情報が洩れる危険が少ないソフトがあれば、Excelよりそのソフトを使うかもしれません。

参考 “脱Excel”か“活Excel”か

4 司法書士を取り巻くデジタル化の現状

・所有者不明土地等への対応として民法・不動産登記法などの改正、電子署名・本人確認などが注目されている分野かもしれませんが、以前blogを書いてみたのと、他に有益な書籍や記事があると思うので、で今回は省きたいと思います。

・仕様書など

登記・供託オンライン申請システムAPI仕様書

https://www.touki-kyoutaku-online.moj.go.jp/developer.html

この中に、Webサービス編、データ仕様編、アプリケーション仕様編の説明があります。登記申請の後、法務局から「システム上登記出来ないから、この部分を訂正して下さい。」というような連絡が来ることがあるのですが、上の仕様書をみると、そういう仕組みなのか、と分かることがあります。

例えば上の画像は、共同根抵当権の抹消登記申請の申請構造について、法務局から指摘を受けた部分を呟きました。

 上の画像は、不動産番号を間違って入力した場合、現に登記されている不動産があると受付をしてしまい、間違いに気付くのに時間がかかる、ということを示しています。資金決済の場面で気を付けないといけない仕組みです。もし登記されていない不動産番号なら、受付でエラー表示が出るので即日訂正出来ますが、既に登記されている不動産の場合、即日訂正が出来なくなります。

・戸籍情報システム標準仕様書 法務省民事局民事第一課 第 R2.2 版に第 R2.1 版を統合

(第 R3 版)及び第 R3 版の改訂受託事業者:日本加除出版株式会社

https://www.moj.go.jp/content/001357217.pdf

 この仕様書を読んで、初めて法務省、法務局が戸籍副本のデータを持っていることを知りました。

・戸籍手続オンラインシステム構築のための標準仕様書(R3 版)令和3年3月 法務省

https://www.moj.go.jp/content/001357219.pdf

 改正戸籍法120条の4、同法120条の5 

 オンライン化後の戸籍事務処理について、内部での流れを大まかに知るだけでも、実務の感覚が少し違ってくるようになりました。

・住民記録システム標準仕様書【第2.0版】

令和3年(2021 年)8月 31 日自治体システム等標準化検討会(住民記録システム等標準化検討会)

https://www.soumu.go.jp/main_content/000766944.pdf

P294・「住民票」を「住民票記載事項証明書」に、「住民票(除票)」を「住民票除票記載事項証明書」に改める。

・認証文の「この写しは、世帯全員の住民票の原本と相違ないことを証明する。」を「上記の事項は、世帯全員の住民票に記載された事項と相違ないことを証明する。」に改める。

P453の画像

自治体 DX 全体手順書【第 1.0 版】令和3年7月7日総務省

https://www.soumu.go.jp/main_content/000759083.pdf

P14 工程表のイメージ

・LGWAN

法務省「LGWAN/政府共通NWによる登記嘱託~登記・供託オンライン申請システム~」令和2年1月

https://houmukyoku.moj.go.jp/homu/content/001288146.pdf

 LGWAN(総合行政ネットワーク)について知ったのは、2021年9月15日、登記情報提供サービスがシステム不具合を起こしたことが原因でした。

 後日、津時先生に、9月15日、市区町村では登記情報が取得できたのでしょうか?と訊いて、教えていただきました。

(一財)民事法務協会「登記情報提供サービス」

https://www1.touki.or.jp/gateway.html

 システム不具合が起きた旨のお知らせが消えているので、スクリーンショットを撮ることが出来ませんでした。システム不具合は、年に何度か突然起こるようです。個人的に、システム不具合は起こるものと思っていますが、不具合の詳細が公表されないこと、予備のサービス(例えば、LGWANを利用して近接の市区町村役場(所)で登記情報または登記事項証明書を取得。)が提供されないことが少し引っかかっています。

LGWAN についての参考ページ

地方公共団体情報システム機構「総合行政ネットワーク」

・LGWAN について

https://www.j-lis.go.jp/lgwan/about/cms_15039.html

「総合行政ネットワーク(LGWAN)の概要」地方公共団体情報システム機構総合行政ネットワーク全国センター令和2年12月9日P4

・LGWAN-ASP について

https://www.j-lis.go.jp/lgwan/asp/cms_15041.html

・LGPKI について

https://www.j-lis.go.jp/lgwan/lgpki/cms_15042.html

・文字

政府CIOポータル「文字環境導入実践ガイドブック」2019年3月28日

https://cio.go.jp/guides

1.1 背景と目的

我が国においては、一般のコンピュータにおいて処理できるように日本工業規格(JIS)によって規格化された文字以外に、文字表現の違い等の様々な理由により、画像データとして管理されている文字(以下「外字」という。)が100 万文字以上あるといわれています。行政機関では、行政運営上、本人確認等を厳格に行う場合や個人のアイデンティティに配慮する場合に、この膨大な文字を用いようとする傾向があります。その結果、外字をそれぞれのコンピュータに導入する方法や、当該文字のヨミガナを別途データとして管理する方法が採られてきました。

しかしながら、使える文字数は多ければ良いというものではありません。自らのコンピュータに追加した外字は、当該外字を追加していない他のコンピュータでは処理できません。その場合には、正しく表示できないのはもちろんのこと、検索やデータ連携も困難となります。また、文字の数が多ければ多いほど、視認性や表音性の難易度が高まり、結果として社会経済活動が円滑に行われにくくなるおそれがあります。日本語を母国語としない方にとっては、なおさら難しい問題です。

一般の社会生活において現代の日本語を書き表すための漢字使用の目安である常用漢字は約2千文字です。一方で、約2千文字では専門的な内容を伝えにくい等の社会の要請があります。そこで、これまで文字の JIS 規格が整備されてきており、現在は、1万字程度となっています。これは、日常的に用いられるパソコン、スマートフォン、タブレット等において標準的に扱える文字になります。

世界に目を向けると、主要言語における文字は標準化されています。多くの文字を使う必要がなく、容易にデジタル環境へ移行することができています。政府は、「デジタル・ガバメント実行計画」(平成 30 年 7 月 20 日デジタル・ガバメント閣僚会議決定)に基づき、行政サービスの 100%デジタル化をする方針を掲げています。情報システム間のデータ連携を容易に行えるようにし、国民がスマートフォン等で行政サービスを利用できる環境を構築するための文字環境を効率的かつ確実に導入できるよう、行政機関の情報システム担当者向けに本ガイドブックを作成しました。

登記統一文字

戸籍統一文字

https://houmukyoku.moj.go.jp/KOSEKIMOJIDB/M01.html

(一社)文字情報技術促進協議会

文字情報基盤

https://imi.go.jp/mj/

文字情報基盤検索システム

表意文字(日本語など)を表現するための規格。

http://unicode.org/ivd/

IVS(Ideographic Variation Sequence/Selector)は、文字符号としては同一視される漢字の、細かな字形の差異を特別に使い分けるための仕組みです。IVSは文字符号の国際規格であるISO/IEC 10646(2008年版以降)に規定されています。また、IVSと、それに対応する字形の一覧は、UnicodeコンソーシアムからIVD(Ideographic Variation Database)として公開されており、ISO/IEC 10646から正規の規格として参照されています。

文字縮退マップ(IPA)

MJ縮退マップとは

MJ文字情報一覧表で整備されている戸籍統一文字と住民基本台帳ネットワークシスム統一文字を合わせて整理した、約6万文字の文字情報基盤の文字(MJ文字集合)と、約1万文字のJIS X 0213(JIS第1水準~第4水準)の文字との対応関係を、辞書や人名に係る各種告示等を根拠として整理した物です。

MJ縮退マップは、対応関係の根拠情報を収録したデータファイルです。個別の漢字について縮退情報を確認する場合には、文字情報基盤検索システムをご利用ください。漢字を検索し、詳細情報の画面から、各MJ文字図形名に対する縮退候補情報を図形入りで確認することができます。

IPAmj明朝フォント

IPAmj明朝フォントは、人名の表記等で、細かな字形の差異を特別に使い分ける必要のある業務等での活用を想定したフォントです。また、同フォントを十分に活用するためには、対応したアプリケーションソフトが必要となります。通常の文書作成等では、JIS X 0213:2012に準拠したIPAexフォントのご利用をお勧めします。

大学共同利用機関法人 人間文化研究機構 

学術情報交換用変体仮名 公開サイト

https://cid.ninjal.ac.jp/kana/home

このページでは、国際文字コード規格に提案するために選定した「変体仮名」の文字画像と文字情報を公開します。 文字の選定と提案の経緯はこちらをご覧ください。

・これから数年で、提出・申請する機関、情報交換をする相手方との間で、規格に入っていない文字や記号の、個人・組織内部での持ち方が決まってくるのかなと思います(表示されるままの状態で持つのか、IPAmj明朝フォントとアプリケーションを組み合わせて持つのか、画像と文字コードの併用などその他の方法で持つのか。)。



鬼滅の刃フォント

 明日12月7日(火)は、アーリーさんです。裏LeagalACは、elv_p_chanさんです。お楽しみに。