Excel VBA + Google Cloud Vision API を使って画像から文字列を取り出す
要するにOCRです。Google Cloud Vision APIに画像ファイルを含んだリクエストを送信すると、画像から文字列を抽出してテキストを返してくれるので、そいつを受け取って何かに利用したい場合にお試し下さい。
とりあえずすぐに動くものが欲しかったので、エラー処理とか細かいことは無視してます。
APIに渡すリクエストとAPIから返ってくるレスポンスはJsonで扱いますが、どちらも力技で解決してます。
ちゃんとしたい人は、Jsonを扱うVBA-Jsonとかいう便利なライブラリがあるのでそちらをどうぞ。
<下準備>
- Google Cloud Platformでアカウントを作って下さい
クレジットカードの情報を登録しなければなりませんが、月1000回までは無料で使えますし、 有料枠も大した額ではないので、事務処理でちょっと使う程度なら、びびる必要もありません。
- Google Cloud Vision APIを取得して下さい
Google Cloud Platformの左上隅の[ナビゲーションメニュー]>[APIとサービス]>[ダッシュボード]>[認証情報]と進み、

[認証情報を作成]ボタンを押して、[APIキー]を選択するとすぐにAPIキーが作成されます。それをコピーして下のコードに貼り付けて使って下さい。

ソースコード
'参照設定:
'Microsoft XML v6.0
'Microsoft ActiveX DataObjects x Library
'Microsoft WinHTTP Services
Public Function getStringFromImage(imgPath As String) As String Dim url As String: url = "https://vision.googleapis.com/v1/images:annotate" Dim apikey As String: apikey = ここに取得したAPI Keyを入れる
'画像をBase64形式でエンコードしたものを入れる Dim imgBin As String: imgBin = base64Encode(imgPath)
'Google Cloud Vision API に渡すJSon形式の文字列 Dim requestString As String requestString = "{""requests"":[{""image"":{""content"":""" & imgBin & """}," & _ """features"":[{""type"":""TEXT_DETECTION"",""maxResults"":10}]}]}" With New WinHttpRequest .Open "POST", url & "?key=" & apikey .setRequestHeader "Content-Type", "application/json" .send requestString If .Status <> 200 Then getStringFromImage = "": Exit Function Dim jsonResponse As String: jsonResponse = .ResponseText End With
'最初の"description"に検出された文字列すべてが入ってるので適当に取ってくる。 Dim st As Long, ed As Long If InStr(1, jsonResponse, """description""") < 1 Then Exit Function st = InStr(1, jsonResponse, """description""") + 16 ed = InStr(1, jsonResponse, """boundingPoly""") - 13
Dim ret As String ret = Mid(jsonResponse, st, ed - st) ret = Replace(ret, "\n", vbNewLine) getStringFromImage = ret
End Function
'画像ファイルのパスを渡してBase64形式にエンコードしたものを返す
Private Function base64Encode(ByVal filePath As String) As String Dim domDoc As New MSXML2.DOMDocument60 Dim element As Object: Set element = domDoc.createElement("base64")
With New ADODB.Stream .Type = adTypeBinary .Open .LoadFromFile filePath element.DataType = "bin.base64" element.nodeTypedValue = .Read(adReadAll) base64Encode = element.Text .Close End With End Function