見出し画像

エクセルで株価を自動で取得するマクロ関数をCopilotで自動生成してみる

2024年夏は株価の大暴落などで株価変動が激しく、ちょっと市場から離れています。そこで最近、流行りの生成AIを使ってエクセルに株価を自動取得するマクロ関数を作成してもらいました。

一番有名なのはChatGPT-4辺りですが、無料でほぼ同等なWindowsの「Copilot」の生成AIで試してみました。Copilotにアクセスできる環境が私の場合、スマホアプリの「Bing」、Windows11ではタスクバー上にある「WindowsのCopilot(プレビュー)」、Edgeブラウザ上の右上にある「Copilot」があります。

同じ質問をしても答えがバラバラだったのは面白いですね~~。今回はEdgeから「Copilot」にアクセスして進めたいと思います。

WEBスクレイピング禁止を明記しているサイトを避けるために株価取得サイトは「Googleファイナンス」で試してみました。このサイトが「OK」と判断した根拠は以下のサイト内で

https://www.google.com/robots.txt

Disallow: /m/
Allow: /m/finance
Disallow: /wml?
Disallow: /wml/?

AllowとなっているのでOKと判断しましたが、使用に関しては自己責任でお願いします。

早速、「Copilot」に質問してみましょう。

質問①
googleファイナンスから日本株の株価を取得する関数をエクセルのマクロで作って

Function GetStockPrice(ticker As String) As Double
    Dim http As Object
    Dim json As Object
    Dim url As String
    Dim result As Double
    
    ' Create the HTTP object
    Set http = CreateObject("MSXML2.XMLHTTP")
    
    ' Construct the URL
    url = "https://finance.google.com/finance?q=" & ticker & "&output=json"
    
    ' Send the request
    http.Open "GET", url, False
    http.send
    
    ' Parse the JSON response
    Set json = JsonConverter.ParseJson(http.responseText)
    
    ' Extract the stock price
    result = json("price")
    
    ' Return the stock price
    GetStockPrice = result
End Function

あっという間にできましたが、一つ問題が発生です。つまり「JSONパーサー」をインポートしないといけないようです。

JSONパーサーなんて使ったこともないしですし、VBAもたまにしか使わないのでVBA-JSONライブラリをダウンロードしてインポートなんてハードルが私には高そうです。以下の質問を追加ですることにより、私のように素人でも難なく対応できましたが....

質問①-1 
JSONパーサーのライブラリをダウンロードするURLを教えてください

質問①-2
ライブラリのインポートの手順をを教えてください

しかし、関数入力時のデータが”TYO:7203”と少し面倒だったり、設定までの手順が余りにも多いのでインポートは中止して、新しい質問をしてみました。

質問②
JSONパーサーを使わない方法はありますか

Function GetStockPrice(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 price 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 price in the HTML
    startPos = InStr(html.body.innerHTML, "YMlKec fxKbKc")
    If startPos > 0 Then
        startPos = InStr(startPos, html.body.innerHTML, ">") + 1
        endPos = InStr(startPos, html.body.innerHTML, "<")
        price = Mid(html.body.innerHTML, startPos, endPos - startPos)
        GetStockPrice = CDbl(price)
    Else
        GetStockPrice = -1 ' Error value
    End If
End Function

今回はJSONパーサーもなく、簡単にCopy&Pasteでマクロ関数が動かせそうです。このコードは入力データは”7203”と数値データだけでOKなので簡単にできます。

少し質問の表現を以下のように変えてみました。

質問③
エクセルで日本の株価を取得する関数を作ってほしい

Function GetStockPrice(ticker As String) As Double
    Dim http As Object
    Dim html As Object
    Dim elements As Object
    Dim url As String
    Dim price 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 price using getElementsByClassName
    Set elements = html.getElementsByClassName("YMlKec fxKbKc")
    If elements.Length > 0 Then
        price = elements(0).innerText
        GetStockPrice = CDbl(price)
    Else
        GetStockPrice = -1 ' Error value
    End If
End Function

実際にこのコードでマクロ関数を作成して動かしてみると上手く動作できることがわかりました。いろいろ質問した後なので学習してこうなったのかもしれませんが、質問の仕方で一発で最適なコードを生成してくれることもありそうですね。

いろいろ試してみると、コードを直接表示せずに他のページからダウンロードしろとかちょっと不親切なこともありましたが、ちょっとしたソフト開発には便利ですね、生成AIは~~~

最後まで読んでいただいて有難うございます。 コメントは今後の参考に、フォローやサポートは今後の励みになります。