申請用総合ソフトを改造する 1-3

・前回との変更点
 ファイルの指定が面倒になったので、フォルダ内の全xmlファイルを一気に参照することにした(意外に実行時間は長くなかった。)
 xml取得情報をリスト化したシートを改変し、行と列を入れ替えた。
 申請人複数(権利者n人、義務者m人)に対応
 複数不動産(n個)に対応
 VBAコードがとても長く(そしてとても汚く)なった
 今回でxmlファイルの読み込みは大体完成

・変更後のファイルのスクショ

(2)-3 ファイル取り込み画面
(ファイルが多かったので整理しました)
(2)-4 情報やりとり画面

・変更後のVBAコード
Sub xml取得()

    Sheets("リスト2").Range("D5:AO154").ClearContents
    Sheets("基本情報").Range("C5:E14").ClearContents

    Sheets("基本情報").Select
    Dim buf As String
    buf = Dir(Sheets("基本情報").Cells(3, 4) & "\", vbDirectory)
    j = -2
    Do While buf <> ""
        If j >= 0 Then Sheets("基本情報").Cells(4 + (j + 1), 3).Value = buf
        j = j + 1
        buf = Dir()
    Loop

    For k = 1 To j
        Dim buf2 As String
        buf2 = Dir(Cells(3, 4) & "\" & Cells(4 + k, 3) & "\署名・送信\HM*.xml")
        Sheets("基本情報").Cells(4 + k, 4).Value = buf2
        Sheets("基本情報").Cells(4 + k, 5).Value = Cells(3, 4) & "\" & Cells(4 + k, 3) & "\署名・送信\" & buf2
    Next
    
    Sheets("リスト2").Select
    For l = 1 To j
        Dim XMLDocument As MSXML2.DOMDocument
        Set XMLDocument = New MSXML2.DOMDocument
        XMLDocument.Load (Cells(5 + l, 3).Value)
        i = 0
        r = 0
        Do While (Cells(4, 4 + i).Value <> "")
            On Error Resume Next
            If 4 + i = 15 Then
                m = Split(XMLDocument.SelectNodes _
                (Cells(4, 4 + i).Value).Item(0).Text, "")
                Cells(5 + l, 4 + i) = m(0) & ""
            ElseIf 4 + i = 16 Or 4 + i = 17 Or 4 + i = 18 Or 4 + i = 19 Then
                Cells(5 + l, 4 + i) = XMLDocument.SelectNodes _
                (Cells(4, 4 + i).Value).Length
            ElseIf 4 + i = 20 Or 4 + i = 21 Or 4 + i = 22 Or 4 + i = 23 Or 4 + i = 24 Then
                n = Split(Cells(4, 4 + i).Value, "n")
                Err.Clear
                For p = 0 To Cells(5 + l, 16) - Cells(5 + l, 17) - Cells(5 + l, 18) - Cells(5 + l, 19) - 1
                    Cells(5 + l, 4 + i) = Cells(5 + l, 4 + i) & "|" & XMLDocument.SelectNodes _
                    (n(0) & p & n(1)).Item(0).Text
                    If Err.Number <> 0 Then
                        Cells(5 + l, 4 + i) = Cells(5 + l, 4 + i) & "|"
                        Err.Clear
                    End If
                Next
            ElseIf 4 + i = 25 Or 4 + i = 26 Or 4 + i = 27 Or 4 + i = 28 Or 4 + i = 29 Then
                For p = 0 To Cells(5 + l, 17) + Cells(5 + l, 18) + Cells(5 + l, 19) - 1
                    If Cells(5 + l, 17) > 0 Then Range("Y2").Value = "義務者"
                    If Cells(5 + l, 18) > 0 Then Range("Y2").Value = "設定者"
                    If Cells(5 + l, 19) > 0 Then Range("Y2").Value = "委託者"
                    Err.Clear
                    n = Split(Cells(4, 4 + i).Value, "n")
                    Cells(5 + l, 4 + i) = Cells(5 + l, 4 + i) & "|" & XMLDocument.SelectNodes _
                    (n(0) & p & n(1)).Item(0).Text
                    If Err.Number <> 0 Then
                        Cells(5 + l, 4 + i) = Cells(5 + l, 4 + i) & "|"
                        Err.Clear
                    End If
                    Range("Y2").Value = ""
                Next
           ElseIf 4 + i = 30 Then
                Cells(5 + l, 4 + i) = XMLDocument.SelectNodes _
                (Cells(4, 4 + i).Value).Length
            ElseIf 4 + i = 31 Or 4 + i = 32 Or 4 + i = 33 Or 4 + i = 34 Then
                For p = 0 To Cells(5 + l, 30) - 1
                    If 4 + i = 34 Then
                        If r = 1 Then
                            Range("AH4").Value = "//申請物件[n]/土地の表示/土地の表示履歴欄/地番"
                            r = 0
                        Else
                            Range("AH4").Value = "//申請物件[n]//家屋番号"
                        End If
                    End If
                    Err.Clear
                    n = Split(Cells(4, 4 + i).Value, "n")
                    s = XMLDocument.SelectNodes(n(0) & p & n(1)).Item(0).Text
                    Cells(5 + l, 4 + i) = Cells(5 + l, 4 + i) & "|" & s
                    If s = "土地" Then r = 1
                Next
            Else
                Cells(5 + l, 4 + i) = XMLDocument.SelectNodes _
                (Cells(4, 4 + i).Value).Item(0).Text
            End If
            i = i + 1
        Loop
    Next
    Cells.WrapText = False

    Sheets("基本情報").Select

End Sub

・作成に当たって悩んだ点と、その解決方針
①ファイル読み込み
 申請書xmlファイルの所在を検索するため、dir()関数を上手いことして検索するようにした。すると、登記識別情報貼付用のxmlファイルを誤って開くエラーがあったので、ファイル名に「HM」を含むものを検索することとし解決。
②申請人の数
 申請人情報を読み込みたいところ、困ったことに登記申請は何人で行われるか(すなわち、何枚の委任状が必要になるのか)が明確ではない。所有権保存であっても共有かもしれないし、相続なら相続人10名がいてもおかしくはない。そこで、xmlファイル中、「申請事項」タグ直下の「名義人情報」タグの「氏」タグ(つまりXpathで言うと//申請事項//名義人情報/氏)を数えることにした。これで権利者(申請人)と義務者の合計人数が取得できる。
③権利者と義務者の数
 権利者と義務者の区別は当たり前にしなければならないが、困ったことがあった。それは、登記申請書においては権利者に該当する項目名が「所有者」「共有者」「抵当権者」「根抵当権者」「相続人」・・・と無数にあるため、一概に「//申請事項/所有者/名義人情報/氏」と言った指定ができない。とはいえ、「//申請事項//名義人情報/氏」と指定すれば権利者義務者の区別がつかない。そこで、義務者が使用する項目名がせいぜい「義務者」「設定者」「委託者」ぐらいだろうと想定し、「義務者」「設定者」「委託者」の項目数を数え上げ、引き算することによって権利者義務者の区別をつけた。
④申請人数及び不動産数が何個あるかの記載
 先述のとおり、申請人数や不動産数は申請によりまちまちである。ここで、予め「不動産の数なんてせいぜい50個くらいだろうから、箱を100個作っておけば十分だろう」と言った対処も間違いではないと思うが、私自身、不動産の数が100を超える登記申請を見たこともあることから、不動産の数や申請人の数に限界を設けず、都度数え上げることによって無限個まで対応することにした。
 こうすると、「表の列を予め50列用意しておこう」と言った発送ができなくなるため、申請人や不動産は一つのセル中に「|住所1|住所2」「|土地|建物」と言った振り合いで記載することにした。

・使用したファイル

・今後の課題
 VBA構文が異常に汚いので、見直す必要はある。けど当面放置。
 いよいよ委任状や原因証明情報等の自動作成機能に着手したい。

この記事が気に入ったらサポートをしてみませんか?