ビューをビューっぽく 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 件のコメント:
コメントを投稿