スポンサーリンク

【pleasanter/VBA】エクスポート⑨汎用ツールを作ってみた(簡易版)

プリザンター
スポンサーリンク
※当サイトは広告を含みます

エクセルVBAでプリザンターから情報取得、シリーズ。第9回です。

今回は汎用ツールを作ってみました。

こちらのサイトを参考とさせていただいています。はーなるほど、と目からうろこ。ありがとうございました。
https://qiita.com/m-isik/items/0abfd51a22587bed2e47

2023.9.10.追記
こちらのサイトの汎用ツールは簡易版です。完全版はこちらの記事をご参照ください。

1.使用するエクセル

シートを二つ用意します。

1シート目:コマンドシート
APIキーやサイトID、出力項目を設定します。

2シート目:出力シート
このシートに書き出しします。

イメージ
APIキーとサイトIDの入力欄、出力項目を設定する欄を設けています。

コマンドシートの出力項目の指定個所は「TiTle」や「Class」をプルダウンで選択する様式にしています(データの入力規則を使用)。Classなどについては隣の列に「A~Z」を選択するようにしています。
2023.9.16追記:出力項目のリストでOwnerが2つめと7つ目に重複しています。一つでいいです。

2.コード

※jsonConverterを利用しています。
【EXCEL VBA】VBAでJSONを利用したい
※httpRequest.Open の部分のURLは環境に合わせて設定してください。
※分類項目等はA~Zまでしか対応していません。
※Microsoft Scripting Runtime を参照設定しています。
※ページサイズ以上のデータ取得は対応していません。ページサイズ以上のデータを取得する必要がある場合は、こちらのコードを参照いただくか、こちらの記事等を参照いただきoffset処理を追加してください。

'参照設定:Microsoft Scripting Runtime

Sub pleasanter_export_hanyou()
    On Error GoTo ErrHandler
    Dim msg As String
    Application.ScreenUpdating = False
    
    '++++++ 基本情報設定 ++++++
    'コマンドシート
    Dim wsCom As Worksheet
    Const RowStartKoumoku As Long = 6
    Const ColKoumoku1 As Long = 2
    Const ColKoumoku2 As Long = 3
    Set wsCom = Worksheets("コマンド")
    '出力シート
    Dim wsExport As Worksheet
    Set wsExport = Worksheets("出力")
    Const RowStartE As Long = 2         '出力開始行
    '出力シートクリア
    wsExport.Cells.Clear
    
    '++++++ コマンドシートから取得条件を取得 ++++++
    Dim myApikey As String
    Dim siteId As String
    With wsCom
        myApikey = Trim(.Range("C2").Value) 'APIキー
        siteId = Trim(.Range("C3").Value)   'サイトID
    End With
    '値のチェック
    If myApikey = "" Then
        msg = "APIキーを入力してください" & vbCrLf & "処理を中断します"
        GoTo ErrHandler
    ElseIf Not IsNumeric(siteId) Or siteId = "" Then
        msg = "サイトIDが正しくありません" & vbCrLf & "処理を中断します"
        GoTo ErrHandler
    End If
    
    '出力項目を配列columnNamesに代入
    Dim columnNames() As String     '項目名を入れる配列
    Dim i As Long, rowEnd As Long
    Dim idx As Long: idx = 1
    Dim buf As String
    With wsCom
        rowEnd = .Cells(.Rows.Count, ColKoumoku1).End(xlUp).Row
        For i = RowStartKoumoku To rowEnd
            buf = .Cells(i, ColKoumoku1).Value & .Cells(i, ColKoumoku2).Value
            If buf <> "" Then
                ReDim Preserve columnNames(1 To idx)
                columnNames(idx) = buf
                idx = idx + 1
            End If
        Next i
    End With
             
    '++++++ プリザンターから情報取得 ++++++
    Dim jsonRequest     As Dictionary
    Dim parseResponse   As Dictionary
    Dim httpRequest     As Object
    
    Set jsonRequest = New Dictionary
    
    jsonRequest.Add "ApiVersion", "1.1"
    jsonRequest.Add "ApiKey", myApikey
    jsonRequest.Add "View", New Dictionary
    
    Set httpRequest = CreateObject("msxml2.xmlhttp")
    
    httpRequest.Open "POST", "http://localhost/api/items/" & siteId & "/get"    '※siteIdの前の部分は変更要
    httpRequest.setRequestHeader "Content-Type", "application/json;charset=utf-8"
    
    httpRequest.send JsonConverter.ConvertToJson(jsonRequest)
    
    Do While httpRequest.readyState < 4
        DoEvents
    Loop

    Set parseResponse = JsonConverter.ParseJson(httpRequest.responseText)
    
    If parseResponse("Response")("Data").Count <= 0 Then
        MsgBox "出力データがありません" & vbCrLf & "処理を中断します"
        Exit Sub
    End If
    
    Dim responseData As Variant
    Dim prefix As String, suffix As String
    
    Dim vRow As Long: vRow = RowStartE
    With wsExport
        '項目名出力
        For idx = LBound(columnNames) To UBound(columnNames)
            .Cells(1, idx).Value = columnNames(idx)
        Next idx
        'データ出力
        For Each responseData In parseResponse("Response")("Data")
            For idx = LBound(columnNames) To UBound(columnNames)
                
                If InStr(columnNames(idx), "Class") > 0 _
                    Or InStr(columnNames(idx), "Num") > 0 _
                    Or InStr(columnNames(idx), "Check") > 0 _
                    Or InStr(columnNames(idx), "Description") > 0 Then
                'クラス、数値等アルファベットが最後につく項目の処理
                        prefix = Left(columnNames(idx), Len(columnNames(idx)) - 1)
                        suffix = Right(columnNames(idx), 1)
                        .Cells(vRow, idx).Value = responseData(prefix & "Hash")(prefix & suffix)
                ElseIf InStr(columnNames(idx), "Date") > 0 Then
                '日付の場合の処理。文字列日付をシリアル値に変換する
                    suffix = Right(columnNames(idx), 1)
                    .Cells(vRow, idx).Value = strDateToDateTime(responseData("DateHash")("Date" & suffix))
                ElseIf InStr(columnNames(idx), "Time") > 0 Then
                'Date以外の日付の場合の処理。文字列日付をシリアル値に変換する
                    .Cells(vRow, idx).Value = strDateToDateTime(responseData(columnNames(idx)))
                Else
                'クラス、数値等アルファベットが最後につく項目以外の処理
                    .Cells(vRow, idx).Value = responseData(columnNames(idx))
                End If
            Next idx
            vRow = vRow + 1
        Next
    End With
    
    Application.ScreenUpdating = True
    MsgBox "出力完了"
    wsExport.Activate
    Exit Sub
