5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Redashの結果をそのままExcelに流し込むVBA

Last updated at Posted at 2017-06-17

これはなに?

Redashは便利なんですが、どうしてもExcelで加工したいなどのニーズはまだまだ残っていると思います。
以前、いちいちRedashからデータをコピペしなくて済む方法を記事にしましたが、その方法では50シート目あたりから辛くなってきてメモリ不足で落ちるようになりました。

参考:
Redashのデータを毎日エクセルへコピペしている人へささげる -APIを利用した自動更新方法-
http://qiita.com/aomegane/items/63f0a5086fd045ee0067

ということで、もうVBAを書くしかない!ということでVBAを書いてみました。

ソースコード

設計

  1. 同名の
  2. RedashのAPIを叩き、CSVを取得する
  3. CSVをパースしてシートに書き込む

ということをしています。

コード

Sub Main()
    'RedashAPIを使用するための変数
    Const ApiToken = "YOUR-API-KEY"
    Dim Url As String
        
    '取り込むRedashのQueryIdを定義する
    TargetQueryIds = Array("939", "1434", "879", "806", "1042", "1337", "876", "895", "897", "1338", "1339", "833", "885", "835", "1568", "1002", "1408")
    
    'Queryごとにループを回す
    For Each tqid In TargetQueryIds
        Url = "https://YOUR-REDASH-URL/api/queries/" + tqid + "/results.csv?api_key=" + ApiToken
        
        'Redash のAPIを叩き 結果をCSVとして取得する
        Dim ResultCsv As String
        ResultCsv = GetContents(Url)
        
        '同名称のシートがあれば削除し、新しいシートにデータを保存する
        MakeRefreshedSheet (tqid)
        CsvToSheet (ResultCsv)
    Next
End Sub

'ReadshのAPIを叩いてCSVで返す
Function GetContents(Url As String) As String
    Dim XmlHttp As Object
    Set XmlHttp = CreateObject("MSXML2.XMLHTTP")
    XmlHttp.Open "GET", Url, False
    XmlHttp.Send
    GetContents = XmlHttp.ResponseText
End Function

'CSVをシートに書き込む
Function CsvToSheet(ResultCsv As String)
    StringLines = Split(ResultCsv, vbCrLf) '改行コードでSplitして行に分割する
    i = 0
    For Each sl In StringLines '1行ずつ処理
        CellValues = Split(sl, ",")
        j = 0
        For Each c In CellValues  '1列ずつ処理
            Cells(i + 1, j + 1).Value = c
            j = j + 1
        Next
        i = i + 1
    Next
End Function

'同名のシートがあれば削除し、新規のシートをつくる
Function MakeRefreshedSheet(sname As String)
     If ExistsWorksheet(sname) Then
        Application.DisplayAlerts = False
        Worksheets(sname).Delete
        Application.DisplayAlerts = True
     End If
     Set wSheet = Worksheets.Add
     wSheet.name = sname
End Function

'ワークシートの存在チェックを返す
Function ExistsWorksheet(sname As String)
    Dim ws As Worksheet
    For Each ws In Sheets
        If ws.name = sname Then '存在する => True
            ExistsWorksheet = True
            Exit Function
        End If
    Next
    ExistsWorksheet = False '存在しない => False
End Function

ハマりどころ

RedashのjsonAPIは列の並び順が画面と異なる
なので今回はCSVを返すAPIを利用することにしました

画面

image.png

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?