2025/11/01

Notes - Excel 連携:#57)ビューをそのまま Excel へ ② - 設計の読み込みと出力シートの準備

ビューをビューっぽく Excel に出力する方法の 2 回目です。

今回作成するサンプルはビューの設計を読みながら出力する仕様としますので、ビューの設計(状態)に依存しません。ただ、具体的なビューがないと説明しにくいので、以下のビューをサンプルとして進めます。

このビューは、この連載で帳票の出力について紹介した時に利用したものです(#20 ~)。複合機の使用実績をイメージしたビューで、年月別に白黒/カラーの出力枚数を表示しています。今回のサンプル用にない数の合計を表示するように列の設定を変更しています。

今回はビューの設計を読み込んでヘッダ行の設定と列幅や文字色を設定する部分までを作成します。


メインルーチンの構造

新規でエージェントを作成してコーディングを開始します。

今回は指定したビューの設計を参照して、それを Excel で再現することが目標です。そこで、メインルーチン xViewToExcel の引数は、DB とビュー名称だけにして、再利用しやすい構造としています。

Option Declare

Private xns As NotesSession

Sub Initialize
   Dim ndb As NotesDatabase

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase

   'ビューを Excel シートに出力して画面に表示
   Call xViewToExcel(ndb, "vXlsUsage_Sum")     '複合機使用実績ビュー(合計付き)
End Sub

では、メインルーチン xViewToExcel の作成を始めます。

Excel シートを作成してヘッダ行を固定した後、ビュー設計の読み込みとヘッダーの出力する関数 xSetHeader をコールしています(詳細は後述)。

%REM
ビュー設計の読み込みとヘッダーの出力

◆ 引数
vndb                NotesDatabase     出力するビューがあるデータベース
vsViewName    String                        出力するビュー名称

◆ データ型(戻り値)  Boolean
%END REM

Private Function xViewToExcel(vndb As NotesDatabase, ByVal vsViewName As String) As Boolean
   'Excel の準備
   Dim oXls As Variant
   Dim oSheet As Variant

   On Error GoTo Err_General

   Set oXls = CreateObject("Excel.Application")
   Call oXls.Workbooks.Add
   Set oSheet = oXls.Workbooks(1).WorkSheets(1)

   'ヘッダ行固定
   oXls.ActiveWindow.SplitRow = 1
   oXls.ActiveWindow.FreezePanes = True

   '出力ビュー取得
   Dim nv As NotesView
   Set nv = vndb.GetView(vsViewName)
   nv.AutoUpdate = False

   'ビュー設計の読み込みとヘッダーの出力
   Dim iCategory As Integer             'カテゴリの数
   Dim vCtgColNoList As Variant   'カテゴリ列番号のリスト
   Dim vCtgColorList As Variant     'カテゴリ列の文字色のリスト

   iCategory = xSetHeader(oSheet, nv, vCtgColNoList, vCtgColorList)


Exit_Func:           '終了処理
   If Not(oXls Is Nothing) Then
      'Excel を画面に表示
      oXls.Visible = True
   End If

   xViewToExcel = True

   Exit Function

Err_General:      'エラー処理
   MsgBox Error$, 16, vndb.Title
   Resume Exit_Func
End Function


ビュー設計取得

NotesView クラスには ColumnCount プロパティがあり、設計で定義されている列数が取得できます。また、Columns プロパティから列の情報である NotesViewColumn オブジェクトが取得できます。Columns は配列になっており、Columns(0) で 1 列目を取得します(要素番号は 0 から)。

NotesViewColumn オブジェクトのプロパティとして、カテゴリ列であるか、列のタイトルや幅など設計の設定にアクセスできます。


サンプルプログラム

今回のサンプルでは、ビューのカテゴリを Excel のグループ機能で表すことからカテゴリの情報は重要で、ビューの中身(データ)を出力する際にも利用します。そこで、今回作成する関数 xSetHeader では、カテゴリの数、その列番号と文字色をリスト(カテゴリ数分の要素数の配列)で返します。

例えば今回のビューの場合、カテゴリ列は 2 つです。要素数が 2 つの配列で、列番号は 2 と 4、文字色はどちらも赤を返す動作となります。

%REM
ビュー設計の読み込みとヘッダーの出力

◆ 引数
voSheet         Variant         Excel シート
vnvExport     NotesView  出力するビュー
rvCtgColNo  Variant         戻り値。カテゴリ列番号のリスト(ない場合最初の要素が0)
rvCtgColor    Variant         戻り値。カテゴリ列の文字色のリスト(要素数はrvCtgColNoと同じ)

◆ データ型(戻り値)  Integer
カテゴリ列の数を返します。
%END REM

Function xSetHeader(voSheet As Variant, vnvExport As NotesView, rvCtgColNo As Variant, rvCtgColor As Variant) As Integer
   Dim iCtg As Integer
   Dim aiCtgColNo() As Integer
   Dim alCtgColor() As Long
   Dim iCol As Integer
   Dim i As Integer
   Dim nvc As NotesViewColumn

   iCtg = 0
   ReDim aiCtgColNo(iCtg)
   ReDim alCtgColor(iCtg)

   iCol = vnvExport.ColumnCount

   For i = 1 To iCol
      Set nvc = vnvExport.Columns(i-1)
      voSheet.Cells(1, i).Value = nvc.Title

      'カテゴリ列か?
      If nvc.IsCategory = True Then
         '列番号記録
         ReDim Preserve aiCtgColNo(iCtg)
         aiCtgColNo(iCtg) = i

         '文字色を取得して記録
         ReDim Preserve alCtgColor(iCtg)
         alCtgColor(iCtg) = xColorNotesToExcel(nvc.FontColor)

         iCtg = iCtg + 1
      End If

      '文字色のセット(列全体の色をセット)
      If nvc.IsCategory = True Then
         'カテゴリはいったんグレー
         voSheet.Columns(i).Font.Color = RGB(238, 238, 238)      '薄いグレー
      Else
         voSheet.Columns(i).Font.Color = xColorNotesToExcel(nvc.FontColor)
      End If

      '列幅の調整
      voSheet.Columns(i).ColumnWidth = nvc.Width * 1.5      'そのままだとちょっと狭い

      '非表示列
      If nvc.IsHidden Then
         voSheet.Columns(i).Hidden = True
      End If
   Next

   'ヘッダ行の背景色設定
   voSheet.Rows(1).Interior.Color = RGB(238, 238, 238)      '薄いグレー

   '戻り値セット
   rvCtgColNo = aiCtgColNo
   rvCtgColor = alCtgColor
   xSetHeader = iCtg
End Function

この関数ではビュー上の各列と同じ色を Excel シートの列にそのままセットしています。ただし、ノーツと Excel では色の指定方法が異なりますので、xColorNotesToExcel 関数でノーツの色から Excel の色へ変換しています。

なお、カテゴリ列の色は戻り値で返していますが、シートの列にはグレーをいったんセットしています。これに関してはカテゴリを出力する際に詳細を説明します。


色の変換

上記関数で登場したノーツの色から Excel の色へ変換する関数は以下の通りです。NotesColorObject のプロパティから RGB の値を取得して、Excel の色番号に変換しています。

%REM
ノーツの色から Excel の色へ変換

◆ 引数
viNotesColor  Integer 変換するノーツ色

◆ データ型(戻り値)  Long
Excel の色番号
%END REM

Function xColorNotesToExcel(ByVal viNotesColor As Integer) As Long
   Dim ns As New NotesSession
   Dim nc As NotesColorObject

   Set nc = ns.CreateColorObject()
   nc.NotesColor = viNotesColor

   xColorNotesToExcel = RGB(nc.Red, nc.Green, nc.Blue)
End Function

RGB 値から Excel の色番号を取得する関数は過去にこの連載内で作成済みです。連載で順次作成してきたスクリプトライブラリ lsXls を組み込むか、以下の関数をエージェントに追加してください。

%REM
RGB メソッド ( lsXls ライブラリ )
---------------------------------------------------
R, G, B の各要素から Excel で使用する色番号を返します。
 
◆ 引数
vbyR  Byte 赤
vbyG  Byte 緑
vbyB  Byte 青
  
◆ 戻り値   Long
%END REM

Public Function RGB(ByVal vbyR As Byte, ByVal vbyG As Byte, ByVal vbyB As Byte) As Long
   RGB = vbyR + CLng(vbyG) * 256 + CLng(vbyB) * 256 ^ 2
End Function


前回 Notes - Excel 連携


0 件のコメント:

コメントを投稿