あにゃろぐ

インフラSEの資格対策だったり技術メモだったり。最近は専ら株主優待収集家。

Excelで株価や銘柄名を自動取得する関数を自作する

タイトルの通りです。
Excelで株価や銘柄名を自動取得する自作関数を作成したので、メモしておきます。

こちらの記事を参考にさせていただきました。ありがとうございます。

note.com

スクレイピングにあたるので、使用は自己責任でお願いします。

今回は以下3つの関数を作成しました。

日本株の銘柄コードから株価を取得する関数

これはnoteの記事をそのまま参考にさせてもらいました。

日本株の銘柄コードから銘柄名を取得する関数

noteで紹介されている関数を参考に、以下のコードで作成。コードは標準モジュールに記載します。
=GetStockName(A1) のような感じで呼び出します。

Public Function GetStockName(ticker As String) As String
    Dim http As Object
    Dim html As Object
    Dim url As String
    Dim startPos As Long
    Dim endPos As Long
    Dim name As String
    
    ' Create the HTTP object
    Set http = CreateObject("MSXML2.XMLHTTP")
    
    ' Construct the URL
    url = "https://www.google.com/finance/quote/" & ticker & ":TYO"
    
    ' Send the request
    http.Open "GET", url, False
    http.send
    
    ' Get the response text
    Set html = CreateObject("htmlfile")
    html.body.innerHTML = http.responseText
    
    ' Find the stock name in the HTML
    startPos = InStr(html.body.innerHTML, "class=" & """" & "zzDege")
    If startPos > 0 Then
        startPos = InStr(startPos, html.body.innerHTML, ">") + 1
        endPos = InStr(startPos, html.body.innerHTML, "<")
        name = Mid(html.body.innerHTML, startPos, endPos - startPos)
        name = Replace(name, "&amp;", "&")
        GetStockName = name
    Else
        GetStockName = "Not Found" ' Error value
    End If
End Function

「セブン&アイ・ホールディングス」のように銘柄名に「&」が含まれている場合、「セブン&amp;アイ・ホールディングス」と表示されてしまうため、「&amp;」を「&」に置換しています。

日本株の銘柄コードから配当利回りを取得する関数

noteで紹介されている関数を参考に、以下のコードで作成。コードは標準モジュールに記載します。
=GetStockDividendYield(A1) のような感じで呼び出します。

Public Function GetStockDividendYield(ticker As String) As Double
    Dim http As Object
    Dim html As Object
    Dim url As String
    Dim startPos As Long
    Dim endPos As Long
    Dim yield As String
    
    ' Create the HTTP object
    Set http = CreateObject("MSXML2.XMLHTTP")
    
    ' Construct the URL
    url = "https://www.google.com/finance/quote/" & ticker & ":TYO"
    
    ' Send the request
    http.Open "GET", url, False
    http.send
    
    ' Get the response text
    Set html = CreateObject("htmlfile")
    html.body.innerHTML = http.responseText
    
    ' Find the stock dividend yield in the HTML
    startPos = InStr(html.body.innerHTML, "時価総額に対する年間配当の比率であり、株式の配当利益を見積もったもの")
    If startPos > 0 Then
        startPos = startPos + 67
        endPos = InStr(startPos, html.body.innerHTML, "<")
        yield = Mid(html.body.innerHTML, startPos, endPos - startPos)
        
        If yield = "-" Then
            yield = 0
        Else
            yield = Mid(yield, 1, endPos - startPos - 1)
        End If
        
        GetStockDividendYield = CDbl(yield) / 100
        
    Else
        GetStockDividendYield = 0 ' Error value
    End If
End Function

改善の余地はあるかもですが、一旦これで取得できるようになったので満足です。