対話型でフィールド値を一括変更

ダウンロードしてすぐに使えます


LotusScriptのコードはこのページの最後にあります。 Domino Designerで開き、「コード」⇒ 「新規エージェント」からLotusScriptエージェントを作成し、コードを全て貼り付けてご利用ください。

Notes/Domino を運用していると、避けて通れないのがフィールド値の修正作業です。

「入力ミスに気づいたけど、対象文書が200件ある…」 「マイグレーションで型がズレてしまった…」 「Names フィールドが Abbreviated のまま保存されていて検索に引っかからない…」

こうした場面で、文書を1件ずつ開いて直していませんか?

今回公開するエージェントは、そんな地道な修正作業を対話形式でまとめて片付けるためのツールです。


どんなエージェント?

ひと言でいえば、選択した複数文書のフィールドを「値」と「データタイプ」の両面から対話的に書き換えるエージェントです。

ビューで文書を選択して実行すると、InputBox と MsgBox の問いかけに答えていくだけで、フィールドの中身を自由に変更できます。


できること

1. フィールド値の変更

もっとも基本的な機能です。指定したフィールドに対して新しい値を入力し、選択文書へ一括で反映します。テキスト・数値・日時のいずれにも対応しています。

2. データタイプの変換

「テキストとして保存されている数値を Number 型に直したい」といったケースに対応します。変換先として以下の6種類が選べます。

  • Text
  • Number
  • DateTime
  • TextList(カンマ区切り → 文字列配列)
  • NumberList(カンマ区切り → 数値配列)
  • Names系(Names / Readers / Authors)

3. Names・Readers・Authors の正規化

Names 系フィールドを選んだ場合、値を自動で Canonical 形式CN=山田太郎/OU=Dev/O=Example)に変換したうえで、IsNames / IsReaders / IsAuthors フラグを正しくセットします。

「Abbreviated で入ってしまった名前を Canonical に統一したい」という場面で重宝します。

4. 複数値(配列)の入力

入力値にカンマが含まれている場合、「複数値として扱いますか?」と確認が入ります。「はい」を選べば TextList や NumberList として保存されるので、わざわざ @式やスクリプトを書く必要がありません。

5. 一括適用 or 個別入力の選択

1件目の文書で入力した内容を残りの文書すべてにそのまま適用するか、1件ずつ別の値を入力するかを選べます。

「全部同じ値に揃えたい」ときも、「文書ごとに違う値を入れたい」ときも、1つのエージェントで対応できます。

6. フィールドの削除と空白セット

値の入力欄を空のまま確定すると、「フィールドを削除するか」「空文字をセットするか」を選択できます。不要フィールドの掃除にも使えます。

7. 存在しないフィールドの新規作成

対象文書にフィールドが見つからない場合でも、型を指定して新たに作成できます。フォーム設計を変えずにフィールドを追加したい場面で便利です。


処理の流れ(ざっくり)

  1. フィールド名を入力 → 存在チェック(なければ型を選んで新規作成)
  2. 新しい値を入力 → 空ならフィールド削除 or 空白セットを選択
  3. データタイプ変更の確認 → 必要なら変換先の型を指定
  4. カンマの有無で複数値判定
  5. 1件目を保存
  6. 2件目以降 → 一括適用 or 個別入力を選択して処理

各ステップで「キャンセル」を選べば、未保存の文書に影響を与えずに中止できます。


こんなときに使えます

シーン 具体例
誤入力の一括修正 大量文書のステータスフィールドを間違えた値で登録してしまった
Names フィールドの正規化 Abbreviated で保存された名前を Canonical に揃えたい
マイグレーション後の型修正 テキストで移行された日付フィールドを DateTime に戻したい
不要フィールドの一括削除 旧フォームの残骸フィールドをまとめて消したい
テスト・検証 開発中にフィールド値を素早く差し替えて動作確認したい

