ExcelVBAでノーツ(Notes)のデータを作成更新する

2022年10月8日

グループウェア製品の一つであるノーツ(Notes)とExcelはVBAを使って連携させることができます。今回はExcelのデータをノーツに送るサンプルアプリを使って、連携方法についてご説明します。Excelで作成したデータをノーツに送ってデータベース化したり情報共有を行う際に役立ちます。
 ※関連記事 グループウェアー(ノーツ)のデータを出力してExcelの表を作成する

サンプルアプリ実行動作

Excel上の「ノーツデータ作成更新」ボタンをクリックすると全社通勤手当一覧の内容がノーツ(Notes)のアプリケーション内に作成されます。また、すでにデータが作成されている場合は更新処理が行われます。

サンプルコードの処理内容

下記のフォームをノーツ上に作成しています。

Excelのデータをノーツ側に送る際は、下記コードのように各ノーツのフィールドにExcelのセルのデータを紐けてセットします。
具体的なコーディング方法については次項目のサンプルコードをご覧ください。

'ノーツの各フィールドにExcelのデータをセット
doc1.No = key                                   'No
doc1.namae = Trim(Sh1.Cells(i, 3))              '氏名
doc1.yakushoku = Trim(Sh1.Cells(i, 4))          '役職
doc1.busho = Trim(Sh1.Cells(i, 5))              '部署
doc1.kinmuchi = Trim(Sh1.Cells(i, 6))           '勤務地
doc1.tuukinteate = Trim(Str(Sh1.Cells(i, 7)))   '通勤手当

サンプルコード   アプリの作成手順はこちら

Option Explicit

Sub Notesデータ作成更新()

'ワークシートオブジェクトを入れる変数の定義
Dim Sh1 As Worksheet
'オブジェクト変数にワークシートオブジェクトを設定
Set Sh1 = ThisWorkbook.Worksheets(1)

'*********** ノーツへデータ送信 ******************************************************
'ノーツセッションオブジェクト変数の定義
Dim Session As Object
'ノーツアプリケーションオブジェクト変数の定義
Dim db1 As Object
'ノーツビューオブジェクト変数の定義
Dim view1 As Object
'ノーツドキュメントオブジェクト変数の定義
Dim doc1 As Object
'ノーツアイテムブジェクト変数の定義
Dim item1 As Object

'サーバー名を入れる変数の定義
Dim Server As String
'ノーツアプリケーションが存在するパスを入れる変数の定義
Dim Directory As String

'検索キーワードを入れる変数の定義
Dim key As String
'成否を判定する変数の定義
Dim success As String

'カウント変数の定義
Dim i As Integer         'データカウント変数
Dim ScoreNew As Integer  '新規作成件数を入れる変数
Dim ScoreUP As Integer   'データ更新件数を入れる変数

'セッション変数にノーツセッションオブジェクトを設定
Set Session = CreateObject("Notes.Notessession")

'サーバ名を設定
Server = ""
'ノーツアプリケーションが存在するパスを設定
Directory = "VBATEST.nsf"

'ノーツアプリケーションオブジェクトを設定
Set db1 = Session.GetDatabase(Server, Directory)
'ノーツビューオブジェクトを設定
'(「MainView」は検索を行うビュー、1列目(No列)はソートされている必要があります)
Set view1 = db1.GetView("MainView")

'データ開始行(5行目)を指定
i = 5

'初期のカウント変数として「0」を設定
ScoreNew = 0 '新規データ作成件数用
ScoreUP = 0  'データ更新件数用

'移行データ分をループ
Do While Sheet1.Cells(i, 2) <> ""

 'key変数に検索キー(No)をセット
  key = Trim(Sh1.Cells(i, 2))
   
 'view1ビューを検索キー(No)で検索してヒットした文書データを格納
  Set doc1 = view1.GetDocumentByKey(key, True)   '*** 検索 ***

  '該当データがない場合はデータ新規作成
  If (doc1 Is Nothing) Then
   
   '文書フォーム作成
    Set doc1 = db1.createdocument

  'ノーツのフォーム名をセット
    doc1.form = "MainForm" 
    'ノーツの各フィールドにExcelのデータをセット                         
    doc1.No = key                                   'No
    doc1.namae = Trim(Sh1.Cells(i, 3))              '氏名
    doc1.yakushoku = Trim(Sh1.Cells(i, 4))          '役職
    doc1.busho = Trim(Sh1.Cells(i, 5))              '部署
    doc1.kinmuchi = Trim(Sh1.Cells(i, 6))           '勤務地
    doc1.tuukinteate = Trim(Str(Sh1.Cells(i, 7)))   '通勤手当
   
   '文書フォームを更新する
    success = doc1.computewithform(False, False)
    
    '新規文書の作成が成功したら保存
    If success Then
     Call doc1.Save(True, True)
    End If
    
    '新規作成数をカウント
    ScoreNew = ScoreNew + 1
    
    
  '該当データが見つかった場合はデータを更新
  Else
    
    'ノーツの各フィールドのデータを更新(2つの方法で記述しているがどちらでもOK)
    Set item1 = doc1.ReplaceItemValue("No", Trim(Sh1.Cells(i, 2)))        'No
    Set item1 = doc1.ReplaceItemValue("namae", Trim(Sh1.Cells(i, 3)))     '氏名
    Set item1 = doc1.ReplaceItemValue("yakushoku", Trim(Sh1.Cells(i, 4))) '役職
    Call doc1.ReplaceItemValue("busho", Trim(Sh1.Cells(i, 5)))            '部署
    Call doc1.ReplaceItemValue("kinmuchi1", Trim(Sh1.Cells(i, 6)))        '勤務地
    Call doc1.ReplaceItemValue("tuukinteate", Trim(Str(Sh1.Cells(i, 7)))) '通勤手当
  
    '文書フォームを更新する
    success = doc1.computewithform(False, False)

    '文書データの更新が成功したら保存
    If success Then
     Call doc1.Save(True, True)
    End If
    
     '更新数をカウント
    ScoreUP = ScoreUP + 1
    
  End If
     
  '次に処理するデータの行番号をセット
  i = i + 1
   
Loop

'データ移行完了メッセージの表示
MsgBox "データ移行完了" & " 新規作成件数: " & ScoreNew & " 件" & " 更新件数: " & ScoreUP & " 件"

End Sub