ErrHandler:
    If msg <> "" Then
        MsgBox msg
    Else
        MsgBox "エラーが発生しました" & vbCrLf & "処理を中断します" & _
                "エラー№" & Err.Number & ":" & Err.Description
    End If
    Application.ScreenUpdating = True
End Sub

Private Function strDateToDateTime(ByVal str As String) As Variant
    '日付時刻
    If Val(Left(str, 4)) < 1900 Then
        strDateToDateTime = ""
    Else
        strDateToDateTime = CDate(Replace(str, "T", " "))
    End If
End Function

特に詳しく解説はしませんが、分類項目などの出力個所

 prefix = Left(columnNames(idx), Len(columnNames(idx)) - 1)
 suffix = Right(columnNames(idx), 1)
 .Cells(vRow, idx).Value = responseData(prefix & "Hash")(prefix & suffix)

たとえば「ClassA」を指定していた場合、prefixには「Class」が入り、suffixには「A」が入ります。
responseData(prefix & “Hash”)(prefix & suffix) は
responseData(“ClassHash”)(“ClassA”)
となります。

3.最後に

もうちょっと、改良した汎用ツールはこちらです
【pleasanter/VBA】エクスポート⑩汎用ツール増強版

4.参考記事

PleasanterとExcelを接続してみた-応用編
https://qiita.com/m-isik/items/0abfd51a22587bed2e47

項目名とデータベース上のカラム名の対応
https://pleasanter.org/manual/dev-column-name

【EXCEL VBA】VBAでJSONを利用したい
https://vba-labo.rs-techdev.com/archives/1401

プリザンザンターVBAエクスポートシリーズ
【pleasanter/VBA】エクセルからプリザンターのデータを取得する
【pleasanter/VBA】エクセルからプリザンターのデータを取得する②絞り込み条件の指定
【pleasanter/VBA】エクセルからプリザンターのデータを取得する③変数で絞り込み条件を指定する
【pleasanter/VBA】エクスポート④絞り込み条件で〇〇を含むを指定する
【pleasanter/VBA】エクスポート⑤並べ替え
【pleasanter/VBA】エクスポート⑥表示名を出したい
【pleasanter/VBA】エクスポート⑦データがちょん切れる時の対応 Offset
【pleasanter/VBA】エクスポート⑧出力される日付を文字列ではなく日付時刻型で出したい
【pleasanter/VBA】エクスポート⑨汎用ツールを作ってみた(今回)
【pleasanter/VBA】エクスポート⑩汎用ツール増強版

VBAでインポート
【pleasanter/VBA】エクセルからプリザンターへデータを追加、更新する~import~

プリザンターPowerQuery連携シリーズ
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する①
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する②取得条件の指定方法
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する③上限値以上のレコードを連続で取得する
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する④ユーザーテーブルとマージ

コメント

タイトルとURLをコピーしました