[ExcelVBA] 변호사 이름에서 변호사 정보 얻기

17021 단어 VBAExcelExcelVBA

소개



  • 변호사명의 리스트로부터, 사무소명이나 전화 번호를 정리해 검색하고 싶다! 라는 틈새 요구에 부응하는 것입니다.
  • 정보는 닛벤련의 변호사 정보 검색( htps //w w. 일본어. jp / me m r_ 게네라 l / ゑ 란 d 코 rp 세아 rch 세 ぇ ct / ゑ 린후 우세 아 r 치프 t / )에서 끌어옵니다.

  • 제반의 사정에 의해 Excel 밖에 사용할 수 없는 환경의 방향입니다.
  • 그렇지 않으면, 「변호사 회원 번호로부터 해당 변호사의 정보를 취득한다(WebAPI판)」( htps : // 코 m / 카산 마 3104 / ms / 아 0b9479f06fd d7 5 5c )를 참조해 주시는 것이 좋다.

  • 사용법


  • "[VBA] 30분 있으면 가능한 VBA 스크래핑"( htps : // 이 m/그것 왔다/있어 ms/4b4c845b7378f6765704 )을 잘 읽는다.
  • 엑셀에 다음과 같은 표를 만든다.

  • B, C 열에 씨, 이름을 필요한 만큼 입력한다(보충도 참조).
  • VBE에 다음 코드를 복사, 실행.
  • 검색 시작 행을 듣기 때문에 임의의 행을 입력, Enter.
  • Function은 다음을 빌려줍니다.
  • WaitResponse : 이전 게시물 "[VBA] 30 분 있으면 가능한 VBA 스크래핑"
  • tagCheck : VBA에 지정된 요소가 있는지 확인하는 서브 루틴 (htps //w w. v- 아니. 네 t/에멘 t/타g 치 CK. php)

  • Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
    Sub NichibenrenSearch()
        On Error GoTo continue
        '行を数える
        Dim dataCnt As Long 'データ数
        dataCnt = Cells(Rows.Count, 2).End(xlUp).Row
    
        Dim target As Long '検索対象の行
        Dim startNum As Long '開始行
        startNum = InputBox("開始行は?")
        For target = startNum To dataCnt '開始行~データ数
    
            '起動
            Dim objIE As InternetExplorer
            Set objIE = New InternetExplorer
    
            objIE.Visible = True
            objIE.navigate "https://www.nichibenren.jp/member_general/lawyerandcorpsearchselect/lawyerInfoSearchInput/"
    
            Call WaitResponse(objIE)
    
            '検索
            Dim htmlDoc As HTMLDocument
            Set htmlDoc = objIE.document
    
            Dim targetLast As String
            Dim targetFirst As String
    
            targetLast = Cells(target, 2).Value
            targetFirst = Cells(target, 3).Value
    
            With htmlDoc
                .getElementById("last_name").Value = targetLast
                .getElementById("first_name").Value = targetFirst
                .getElementById("doLawyerInfoSearch").Click
            End With
    
            Call WaitResponse(objIE)
    
            '検索結果が0なら終了
            If tagCheck(objIE, "class", "text-right", "0") = True Then
                Cells(target, 6) = "◆該当なし"
                GoTo continue
            End If
    
            '検索結果一覧の一番上へ遷移
            'tableの2行目(tr(1)),2列目(td(1)),子(a)を取得。tdだけだとなぜかthもカウントされてうまくいかない
            htmlDoc.getElementsByTagName("tr")(1).getElementsByTagName("td")(1).Children(0).Click
    
            Call WaitResponse(objIE)
    
            '詳細情報取得
            '上の表
            Dim table1 As Object
            Set table1 = htmlDoc.getElementsByTagName("table")(0)
    
            Dim x As Long '上の表の列
            For x = 0 To 4 '5列分
                Cells(target, x + 5) = table1.Rows(1).Cells(x).innerText '行(rows)は2行目で固定,列(cells)は変動
            Next
    
            '下の表
            Dim table2 As Object
            Set table2 = htmlDoc.getElementsByTagName("table")(1)
    
            Dim y As Long '下の表の行
            For y = 0 To 7 '8行分
                Cells(target, y + 10) = table2.Rows(y).Cells(1).innerText '行(rows)は変動,列(cells)は2行目で固定
            Next
    
    continue:
            objIE.Quit
        Next
        Beep
        MsgBox "完了"
    End Sub
    
    Sub WaitResponse(objIE As Object)
        Dim i As Long
        For i = 0 To 10
            Do While objIE.Busy = True Or objIE.readyState <> READYSTATE_COMPLETE '読み込み待ち
                DoEvents
            Loop
            Sleep 100 '追加で待ってあげないとうまくいかない
        Next
    End Sub
    
    Function tagCheck(objIE As InternetExplorer, _
                     methodType As String, _
                     elementName As String, _
                     keywords As String) As Boolean
      Dim objDoc  As Object, myDoc  As Object
      tagCheck = False
      Select Case methodType
        Case "name"
          Set objDoc = objIE.document.getElementsByName(elementName)
        Case "class"
          Set objDoc = objIE.document.getElementsByClassName(elementName)
        Case "tag"
          Set objDoc = objIE.document.getElementsByTagName(elementName)
      End Select
      For Each myDoc In objDoc
        If InStr(myDoc.outerHTML, keywords) > 0 Then
          tagCheck = True
          Exit For
        End If
      Next
    End Function
    

    보충


  • 위의 Excel 시트에는 B · C 열에 각각 다음 식이 들어 있습니다.
  • =LEFT([@氏名],[@氏字数/修正])
    =RIGHT([@氏名],LEN([@氏名])-[@氏字数/修正])
    
  • 이것에 의해, A열에 성명을 넣고, D열에 성의 문자수를 넣으면, B·C열에 성·이름이 좋다고 표시됩니다.
  • 예: 「닛벤타로」라면 「2」로, 「닛벤」과 「타로」에.

  • 매크로를 실행하면…
  • 「변호사 정보 검색」의 한자씨・명란에, B・C열의 씨・이름을 넣어 검색.
  • 「검색 결과 일람」의 맨 위의 회원을 선택. 검색 결과가 0건이라면 포기하고 다음.
  • 「회원 상세 정보」의 위쪽에 있는 표의 정보를 E~I열에 전기, 아래쪽에 있는 표의 정보를 J~Q열에 전기. 왜 2개로 나누었다. 게다가 행과 열이 어색하지 않습니까?

  • 日弁連의 사이트는 무거우므로 그 특성상 WaitResponse에서 READYSTATE_COMPLETE로부터 100ms 기다려, 이것을 10회 문의, 그리고 On Error continue해도, 그래도 가끔 읽기 불량으로 에러를 토한다. 힘차게 실행하자.

  • 갱신의 여지


  • 검색 결과가 「0」이라면 종료하고 있지만, 이것, 「0」이 포함되어 있는 「10」 「20」에서도 종료하네요…
  • 검색 방법이 완전 일치가 아니고 부분 일치로, 게다가 등록 번호순으로 표시되기 때문에, 「닛벤 타로」로 검색해도, 「닛벤 이치타로」가 등록 번호가 어린 경우, 이치타로씨 얻어 버리는 ...
  • 어쩌면, 검색 결과 일람을 Table로 취득해, 가능한 한 처리하면 되지만, 레어 케이스라고 생각하기 때문에, Excel 시트에 확인을 위한 열을 만들어 어떻게든 해 버렸다. 아래 참조. 「사키」/「﨑」등 이자체 체크도 겸해.
  • =IF(AND([@氏名2]<>"",[@氏名2]<>[@氏]&" "&[@名],[@済]=""),"◆要確認","")
    
  • 여러분, 움직이면 좋겠다는 정신.
  • 좋은 웹페이지 즐겨찾기