Visio VBA 秘伝の技:Shape.Textの完全クレンジングで、外部データ連携を鉄壁の堅牢性で制する
Visio VBA開発の戦場へようこそ。本稿では、CSVやExcelからVisio図形へとデータを流し込む際に、開発者を悩ませる「テキストの汚れ」に終止符を打つ、極めて実践的なアプローチを伝授する。単なるリファレンスの羅列に終わらず、オブジェクトのライフサイクル、パフォーマンスの真髄、そして何よりも「バグの起きない堅牢な設計」という、プロダクションコードに不可欠な要素を、魂を込めて解説していく。
我々が日々向き合うVisio VBAの世界は、時にその親切すぎるほどの柔軟性が、思わぬ落とし穴を生む。特に、外部から取り込んだデータが図形テキストとして流し込まれた際、予期せぬ制御文字や異体字が混入し、図形の表示がおかしくなったり、後続の処理でエラーを引き起こしたりするケースは枚挙にいとまがない。
「なんでこんな単純なテキスト整形が、こんなに面倒なんだ?」
そう感じている開発者諸君にこそ、本稿は読んでほしい。Visio VBAのオブジェクトモデルを深く理解し、Shape.Textプロパティの挙動を熟知した者だけが到達できる、真の自動化の世界へ、今、案内しよう。
1. なぜ「Shape.Text」のクレンジングは本質的に重要なのか?
まず、なぜShape.Textのサニタイズと正規化が、単なる「見た目の調整」以上の意味を持つのか、その本質を理解する必要がある。
- データ連携の信頼性確保: CSVやデータベースから図形にデータを流し込む際、テキストデータに含まれる不要な制御文字(改行コード `vbCrLf`、タブ `vbTab`、NULL文字 `Chr(0)` など)や、意図しない異体字(全角・半角の揺れ、同音異字など)は、データの整合性を損なう直接的な原因となる。これらが混入すると、後続のデータ処理(検索、フィルタリング、レポート生成など)で予期せぬエラーや誤った結果を生み出す。
- ユーザーエクスペリエンスの向上: 整形されていないテキストは、図形上でレイアウトを崩し、視覚的なノイズとなる。ユーザーは、整理され、一貫性のあるテキスト表示を期待している。
- 後続処理の堅牢性: 図形テキストをプログラムで操作する際、標準的でない文字が含まれていると、文字列操作関数(`InStr`, `Replace`, `Mid` など)が期待通りに動作しない、あるいはエラーを発生させる可能性がある。
- パフォーマンスへの影響: 巨大なテキストデータや、頻繁なテキスト操作において、不要な文字の存在は処理速度の低下を招く。クレンジングは、メモリ使用量やCPU負荷の最適化にも寄与する。
つまり、Shape.Textのクレンジングは、Visio図形を単なる「描画オブジェクト」から「データ駆動型インターフェース」へと昇華させるための、最も基本的な、しかし最も重要なステップなのである。
2. Shape.Textの「汚れ」の正体:制御文字と異体字の解剖
Shape.Textプロパティに格納されるテキストは、ユーザーが直接入力するだけでなく、外部データソースから流し込まれることが多い。この外部データソースこそが、テキストの「汚れ」の温床となる。
2.1. 制御文字の脅威
一般的に、テキストデータにおいて、表示されない特殊な意味を持つ文字を制御文字と呼ぶ。Shape.Textにおいては、特に以下のものが問題となる。
- 改行コード (`vbCrLf`, `vbCr`, `vbLf`): CSVファイルなどで項目区切りとして意図せず含まれたり、Excelでセル内に複数行入力されたテキストをそのまま流し込んだ場合に発生。Visio図形上では、不要な改行として表示され、レイアウトを崩す。
- タブ文字 (`vbTab`): CSVファイルなどで項目区切りとして使用されることがある。Visio図形上では、表示されないが、後続の文字列検索や分割処理で問題となる。
- NULL文字 (`Chr(0)`): データベースや一部のファイルフォーマットで、文字列の終端を示すために使われることがある。Visio図形上では表示されないが、文字列操作関数で予期せぬ挙動を引き起こす。
- その他のUnicode制御文字: `U+200B` (Zero-width space) や `U+200C` (Zero-width non-joiner) など、目に見えないが、テキストのレンダリングや処理に影響を与える文字が存在する。
2.2. 異体字・表記揺れの厄介さ
表示される文字であっても、その「表記」が統一されていないと、データとしての扱いに困ることがある。
- 全角・半角の揺れ: 「ABC」と「ABC」、「123」と「123」など、混在すると検索や比較が煩雑になる。
- カタカナの揺れ: 「サーバ」と「サーバー」、「ユーザ」と「ユーザー」など、これも統一したい場合がある。
- 漢字の異体字・旧字: 「渡辺」と「渡邊」、「斎藤」と「齋藤」など、システムによっては区別されるが、一般的には同一視したい場合が多い。
- 特殊記号・絵文字: 意図しない記号や絵文字が混入し、表示崩れや処理エラーを引き起こすことがある。
これらの「汚れ」を放置すると、Visio図形は単なる「絵」ではなく、「データ連携のバグ製造機」となりかねない。我々の使命は、このリスクを徹底的に排除し、堅牢な自動化を実現することだ。
3. Shape.Textサニタイズ&正規化のためのVBA戦略
では、具体的にどのようにShape.Textのクリーニングを行うべきか。ここでは、プロダクションコードとして通用する、堅牢で保守性の高いVBAコードの設計思想と実装例を示す。
3.1. 設計思想:段階的アプローチと「守りのコード」
一口に「クレンジング」と言っても、その範囲は広い。以下のような段階的なアプローチを推奨する。
1. 必須の制御文字除去: まず、表示や処理に悪影響を与える可能性が極めて高い、改行、タブ、NULL文字などを確実に除去する。
2. 表示に影響する制御文字除去: 目には見えないが、テキストのレンダリングに影響を与える可能性のあるUnicode制御文字を除去する。
3. 表記揺れの正規化: 全角・半角、カタカナ、漢字の異体字などを、定義されたルールに従って統一する。
4. 特殊記号・絵文字のフィルタリング: 必要に応じて、許容する文字種を定義し、それ以外の記号や絵文字を除去する。
この際、最も重要なのは「守りのコード」を意識することだ。つまり、予期せぬ入力に対しても、エラーで処理が中断することなく、可能な限り「安全な状態」で処理を継続できるような設計を心がける。
3.2. VBA実装:プロダクションコード例
以下に、上記戦略に基づいたVBAコード例を示す。これは、単一の図形 (`Shape` オブジェクト) のテキストをクレンジングすることを想定している。複数の図形に適用する場合は、ループ処理でこの関数を呼び出す形になる。
Option Explicit
‘—————————————————————————————
‘ 関数名: SanitizeAndNormalizeText
‘ 概要: Shape.Textプロパティから、不要な制御文字や表記揺れをクレンジング・正規化する。
‘ 引数:
‘ inputText: クレンジング対象の文字列
‘ 戻り値: クレンジング・正規化された文字列
‘ 備考:
‘ – 処理順序が重要。まずは必須の制御文字から除去していく。
‘ – 各正規化処理は、必要に応じて追加・修正すること。
‘ – 異体字変換には、直接的なVBA関数は存在しないため、Replace関数を駆使するか、
‘ 外部ライブラリ(例: .NET Framework)の利用を検討する必要がある。
‘ ここでは、一般的な置換例を示す。
‘—————————————————————————————
Public Function SanitizeAndNormalizeText(ByVal inputText As String) As String
Dim sanitizedText As String
sanitizedText = inputText
‘ — ステップ1: 必須の制御文字除去 —
‘ CRLF, CR, LF (改行コード) の除去
sanitizedText = Replace(sanitizedText, vbCrLf, “”)
sanitizedText = Replace(sanitizedText, vbCr, “”)
sanitizedText = Replace(sanitizedText, vbLf, “”)
‘ タブ文字の除去
sanitizedText = Replace(sanitizedText, vbTab, “”)
‘ NULL文字 (Chr(0)) の除去
sanitizedText = Replace(sanitizedText, Chr(0), “”)
‘ — ステップ2: 表示に影響する可能性のあるUnicode制御文字除去 —
‘ 例: Zero-width space (U+200B), Zero-width non-joiner (U+200C) など
‘ これらはUnicodeコードポイントで指定して除去する。
‘ VBAでは直接Unicodeコードポイントを指定できないため、ChrW()関数を使用する。
‘ ChrW()はUTF-16コードユニットを返すため、BMP外の文字は注意が必要だが、
‘ 一般的な制御文字はBMP内に収まる。
‘ 例: U+200B (Zero-width space)
sanitizedText = Replace(sanitizedText, ChrW(&H200B), “”)
‘ 例: U+200C (Zero-width non-joiner)
sanitizedText = Replace(sanitizedText, ChrW(&H200C), “”)
‘ 必要に応じて他の制御文字も追加 (例: U+200D Zero-width joiner, U+FEFF BOMなど)
sanitizedText = Replace(sanitizedText, ChrW(&H200D), “”) ‘ Zero-width joiner
sanitizedText = Replace(sanitizedText, ChrW(&HFEFF), “”) ‘ Byte Order Mark
‘ — ステップ3: 表記揺れの正規化 —
‘ 全角英数字を半角に変換 (例: ABC -> ABC)
‘ VBAのAscW/ChrW関数を組み合わせると比較的容易に実装可能。
‘ より複雑な変換は、外部ライブラリやテーブル参照を推奨。
sanitizedText = ConvertFullwidthToHalfwidthAlphanumeric(sanitizedText)
‘ 全角カタカナを半角カタカナに変換 (例: アイウ -> アイウ)
‘ VBAのStrConv関数で一部変換可能だが、完全ではない。
‘ sanitizedText = StrConv(sanitizedText, vbNarrow) ‘ これは半角英数・カナを変換する
‘ カタカナの表記揺れ統一 (例: サーバ -> サーバー, ユーザ -> ユーザー)
‘ これは文脈依存性が高いため、具体的な置換リストを作成する必要がある。
‘ 以下は例。実際にはもっと包括的なリストが必要。
sanitizedText = Replace(sanitizedText, “サーバ”, “サーバー”)
sanitizedText = Replace(sanitizedText, “ユーザ”, “ユーザー”)
sanitizedText = Replace(sanitizedText, “データ”, “データ”) ‘ 全角カタカナの例
‘ 漢字の異体字変換 (例: 渡邊 -> 渡辺, 齋藤 -> 斎藤)
‘ VBA単体での完全な異体字変換は非常に困難。
‘ 多くの異体字はUnicodeで異なるコードポイントを持つため、
‘ 置換リストを作成するか、外部の辞書サービスやライブラリを利用するのが現実的。
‘ 以下はごく一部の例。
sanitizedText = Replace(sanitizedText, “渡邊”, “渡辺”)
sanitizedText = Replace(sanitizedText, “齋藤”, “斎藤”)
sanitizedText = Replace(sanitizedText, “髙橋”, “高橋”) ‘ 異体字の例
‘ — ステップ4: 特殊記号・絵文字のフィルタリング (必要に応じて) —
‘ 例: 特定の記号を除去したい場合
‘ sanitizedText = Replace(sanitizedText, “★”, “”)
‘ 絵文字などはUnicodeの範囲で判定することも可能だが、複雑になるためここでは省略。
‘ クレンジング・正規化されたテキストを返す
SanitizeAndNormalizeText = sanitizedText
End Function
‘—————————————————————————————
‘ 関数名: ConvertFullwidthToHalfwidthAlphanumeric
‘ 概要: 文字列内の全角英数字を半角英数字に変換する。
‘ 引数:
‘ inputStr: 変換対象の文字列
‘ 戻り値: 変換後の文字列
‘—————————————————————————————
Private Function ConvertFullwidthToHalfwidthAlphanumeric(ByVal inputStr As String) As String
Dim i As Long
Dim charCode As Long
Dim resultStr As String
resultStr = “”
For i = 1 To Len(inputStr)
charCode = AscW(Mid(inputStr, i, 1))
‘ 全角数字 (0-9) の範囲: &HFF10 – &HFF19
If charCode >= &HFF10 And charCode <= &HFF19 Then
resultStr = resultStr & ChrW(charCode - &HFF00) ' 半角数字の開始コード (&H30) にオフセット
' 全角英大文字 (A-Z) の範囲: &HFF21 - &HFF3A
ElseIf charCode >= &HFF21 And charCode <= &HFF3A Then
resultStr = resultStr & ChrW(charCode - &HFF00) ' 半角英大文字の開始コード (&H41) にオフセット
' 全角英小文字 (a-z) の範囲: &HFF41 - &HFF5A
ElseIf charCode >= &HFF41 And charCode <= &HFF5A Then
resultStr = resultStr & ChrW(charCode - &HFF00) ' 半角英小文字の開始コード (&H61) にオフセット
' 全角スペース (&H3000)
ElseIf charCode = &H3000 Then
resultStr = resultStr & " " ' 半角スペースに変換
Else
' それ以外の文字はそのまま追加
resultStr = resultStr & Mid(inputStr, i, 1)
End If
Next i
ConvertFullwidthToHalfwidthAlphanumeric = resultStr
End Function
'---------------------------------------------------------------------------------------
' 使用例:
' Dim shp As Visio.Shape
' Dim cleanedText As String
'
' ' 処理したい図形オブジェクトを取得 (例: アクティブページの最初の図形)
' Set shp = ActivePage.Shapes(1)
'
' ' 図形テキストを取得し、クレンジング関数を適用
' If shp.TextFrame.HasText Then
' cleanedText = SanitizeAndNormalizeText(shp.Text)
' ' クレンジング後のテキストを図形に設定 (必要に応じて)
' shp.Text = cleanedText
' Debug.Print "クレンジング後のテキスト: " & cleanedText
' Else
' Debug.Print "図形にテキストがありません。"
' End If
'---------------------------------------------------------------------------------------
コード解説とプロダクションコードとしての注意点:
- `Option Explicit`: 変数の明示的な宣言を強制し、typoによるバグを防ぐための必須設定です。
- 段階的な除去: コードは、最も影響の大きい制御文字から順に除去していくように構成されています。これにより、処理の可読性と保守性が向上します。
- Unicode制御文字の除去: `ChrW()` 関数と16進数コードポイントを使用して、目に見えない制御文字を除去しています。`&H200B` は Zero-width space、`&H200C` は Zero-width non-joiner など、Visioのレンダリングや後続処理に悪影響を与えうる文字を網羅的に定義することを推奨します。
- 全角/半角変換: `ConvertFullwidthToHalfwidthAlphanumeric` 関数は、Unicodeコードポイントの範囲を活用して、全角英数字とスペースを半角に変換します。これはVBAで比較的容易に実装できる代表的な正規化処理です。
- 表記揺れの正規化: カタカナや漢字の異体字変換は、VBA単体では限界があります。`Replace` 関数による置換は、その対象が限定的であれば有効ですが、網羅的な対応は困難です。プロダクションレベルでは、以下のようなアプローチを検討すべきです。
- 専用の置換テーブル: 頻繁に遭遇する表記揺れについては、Excelシートや配列に定義した置換テーブルを参照して一括置換する。
- 外部ライブラリ/API: .NET Frameworkなどの外部ライブラリの文字列処理機能を利用する、あるいは外部の辞書APIなどを呼び出す。
- `Replace` 関数のパフォーマンス: 大量のテキストに対して `Replace` を繰り返すと、パフォーマンスに影響が出る可能性があります。もしパフォーマンスが問題となる場合は、より効率的な文字列処理アルゴリズム(例: `Like` 演算子、正規表現オブジェクト、あるいは .NETの `StringBuilder` など)の利用を検討してください。
- エラーハンドリング: 上記コードは基本的な処理のみを示しています。実際の運用では、`On Error Resume Next` や `On Error GoTo` を適切に使用し、予期せぬエラー発生時にも処理が中断しないような堅牢なエラーハンドリングを実装することが不可欠です。
- オブジェクトのライフサイクル: この関数は、`Shape` オブジェクト自体ではなく、その `Text` プロパティ(文字列)を操作しています。`Shape` オブジェクトの生成・削除や、`Page`、`Document` オブジェクトのライフサイクル管理は、この関数のスコープ外ですが、これらのオブジェクトを扱う親となるサブルーチンや関数で適切に管理する必要があります。例えば、図形を大量に生成・削除する処理では、メモリリークに注意し、不要になったオブジェクトは `Nothing` を代入するなどして解放することが重要です。
4. ファイル・データベース連携時の鉄則:データ取り込みの「守り」
Shape.Textのクレンジングは、単体で完結するものではない。外部データを取り込むプロセス全体を堅牢に設計することが、バグを未然に防ぐ鍵となる。
4.1. CSV/Excelからのデータ取り込み
- エンコーディングの確認: CSVファイルは、UTF-8, Shift_JIS, EUC-JPなど、様々なエンコーディングが存在します。Visio VBAからファイルを読み込む際には、正しいエンコーディングを指定しないと文字化けが発生します。VBAの `Open` ステートメントにはエンコーディングを指定する引数がないため、Microsoft Scripting Runtimeの `FileSystemObject` や、.NET Frameworkの `StreamReader` を利用するのが一般的です。
- 空行・空セルの扱い: CSVの空行やExcelの空セルが、図形テキストとして流し込まれた際の挙動を考慮する必要があります。必要に応じて、空のデータはスキップする、あるいは特定のデフォルト値に置き換えるなどの処理を施します。
- 区切り文字の注意: CSVの区切り文字(カンマ、タブ、セミコロンなど)が、データ本身に含まれている場合、正しく分割できなくなります。このような場合は、ダブルクォーテーションで囲むなどのCSVの標準的なルールに従うか、より堅牢なCSVパーサーライブラリの利用を検討します。
- Excelのセル内改行: Excelでセル内に複数行入力されたテキストは、`vbCrLf` として読み込まれることが一般的です。これは、前述のクレンジング関数で対応可能です。
4.2. データベースからのデータ取り込み
- データ型の確認: データベースから取得したデータが、意図したデータ型(文字列、数値、日付など)であるかを確認します。特に、NULL値の扱いは重要です。NULL値をそのまま文字列として扱おうとすると、エラーが発生する可能性があります。
- SQLインジェクション対策: ユーザーからの入力をSQLクエリに含める場合は、必ずパラメータ化クエリを使用してSQLインジェクション攻撃を防ぐ必要があります。
- 文字コードの整合性: データベースの文字コードと、VBA/Visioの文字コード設定が一致していることを確認します。
- 大量データ処理: 大量のデータを一度に取得・処理しようとすると、メモリ不足やタイムアウトの原因となります。ページング処理(チャンクごとにデータを取得する)や、非同期処理などを検討します。
4.3. プロダクションコード例:ファイル読み込みと図形への適用
以下は、CSVファイルを読み込み、各行を処理してVisio図形にテキストを設定する VBScript (VBS) の例です。Visio VBAから呼び出すことを想定しています。
‘—————————————————————————————
‘ スクリプト名: ImportCsvToVisioShapes.vbs
‘ 概要: CSVファイルを読み込み、各行のデータをVisio図形のテキストとして設定する。
‘ (Visio VBAから呼び出し、Visioオブジェクトを利用)
‘ 前提:
‘ – Visioがインストールされていること。
‘ – CSVファイルには、各行が1つの図形に対応し、テキストとして設定したいデータが含まれていること。
‘ – CSVファイルはUTF-8エンコーディングであること。
‘ – Visioの図形は、既に配置されており、テキストを設定したい図形を特定できること。
‘ (例: 特定のマスターシェイプから配置された図形、あるいは名前で特定など)
‘—————————————————————————————
Option Explicit
‘ — 設定項目 —
Const CSV_FILE_PATH = “C:\path\to\your\data.csv” ‘ CSVファイルのパス
Const TARGET_SHAPE_PREFIX = “DataShape_” ‘ テキストを設定したい図形の名称プレフィックス (例: “DataShape_1”, “DataShape_2”)
‘ —————-
Dim objVisio
Dim objDoc
Dim objPage
Dim objShape
Dim objFSO ‘ FileSystemObject
Dim objTextStream
Dim csvLine
Dim shapeName
Dim shapeIndex
Dim cleanedText ‘ クレンジング後のテキストを格納する変数
‘ Visioアプリケーションオブジェクトを取得
On Error Resume Next
Set objVisio = GetObject(, “Visio.Application”)
If objVisio Is Nothing Then
Set objVisio = CreateObject(“Visio.Application”)
‘ Visioを非表示にする場合 (ユーザーに気付かれずに処理したい場合)
‘ objVisio.Visible = False
End If
On Error GoTo 0
If objVisio Is Nothing Then
MsgBox “Visioアプリケーションを起動できませんでした。”, vbCritical
WScript.Quit
End If
‘ アクティブなドキュメントを使用
Set objDoc = objVisio.ActiveDocument
If objDoc Is Nothing Then
MsgBox “アクティブなVisioドキュメントがありません。ドキュメントを開いてください。”, vbCritical
WScript.Quit
End If
Set objPage = objDoc.ActivePage
If objPage Is Nothing Then
MsgBox “アクティブなページがありません。”, vbCritical
WScript.Quit
End If
‘ FileSystemObjectを作成
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ CSVファイルの存在チェック
If Not objFSO.FileExists(CSV_FILE_PATH) Then
MsgBox “指定されたCSVファイルが見つかりません: ” & CSV_FILE_PATH, vbCritical
WScript.Quit
End If
‘ CSVファイルをUTF-8で開く (FileReading = 1, Unicode = -1, ASCII = 0)
‘ VBAでは直接UTF-8を指定できないため、FileSystemObjectで開くのが一般的。
‘ ただし、FileSystemObjectのOpenTextFileはUTF-8を直接サポートしていないため、
‘ 実際にはMS Scripting RuntimeのTextStreamオブジェクトのEncodingプロパティを
‘ ‘UTF-8’ に設定して開く必要がある。
‘ ここでは、より簡単なASCII/Unicodeモードでの例を示す。
‘ UTF-8の場合は、より高度なライブラリや、VBAのStreamオブジェクトを利用する必要がある。
‘ For simplicity, assume the CSV is compatible with default VBA Read operations or ASCII.
‘ For true UTF-8 handling, consider using ADODB.Stream or .NET StreamReader.
‘
‘ — UTF-8対応のための代替手段 (ADODB.Stream) —
Dim objStream
Set objStream = CreateObject(“ADODB.Stream”)
objStream.Charset = “utf-8” ‘ UTF-8を指定
objStream.Open
objStream.LoadFromFile CSV_FILE_PATH
‘ — CSV行の処理 —
shapeIndex = 1 ‘ 図形のインデックスを初期化
Do While Not objStream.EOS ‘ ファイルの終端ではない間ループ
csvLine = objStream.ReadLine ‘ 1行読み込む
‘ 各行のデータをクレンジングして図形に適用
‘ CSVの行が複数のフィールドを持つ場合、Split関数で分割し、
‘ 必要なフィールドをクレンジングして結合するなどの処理が必要。
‘ ここでは、1行全体を1つのテキストとして扱う例。
‘ 図形名を生成 (例: “DataShape_1”, “DataShape_2”, …)
shapeName = TARGET_SHAPE_PREFIX & shapeIndex
‘ 対象の図形を取得
On Error Resume Next
Set objShape = objPage.Shapes.Item(shapeName)
On Error GoTo 0
If Not objShape Is Nothing Then
‘ 図形にテキストが含まれているか確認
If objShape.TextFrame.HasText Then
‘ — ここでVisio VBAのクレンジング関数を呼び出す —
‘ (VBAモジュールに SanitizeAndNormalizeText 関数が定義されていると仮定)
‘ VBScriptからVBAモジュール関数を直接呼び出すのは一般的ではないため、
‘ ここではVBScript内で直接クレンジング処理を実装するか、
‘ Visio VBAプロジェクト内でこのVBScriptを呼び出す関数を作成する。
‘
‘ 例として、VBScript内で直接クレンジング関数を呼び出すイメージを記述:
‘ (実際には、VBScriptからVBA関数を呼び出すためのAPIやCOM連携が必要になる場合がある)
‘
‘ ここでは、VBScript内で直接、簡単なクレンジングを行う例を示す。
‘ より複雑なクレンジングは、Visio VBAモジュールに実装し、
‘ VBScriptからそのモジュール内の関数を呼び出すのがベストプラクティス。
‘ ★ Visio VBA の SanitizeAndNormalizeText 関数を呼び出す例 (概念) ★
‘ ※ このコードは直接実行できません。VBAモジュールに関数が必要です。
‘ cleanedText = objVisio.Run(“ThisDocument.SanitizeAndNormalizeText”, csvLine)
‘ ★ VBScript で簡易的にクレンジングする例 ★
cleanedText = csvLine
‘ 改行、タブ、NULL文字の除去 (VBScriptでの表現)
cleanedText = Replace(cleanedText, vbCrLf, “”)
cleanedText = Replace(cleanedText, vbCr, “”)
cleanedText = Replace(cleanedText, vbLf, “”)
cleanedText = Replace(cleanedText, vbTab, “”)
cleanedText = Replace(cleanedText, Chr(0), “”) ‘ Chr(0) は VBScript でも使える
‘ 全角/半角変換などのより高度な処理は、VBScript単体では複雑になるため、
‘ Visio VBAモジュールに実装し、そこから呼び出すのが推奨。
‘ クレンジングされたテキストを図形に設定
objShape.Text = cleanedText
Debug.Print “図形 ‘” & shapeName & “‘ のテキストを更新しました。”
Else
Debug.Print “図形 ‘” & shapeName & “‘ にはテキストフレームがありません。”
End If
Else
Debug.Print “図形 ‘” & shapeName & “‘ が見つかりませんでした。スキップします。”
End If
shapeIndex = shapeIndex + 1 ‘ 次の図形インデックスへ
Loop
objStream.Close ‘ ストリームを閉じる
Set objStream = Nothing
MsgBox “CSVデータの読み込みと図形への適用が完了しました。”, vbInformation
‘ オブジェクトの解放
Set objShape = Nothing
Set objPage = Nothing
Set objDoc = Nothing
‘ Visioを非表示にした場合は、ここで表示に戻すか、終了させる
‘ objVisio.Visible = True
‘ Set objVisio = Nothing ‘ 必要に応じてVisioアプリケーションを終了
Set objFSO = Nothing
WScript.Quit
VBScript実行時の注意点:
- VBAモジュールとの連携: 上記VBScriptは、Visio VBAプロジェクト内に `SanitizeAndNormalizeText` 関数が定義されていることを前提としています。VBScriptからVBAプロジェクト内の関数を直接呼び出すには、`objVisio.Run(“ThisDocument.FunctionName”, arg1, arg2, …)` のように `Run` メソッドを使用します。
- UTF-8エンコーディング: `FileSystemObject` はUTF-8を直接扱えないため、`ADODB.Stream` オブジェクトを使用する例を追記しました。より堅牢なファイルI/Oが必要な場合は、この手法が推奨されます。
- 図形特定方法: 図形の特定方法 (`TARGET_SHAPE_PREFIX`) は、ご自身のVisio図形の構成に合わせて調整してください。図形の名前、カスタムプロパティ、あるいは配置順序など、様々な方法で特定可能です。
- エラーハンドリング: VBScriptでも `On Error Resume Next` を使用して、エラー発生時にもスクリプトの実行を継続させるようにします。
5. 結論:堅牢な自動化への道
Shape.Textのクレンジングは、Visio VBA開発において、見過ごされがちだが極めて重要なプロセスである。今回紹介した、段階的なアプローチ、守りのコード設計、そしてファイル・データベース連携における鉄則を遵守することで、外部データ取り込み時のバグを劇的に削減し、業務効率化ツールの信頼性を飛躍的に向上させることができる。
我々開発者は、単に「動くコード」を書くだけでなく、「壊れないコード」「保守しやすいコード」を書く責任がある。Shape.Textのクレンジングは、その責任を果たすための、まさに「秘伝の技」と言えるだろう。
この知識を活かし、君のVisio VBA開発プロジェクトを、新たなレベルへと引き上げてほしい。
—
補足:
- 本稿で紹介したコードは、あくまで基本的な例です。実際のプロジェクトでは、要件に応じてさらにカスタマイズや拡張が必要です。
- 異体字変換など、複雑な文字列処理については、外部ライブラリやAPIの利用を強く推奨します。
- パフォーマンスが重要な場合は、VBAの標準関数だけでなく、.NET Frameworkなどのより高度な機能の利用を検討してください。
