LoginSignup
7
2

More than 3 years have passed since last update.

Excelマクロでkintone見積書アプリからExcel方眼紙の帳票を作成してみた

Last updated at Posted at 2019-12-18

はじめに

本記事では、Excelマクロでkintoneのデータを使った帳票を作成する方法をご紹介します。「見積番号」をセットして「作成」ボタンをポチっと押すだけで、kintoneの見積書アプリからデータを取得してExcelの見積書を作成できます。

Dec-07-2019 08-13-01.gif

使用した製品

今回、kintoneのREST APIをExcelのマクロのVBAオブジェクトとして呼び出すために筆者が所属するCData Software のExcel Add-In for kintoneを使用しました。
image.png
※30日間の無償評価版がございます

作成手順

CData kintone Excel Add-In のインストール、および、接続確認

本製品は、いわゆるkintoneのプラグインとは異なり、ExcelのAdd-Inとして動作する製品です。ExcelがインストールされているWindwosマシンにCData kintone Excel Add-Inをインストールします。こちらのページから30日間ご利用いただける評価版をダウンロードできます。
image.png
ダウンロードしたserup.exeを実行してインストールします、なお、この時、Excelアプリケーションが開いているとインストールできませんのでExcelは閉じてから実行ください。
image.png

インストーラが完了してExcelを起動すると、CDATAというリボンが追加されて「取得元Kintone」というボタンが追加されていればインストールは成功です。

image.png

このボタンをクリックすると、初回であれば、接続ウィザードが起動します。User, Password, Urlに、kintoneへ接続する際のユーザ名、パスワード、サブドメインを含むUrlをセットしてください。「接続テスト」ボタンをクリックして「サーバーに接続できました。」というダイアログが出ればExcelからkintoneへの接続は成功です。
※ エラーとなる場合は、設定項目を見直すか、セキュアアクセスやプロキシサーバなどの設定が必要となります。こちらの記事をご参考ください。

接続ウィザードのOKボタンをクリックすると「テーブル:」のドロップダウンリストにkintoneのアプリ一覧が表示されます。今回は「見積書 テーブル」を選択して「OK」ボタンをクリックします。

image.png

見積書アプリのデータがExcelに読み込まれました。今回の記事では詳細をご説明しませんが、Excel上で値を編集して「行の挿入/更新/削除」ボタンをクリックすることで、Excelのデータでkintoneのデータを更新することもできます。

image.png

同様に「見積書_見積明細 テーブル」のデータも別シートに読み込んでみます。

image.png

これで、ExcelからCDataExcel Add-In経由でkintoneの見積書アプリのデータにアクセスできる準備が整いました。

Excelテンプレートの準備

マクロ入りのExcelファイル(.xlsm)を作成します。本テンプレートファイルはこちらのGithubからもダウンロードできます。

シート名

テンプレート_Macro

image.png

検索項目、および、作成ボタン

項目 セル 備考
見積番号 F2 検索用
作成 O2:03 マクロ実行用ボタン(マクロ登録名は「作成_Click」)

image.png

マクロ(VBA)で見積書アプリからデータを自動で取得する項目

以下(黄色)のセルに見積書アプリからVBAでデータを取得して自動セットします。

項目 セル 備考
見積番号 M4
見積日 M5
宛名 A8
備考 B30
RecordId (非表示) M2

※有効期限は見積日の1ヶ月後を取得する数式 [=EDATE(M5,1)]でセット

image.png
image.png

見積書の明細(テーブル部分)のデータは、セルの18行目から27行目まで繰り返しでセットします。

項目 セル 備考
型番 B18 - B27
商品名 D18 - D27
単価 J18 - J27
数量 L18 - L27

※小計と合計金額は数式でセット

image.png

マクロ(VBA)の実装

「作成」ボタンをクリックした時のマクロの処理です。