注意点

  • 一括適用では全文書が同じ値に上書きされます。 文書ごとに異なる値を保持したまま型だけ変えたい場合は、別途「データタイプ一括変換」エージェントの使用をおすすめします。(後日公開予定
  • 途中でキャンセルした場合、まだ保存されていない文書は変更されません。
  • 保存時に ComputeWithForm を実行するため、フォームの入力規則や計算フィールドが反映されます。意図しないフィールド変更が起きないか、事前にテスト文書で確認してください。

文書フィールド値 一括変更エージェント フローチャート

ダイアログ(InputBox / MsgBox)の流れを中心に記載

InputBox(入力) MsgBox(確認) 処理・保存 終了・キャンセル
flowchart TD Start([開始:文書を選択して実行]) Start --> A A[/"① InputBox
「変更するフィールド名を入力」"/] A -->|空| Z1([キャンセル終了]) A -->|入力あり| B{フィールドが存在する?} B -->|No| B1[/"② InputBox
「フィールド型を選択」
1=Text 2=Number 3=DateTime
4=Names 5=Readers 6=Authors"/] B1 -->|空 or 無効| Z1 B1 -->|有効| C B -->|Yes| C C[/"③ InputBox
「変更する値を入力」
(現在値が初期表示)"/] C -->|空| D C -->|入力あり| E D{{"④ MsgBox(はい/いいえ/キャンセル)
「フィールドを削除しますか?」
はい=削除 / いいえ=空白セット"}} D -->|キャンセル| Z1 D -->|はい:削除| U1 D -->|いいえ:空白セット| E E{{"⑤ MsgBox(はい/いいえ/キャンセル)
「データタイプを変更しますか?」"}} E -->|キャンセル| Z1 E -->|いいえ:変更しない| F E -->|はい| E1[/"⑥ InputBox
「変更後タイプ番号」
1=Text 2=Number 3=DateTime
4=TextList 5=NumberList 6=Names系"/] E1 -->|Names系| E2[/"⑦ InputBox
「1=Names 2=Readers 3=Authors」"/] E2 --> F E1 -->|Text〜NumberList| F F{カンマを含む?} F -->|No| U1 F -->|Yes| G{{"⑧ MsgBox(はい/いいえ/キャンセル)
「複数値として扱いますか?」"}} G -->|キャンセル| Z1 G -->|はい or いいえ| U1 U1["1件目の文書を保存"] U1 --> H{文書は1件だけ?} H -->|Yes| Z2([完了:1件処理済み]) H -->|No| I{{"⑨ MsgBox(はい/いいえ/キャンセル)
「この値を他の文書にも適用?」
はい=一括 / いいえ=個別"}} I -->|キャンセル| Z1 I -->|はい:一括| J["2件目〜最終文書に
同じ値・型で一括保存"] J --> Z3([完了:全件処理済み]) I -->|いいえ:個別| K["文書ごとに ③〜⑧ を繰り返し
(個別に値入力・型変換・保存)"] K --> Z3 %% ===== style ===== style A fill:#4361ee,color:#fff,stroke:#3a56d4 style B1 fill:#4361ee,color:#fff,stroke:#3a56d4 style C fill:#4361ee,color:#fff,stroke:#3a56d4 style E1 fill:#4361ee,color:#fff,stroke:#3a56d4 style E2 fill:#4361ee,color:#fff,stroke:#3a56d4 style D fill:#e76f51,color:#fff,stroke:#d4573f style E fill:#e76f51,color:#fff,stroke:#d4573f style G fill:#e76f51,color:#fff,stroke:#d4573f style I fill:#e76f51,color:#fff,stroke:#d4573f style U1 fill:#2a9d8f,color:#fff,stroke:#238377 style J fill:#2a9d8f,color:#fff,stroke:#238377 style K fill:#2a9d8f,color:#fff,stroke:#238377 style Z1 fill:#6c757d,color:#fff,stroke:#5a6268 style Z2 fill:#1a1a2e,color:#fff,stroke:#12121f style Z3 fill:#1a1a2e,color:#fff,stroke:#12121f style Start fill:#1a1a2e,color:#fff,stroke:#12121f

%REM
' ================================================================
' エージェント名:文書フィールド値変更(対話型)
'
' 【概要】
'   選択した複数の Notes 文書に対して、指定フィールドの
'   「値」および「データタイプ」を対話形式で変更できるエージェントです。
'
'   1件目の文書で入力した値を、残りの文書へ一括適用することも、
'   文書ごとに個別入力することも可能です。
'
'   フィールドが存在しない文書に対しては、型を指定して新規作成できます。
'
'
' ================================================================
' 【本エージェントの特徴】
'
' ● 文書のフィールド値をユーザーが入力して変更できる
' ● フィールドのデータタイプ(Text/Number/DateTime など)の変更も可能
' ● Names/Readers/Authors フィールドを Canonical 化して正しく扱える
' ● 複数の文書に対して一括変更 or 個別変更 を選択できる
' ● 空文字入力時は「削除」「空白セット」「キャンセル」を選択可能
' ● 型変換を行うかどうかの確認ダイアログ付き
' ● 配列(TextList, NumberList)などの複数値も扱える
'
'
' ================================================================
' 【本エージェントと「データタイプ一括変換」エージェントの違い】
'
' ■ 本エージェント(データ修正エージェント)
'     - フィールドの「値」と「データタイプ」を両方変更することができる
'     - 1件目の文書に入力した値を、残り文書に一括で適用するため「型だけ変えたい」用途には不向き
'
'     ◎ 注意点
'        一括変更の場合、ユーザーが入力した新しい値で全文書の値が上書きされるため
'        文書間でフィールド値の差異をそのまま残すことはできない

' ■ 使い分けの指針
'     - 文書の値そのものを修正したいとき → 本エージェント
'
'     - 文書間で値は保持したまま、型だけそろえたいとき  
'           → 「データタイプ一括変換」エージェントを使用すること
'
'
' ================================================================
' 【処理の流れ】
'
' ■ 1. 変更対象のフィールド名を InputBox で入力
'
' ■ 2. 最初の文書を取得し、フィールドの存在を確認
'
'     ● 存在する場合:
'          - フィールドの型(Text / Number / DateTime / その他)を判別
'          - 現在の値を MSG_def として入力欄の初期値に設定
'
'     ● 存在しない場合:
'          - ユーザーにフィールド型を選ばせる
'            1=Text, 2=Number, 3=DateTime,
'            4=Names, 5=Readers, 6=Authors
'
'          - 選択された型でフィールドを作成予定として扱う
'
'
' ■ 3. 1件目の文書に対する値入力
'
'     - InputBox で新しい値を入力させる
'
'     ● 入力が空の場合(キャンセル含む)
'         → 「フィールド削除」「空白セット」「キャンセル」を選択
'
'         → 「空白セット」の場合のみ、型変換確認(ConvertDataType)を実行
'
'     ● 入力値がある場合
'         → 型変換するかどうか確認(はい / いいえ / キャンセル)
'         → 「はい」の場合は ConvertDataType を実行し型変換
'
'     ● カンマが含まれる場合
'         → 複数値として扱うかを確認
'
' ■ 4. 1件目の文書を UpdateDocument で保存
'
' ■ 5. 2件目以降の処理
'
'     ● 一括適用するかどうか確認
'         「はい」   → 1件目の値・型をすべての文書に適用
'         「いいえ」 → 文書ごとに個別入力
'         「キャンセル」→ 処理中止
'
'     ● 個別入力の場合も 1件目と同様の手順で処理
'
'
' ================================================================
' 【ConvertDataType の仕様】
'
'   ● ユーザーに型変換を行うかどうか確認
'        → 「はい」の場合のみ型変換
'
'   ● 変換先型は以下から選択:
'         1 = Text
'         2 = Number
'         3 = DateTime
'         4 = TextList(文字列配列)
'         5 = NumberList(数値配列)
'         6 = Names系(別途 Names/Readers/Authors を選択)
'
'   ● TextList / NumberList の変換規則
'        - カンマ区切りで配列化
'        - カンマ無しでも単一要素配列にする
'
'   ● Names系変換規則
'        - Canonical 化し、item.IsNames / IsReaders / IsAuthors を正しく設定
'        - 名前型で複数値がある場合もすべて Canonical 化
'
'
' ================================================================
' 【UpdateDocument の仕様】
'
' ● removeCheck の値に応じて処理
'       6 = フィールド削除
'       7 = 空白セット
'       0 = 通常保存
'
' ● Names/Readers/Authors の場合:
'       ・NotesName().Canonical に変換
'       ・item.IsNames / IsReaders / IsAuthors を設定
'
' ● 通常の型:
'       1280 = Text
'       768  = Number
'       1024 = DateTime
'
' ● 配列もそのまま保存可能(TextList, NumberList)
'
' ● 保存前に doc.ComputeWithForm を実行し、計算式反映
'
'
' ================================================================
' 【エラー対策と型安全性】
'
' ● Split を行う時は常に 1次元配列に統一
' ● NumberList はすべて CDbl で精査
' ● Names 系は常に Canonical へ統一
' ● 変換不可能な値(数値でない、日時でない)があればキャンセル
'
'
' ================================================================
' 【このエージェントが適している用途】
'
' ● フィールド名を間違えて大量文書に誤入力してしまった時の修正
' ● Names 系フィールドの変換(Notes → Canonical の統一)
' ● 文書マイグレーション時のフィールド型修正
' ● テキスト・複数値の一括編集
'
'
' ================================================================
' 【注意事項】
'
' ● 途中でキャンセルした場合、未保存文書の変更は行われない
' ● 一括変更の際、型と Names 属性も引き継がれる
' ● 変換できない値はその文書をスキップする
'
'
' ================================================================

%END REM
Option Public

Sub Initialize
    Dim Sess As New NotesSession
    Dim DB As NotesDatabase
    Dim DC As NotesDocumentCollection
    Dim Doc As NotesDocument
    Dim Item As NotesItem
    Dim FieldName As String
    Dim TmpValue As Variant
    Dim GlobalValue As Variant
    Dim ItemType As Integer
    Dim RemoveCheck As Integer
    Dim MulteCheck As Integer
    Dim MSG_type As String
    Dim MSG_def As String
    Dim i As Integer
    Dim DocCount As Integer

    Dim isNames As Boolean, isReaders As Boolean, isAuthors As Boolean
    Dim GlobalIsNames As Boolean, GlobalIsReaders As Boolean, GlobalIsAuthors As Boolean

    Set DB = Sess.CurrentDatabase
    Set DC = DB.UnprocessedDocuments
    DocCount = DC.Count

    If DocCount = 0 Then
        MsgBox "文書が選択されていません。", 48, "エラー"
        Exit Sub
    End If

    '=== フィールド名入力 ===
    FieldName = InputBox("変更するフィールド名を入力してください。", "LotusNotes")
    If FieldName = "" Then
        MsgBox "処理をキャンセルしました。", 64, "キャンセル"
        Exit Sub
    End If

    '=== 最初の文書 ===
    Set Doc = DC.GetNthDocument(1)
    Set Item = Doc.GetFirstItem(FieldName)

    If Item Is Nothing Then
        ' フィールドが存在しない場合:型を選択
        Dim typeInput As String, typeNum As Integer

        typeInput = InputBox( _
            "指定フィールド [" & FieldName & "] は存在しません。" & Chr(10) & _
            "1=Text,2=Number,3=DateTime,4=Names,5=Readers,6=Authors", _
            "フィールド新規作成")

        If Trim(typeInput) = "" Then
            MsgBox "処理をキャンセルしました。", 64, "キャンセル"
            Exit Sub
        End If
        If Not IsNumeric(typeInput) Then
            MsgBox "番号で入力してください。", 48, "入力エラー"
            Exit Sub
        End If

        typeNum = CInt(typeInput)
        If typeNum < 1 Or typeNum > 6 Then
            MsgBox "1~6 の番号を入力してください。", 48, "範囲エラー"
            Exit Sub
        End If

        Select Case typeNum
        Case 1
            ItemType = 1280
            MSG_type = "[テキスト]"
            MSG_def = ""
        Case 2
            ItemType = 768
            MSG_type = "[数値]"
            MSG_def = "0"
        Case 3
            ItemType = 1024
            MSG_type = "[日時]"
            MSG_def = Format$(Now, "yyyy/mm/dd hh:nn:ss")
        Case 4
            ItemType = 1280
            MSG_type = "[Names]"
            isNames = True
        Case 5
            ItemType = 1280
            MSG_type = "[Readers]"
            isReaders = True
        Case 6
            ItemType = 1280
            MSG_type = "[Authors]"
            isAuthors = True
        End Select

    Else
        ' 既存フィールド:型/値を取得
        ItemType = Item.Type
        isNames = Item.IsNames
        isReaders = Item.IsReaders
        isAuthors = Item.IsAuthors

        Select Case ItemType
        Case 1280: MSG_type = "[テキスト]"
        Case 768:  MSG_type = "[数値]"
        Case 1024: MSG_type = "[日時]"
        Case Else: MSG_type = "[その他]"
        End Select

        If IsEmpty(CVar(Item.Text)) Then
            MSG_def = ""
        ElseIf IsArray(Item.Values) Then
            If UBound(Item.Values) = 0 Then
                MSG_def = CStr(Item.Values(0))
            Else
                MSG_def = Join(Item.Values, ",")
            End If
        Else
            MSG_def = Item.Text
        End If
    End If

    '===========================================================
    '■ 1件目の値入力
    '===========================================================
    TmpValue = InputBox("変更する値を入力してください。 " & MSG_type, "LotusNotes", MSG_def)

    If TmpValue = "" Then
        ' 空欄(キャンセル含む) → 削除/空白セット
        RemoveCheck = MessageBox( _
            "フィールド:" & FieldName & " を削除しますか?" & Chr(10) & _
            "[はい]=削除, [いいえ]=空白セット, [キャンセル]=中止", _
            35, "確認")
        If RemoveCheck = 2 Then Exit Sub ' キャンセル

        If RemoveCheck = 7 Then
            ' 空白セット → 型変換を聞いてよい
            Dim cv0 As Variant
            cv0 = ConvertDataType("", ItemType, isNames, isReaders, isAuthors)
            If cv0 = "__CANCEL__" Then Exit Sub
            TmpValue = cv0
        Else
            ' 削除の場合、値は空文字のままでOK(RemoveCheck=6をUpdate側に渡す)
            TmpValue = ""
        End If

    Else
        ' 値あり → 型変換を確認
        Dim cv As Variant
        cv = ConvertDataType(TmpValue, ItemType, isNames, isReaders, isAuthors)
        If cv = "__CANCEL__" Then Exit Sub
        TmpValue = cv
    End If

    '=== 複数値確認(NamesでもTextでも共通で動く) ===
    If Not IsArray(TmpValue) Then
        If InStr(TmpValue, ",") > 0 Then
            Dim IsMulti As Integer
            IsMulti = MessageBox( _
                "入力された値にカンマがあります。" & Chr(10) & _
                "複数値として扱いますか?", _
                35, "複数値確認")
            If IsMulti = 2 Then Exit Sub
            If IsMulti = 6 Then TmpValue = Split(TmpValue, ",")
        End If
    End If

    '=== 1件目を更新 ===
    Call UpdateDocument(Doc, FieldName, ItemType, TmpValue, RemoveCheck, isNames, isReaders, isAuthors)

    ' 一括適用用に1件目の状態を保持
    GlobalValue = TmpValue
    GlobalIsNames = isNames
    GlobalIsReaders = isReaders
    GlobalIsAuthors = isAuthors
    Dim GlobalRemoveCheck As Integer
    GlobalRemoveCheck = RemoveCheck

    '=== 文書が1件だけなら終了 ===
    If DocCount = 1 Then
        MsgBox "1件の文書を処理しました。", 64, "完了"
        Exit Sub
    End If

    '===========================================================
    '■ 2件目以降の処理
    '===========================================================
    Dim ApplyAll As Integer
    ApplyAll = MessageBox( _
        "この値を他の文書にも適用しますか?" & Chr(10) & _
        "[はい]=残りすべてに適用, [いいえ]=個別入力, [キャンセル]=中止", _
        35, "一括変更確認")
    If ApplyAll = 2 Then Exit Sub

    Dim UseGlobal As Boolean
    UseGlobal = (ApplyAll = 6)

    For i = 2 To DocCount
        Set Doc = DC.GetNthDocument(i)
        Set Item = Doc.GetFirstItem(FieldName)

        If Item Is Nothing Then GoTo SkipToNext

        ' 既存フィールドのフラグを取得(個別入力時に使用)
        isNames = Item.IsNames
        isReaders = Item.IsReaders
        isAuthors = Item.IsAuthors
        ItemType = Item.Type

        If UseGlobal Then
            ' 一括適用:1件目と同じ型・Names属性を使う
            Call UpdateDocument(Doc, FieldName, ItemType, GlobalValue, GlobalRemoveCheck, _
                                GlobalIsNames, GlobalIsReaders, GlobalIsAuthors)
        Else
            ' 個別入力
            If IsEmpty(CVar(Item.Text)) Then
                MSG_def = ""
            ElseIf IsArray(Item.Values) Then
                If UBound(Item.Values) = 0 Then
                    MSG_def = CStr(Item.Values(0))
                Else
                    MSG_def = Join(Item.Values, ",")
                End If
            Else
                MSG_def = Item.Text
            End If

            TmpValue = InputBox("文書 " & i & " の新しい値を入力してください。 " & MSG_type, "LotusNotes", MSG_def)

            If TmpValue = "" Then
                RemoveCheck = MessageBox( _
                    "フィールド:" & FieldName & " を削除しますか?" & Chr(10) & _
                    "[はい]=削除, [いいえ]=空白セット, [キャンセル]=中止", _
                    35, "確認")
                If RemoveCheck = 2 Then Exit Sub

                If RemoveCheck = 7 Then
                    Dim cv2 As Variant
                    cv2 = ConvertDataType("", ItemType, isNames, isReaders, isAuthors)
                    If cv2 = "__CANCEL__" Then Exit Sub
                    TmpValue = cv2
                Else
                    TmpValue = ""
                End If
            Else
                Dim cv3 As Variant
                cv3 = ConvertDataType(TmpValue, ItemType, isNames, isReaders, isAuthors)
                If cv3 = "__CANCEL__" Then Exit Sub
                TmpValue = cv3
            End If

            ' 複数値判定(個別入力時)
            If Not IsArray(TmpValue) Then
                If InStr(TmpValue, ",") > 0 Then
                    MulteCheck = MessageBox( _
                        "カンマを含みます。複数値として扱いますか?", _
                        35, "複数値確認")
                    If MulteCheck = 2 Then Exit Sub
                    If MulteCheck = 6 Then TmpValue = Split(TmpValue, ",")
                End If
            End If

            Call UpdateDocument(Doc, FieldName, ItemType, TmpValue, RemoveCheck, isNames, isReaders, isAuthors)
        End If

SkipToNext:
    Next

    MsgBox "すべての文書を処理しました。", 64, "完了"
End Sub


'==============================================================
'■ データ型変換(2行以内ダイアログ & Names/Readers/Authors 選択付き)
'==============================================================
Function ConvertDataType(value As Variant, itemType As Integer, isNames As Boolean, isReaders As Boolean, isAuthors As Boolean) As Variant

    Dim ChangeType As Integer
    ChangeType = MessageBox("データタイプを変更しますか?", 35, "データタイプ変更確認")

    If ChangeType = 2 Then
        ConvertDataType = "__CANCEL__"
        Exit Function           ' キャンセル
    End If
    If ChangeType = 7 Then
        ConvertDataType = value ' 「いいえ」→ そのまま
        Exit Function
    End If

    ' ここから実際に型変更するので Names系フラグはいったんクリア
    isNames = False
    isReaders = False
    isAuthors = False

    Dim typeInput As String
    typeInput = InputBox( _
        "変更後タイプ番号:" & Chr(10) & _
        "1=Text,2=Number,3=DateTime,4=TextList,5=NumberList,6=Names系", _
        "タイプ指定")

    If Trim(typeInput) = "" Then
        ConvertDataType = "__CANCEL__"
        Exit Function
    End If
    If Not IsNumeric(typeInput) Then
        ConvertDataType = "__CANCEL__"
        Exit Function
    End If

    Dim NewType As Integer
    NewType = CInt(typeInput)
    If NewType < 1 Or NewType > 6 Then
        ConvertDataType = "__CANCEL__"
        Exit Function
    End If

    Dim tmp As Variant
    Dim i As Integer

    Select Case NewType

    Case 1  ' Text
        tmp = CStr(value)
        itemType = 1280

    Case 2  ' Number
        If Not IsNumeric(value) Then
            MsgBox "数値に変換できません。", 48, "変換エラー"
            ConvertDataType = "__CANCEL__"
            Exit Function
        End If
        tmp = CDbl(value)
        itemType = 768

    Case 3  ' DateTime
        On Error Resume Next
        tmp = CDat(value)
        If Err <> 0 Then
            Err = 0
            MsgBox "日時に変換できません。", 48, "変換エラー"
            ConvertDataType = "__CANCEL__"
            Exit Function
        End If
        On Error GoTo 0
        itemType = 1024

    Case 4  ' Text List
        tmp = Split(CStr(value), ",")
        itemType = 1280

    Case 5  ' Number List
        Dim s As Variant, arr() As Double
        s = Split(CStr(value), ",")
        ReDim arr(LBound(s) To UBound(s))
        For i = LBound(s) To UBound(s)
            If Not IsNumeric(s(i)) Then
                MsgBox "配列内に数値以外があります: " & s(i), 48, "変換エラー"
                ConvertDataType = "__CANCEL__"
                Exit Function
            End If
            arr(i) = CDbl(s(i))
        Next
        tmp = arr
        itemType = 768

    Case 6  ' Names / Readers / Authors(種類を別途指定)
        Dim nrInput As String, nrType As Integer
        nrInput = InputBox( _
            "Names系の種類を指定してください:" & Chr(10) & _
            "1=Names,2=Readers,3=Authors", _
            "Names系タイプ指定")

        If Trim(nrInput) = "" Then
            ConvertDataType = "__CANCEL__"
            Exit Function
        End If
        If Not IsNumeric(nrInput) Then
            ConvertDataType = "__CANCEL__"
            Exit Function
        End If

        nrType = CInt(nrInput)
        If nrType < 1 Or nrType > 3 Then
            ConvertDataType = "__CANCEL__"
            Exit Function
        End If

        Select Case nrType
        Case 1: isNames = True
        Case 2: isReaders = True
        Case 3: isAuthors = True
        End Select

        ' 値そのものはここではまだそのまま(Canonical 化は UpdateDocument で実施)
        tmp = value
        itemType = 1280

    End Select

    ConvertDataType = tmp
End Function


'==============================================================
'■ 文書更新(Names/Readers/Authors の Canonical 化+フラグ設定)
'==============================================================
Sub UpdateDocument(doc As NotesDocument, fieldName As String, itemType As Integer, _
                   value As Variant, removeCheck As Integer, _
                   isNames As Boolean, isReaders As Boolean, isAuthors As Boolean)

    Dim item As NotesItem
    Dim i As Integer

    Set item = doc.GetFirstItem(fieldName)

    '=== 削除 / 空白処理 ===
    Select Case removeCheck
    Case 6  ' 削除
        If Not (item Is Nothing) Then Call item.Remove
        GoTo SaveDoc

    Case 7  ' 空白セット
        Call doc.ReplaceItemValue(fieldName, "")
        GoTo SaveDoc
    End Select

    '=== Names/Readers/Authors の場合は Canonical 化 ===
    If isNames Or isReaders Or isAuthors Then
        Dim canonicalValue As Variant
        Dim nm As NotesName

        If IsArray(value) Then
            Dim v As Variant
            ReDim canonicalValue(LBound(value) To UBound(value))
            For i = LBound(value) To UBound(value)
                v = value(i)
                If Trim(CStr(v)) <> "" Then
                    Set nm = New NotesName(Trim(CStr(v)))
                    canonicalValue(i) = nm.Canonical
                Else
                    canonicalValue(i) = ""
                End If
            Next
        Else
            If Trim(CStr(value)) <> "" Then
                Set nm = New NotesName(Trim(CStr(value)))
                canonicalValue = nm.Canonical
            Else
                canonicalValue = ""
            End If
        End If

        Call doc.ReplaceItemValue(fieldName, canonicalValue)
        Set item = doc.GetFirstItem(fieldName)
        If Not (item Is Nothing) Then
            item.IsNames = isNames
            item.IsReaders = isReaders
            item.IsAuthors = isAuthors
        End If

    Else
        '=== 通常フィールドの型ごとのセット ===
        Select Case itemType
        Case 1280 ' Text
            Call doc.ReplaceItemValue(fieldName, value)
        Case 768  ' Number
            If IsArray(value) Then
                ' すでに配列の場合はそのまま
                Call doc.ReplaceItemValue(fieldName, value)
            Else
                Call doc.ReplaceItemValue(fieldName, CDbl(value))
            End If
        Case 1024 ' DateTime
            Call doc.ReplaceItemValue(fieldName, CDat(value))
        Case Else
            Call doc.ReplaceItemValue(fieldName, value)
        End Select
    End If

SaveDoc:
    Call doc.ComputeWithForm(True, False)
    Call doc.Save(True, True)
End Sub

おわりに

Notes/Domino の管理をしていると、こうした「ちょっとした修正だけど件数が多い」作業は意外と頻繁に発生します。

このエージェントをアプリケーションに入れておけば、フィールド周りのトラブルに素早く対処できるはずです。ソースコードを公開していますので、環境に合わせて自由にカスタマイズしてみてください。