Sub 作成_Click()
  On Error GoTo Error
  Dim module As New ExcelComModule
  module.SetProviderName ("Kintone")
  module.SetConnectionString ("User=*****;Password=*****;Url=https://*****.cybozu.com")
  Cursor = Application.Cursor
  Application.Cursor = xlWait
  Dim nameArray, valueArray
  With Worksheets("テンプレート_Macro")
    '必須項目チェック
    If Cells(2, "F").Value = Empty Then
      Err.Description = "見積り番号をセットしてください"
      GoTo Error
    End If
    'セル初期化
    Cells(4, "M").MergeArea.ClearContents '見積番号
    Cells(5, "M").MergeArea.ClearContents '見積日
    Cells(8, "A").MergeArea.ClearContents '宛名
    Cells(30, "B").MergeArea.ClearContents '備考
    Cells(2, "M").MergeArea.ClearContents 'RecordId (非表示)
    For i = 18 To 27
      Cells(i, "B").MergeArea.ClearContents '見積明細(型番)
      Cells(i, "D").MergeArea.ClearContents '見積明細(商品名)
      Cells(i, "J").MergeArea.ClearContents '見積明細(単価)
      Cells(i, "L").MergeArea.ClearContents '見積明細(数量)
    Next i
    '見積書 取得
    Query = "SELECT * FROM 見積書 WHERE 見積番号 = '" & Range("F2").Value & "'"
    result = module.Select(Query, nameArray, valueArray)
    If Not module.EOF Then
      Cells(4, "M").Value = module.GetValue(3) '見積番号
      Cells(5, "M").Value = module.GetValue(13) '見積日
      Cells(8, "A").Value = module.GetValue(8) '宛名
      Cells(30, "B").Value = module.GetValue(11) '備考
      Cells(2, "M").Value = module.GetValue(0) 'RecordId (非表示)
    Else
      Err.Description = "見積り番号が見つかりませんでした"
      GoTo Error
    End If
    '見積明細 取得
    Query = "SELECT * FROM 見積書_見積明細 WHERE 見積書Id = '" & Range("O2").Value & "' ORDER BY Id"
    result = module.Select(Query, nameArray, valueArray)
    i = 18
    While (Not module.EOF)
      Cells(i, "B").Value = module.GetValue(8) '見積明細(型番)
      Cells(i, "D").Value = module.GetValue(7) '見積明細(商品名)
      Cells(i, "J").Value = module.GetValue(6) '見積明細(単価)
      Cells(i, "L").Value = module.GetValue(5) '見積明細(数量)
      module.MoveNext
      i = i + 1
    Wend
    MsgBox "完成"
  End With
  Application.Cursor = Cursor
  module.Close
  Exit Sub
Error:
  MsgBox "ERROR: " & Err.Description
  Application.Cursor = Cursor
  module.Close
End Sub

いくつかのパートを解説してきます。

kintoneへの接続

  Dim module As New ExcelComModule
  module.SetProviderName ("Kintone")
  module.SetConnectionString ("User=*****;Password=*****;Url=https://*****.cybozu.com")

※User, Password, Urlには、kintoneへ接続する際のユーザ名、パスワード、サブドメインを含むUrlをセットしてください

CData kintone Excel Add-In製品マニュアル - VBA からの接続

見積書データの取得

「F2」セルにユーザがセットした見積番号を検索条件としてSQLで見積書アプリからデータを取得します。「M2」には次の「見積明細データの取得」時の検索キーとして必要な「RecordId」をセットします。

    Query = "SELECT * FROM 見積書 WHERE 見積番号 = '" & Range("F2").Value & "'"
    result = module.Select(Query, nameArray, valueArray)
    If Not module.EOF Then
      Cells(4, "M").Value = module.GetValue(3) '見積番号
      Cells(5, "M").Value = module.GetValue(13) '見積日
      Cells(8, "A").Value = module.GetValue(8) '宛名
      Cells(30, "B").Value = module.GetValue(11) '備考
      Cells(2, "M").Value = module.GetValue(0) 'RecordId (非表示)
    Else
      Err.Description = "見積り番号が見つかりませんでした"
      GoTo Error
    End If

CData kintone Excel Add-In製品マニュアル - データのクエリ

見積明細データの取得

続いて見積書アプリの(サブ)テーブルに登録されている見積明細を取得します。kintoneの(サブ)テーブルデータは「アプリ名(サブ)テーブル名」、今回であれば「見積書見積明細」というテーブル名称で取得できます。見積書Idで絞り込みます。

    '見積明細 取得
    Query = "SELECT * FROM 見積書_見積明細 WHERE 見積書Id = '" & Range("O2").Value & "' ORDER BY Id"
    result = module.Select(Query, nameArray, valueArray)
    i = 18
    While (Not module.EOF)
      Cells(i, "B").Value = module.GetValue(8) '見積明細(型番)
      Cells(i, "D").Value = module.GetValue(7) '見積明細(商品名)
      Cells(i, "J").Value = module.GetValue(6) '見積明細(単価)
      Cells(i, "L").Value = module.GetValue(5) '見積明細(数量)
      module.MoveNext
      i = i + 1
    Wend

まとめ

image.png

いかがでしたでしょうか? 今回は見積書の帳票出力を例に作成しましたが、同様の手順で既存のExcelテンプレート資産を使ってkitoneのデータで帳票出力することできます。また、帳票の出力だけではなく、Excelシートから「登録」ボタンをクリックすることでSQLのInsert/Update/Delete文でkintoneにExcelのデータを登録することも可能です。詳細はこちらのマニュアルに記載がありますので是非お試しください。

7
2
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
7
2