「fn命名規約」から始まるVBA構造化設計 ── 名前だけで意味を記述する構文思想と展開

# 今回の趣旨
AI時代にはAiと人間が同時に読める可読性をもつと、AIの力を活かせるとともに、人間も可読性が高くなる。

すでにコメント欄にAI向けのコメントを入れる技術は以前述べたとおりであるが、今回なんとなくやってきたテクニックがAIにも有用であるとわかったため、今回VBAのノウハウとしてまとめておこうと思う。

# ✅ VBAの関数にfn の接頭辞を導入する利点

|観点|	効果|
|:-----|:----|
|視認性|	fn を見ただけで「Function」であると即断可能|
|IDE補完|	fn 系でソート・フィルタがしやすい（特に関数のみ使いたい時）|
|保守性|	sub と fn の命名が分かれることで、呼び出し側の誤解を防ぐ|
|移植性|	他の環境（VBA→VB.NET など）でも命名規則が活きる|

# ✅ AIとの相性の良さ（技術的観点）

|効果|	説明|
|:----|:----|
|構文分類が容易になる|	Sub と Function を明示的に分離できるため、出力側も誤解しにくくなる（例：戻り値のない関数を書き出すバグを防げる）|
|補完時に関数が並ぶ構文になる|	fn で始まるものを 関数として並列出力 すれば、補完UIで自動的に「関数群」がまとまる。|
|プロンプト駆動の構造化が容易|	「fnで始まる命名を使って」「SubとFunctionを明確に分けて出力して」などの指定が非常に通りやすくなる。|
|テンプレート再利用が効く|	fnSanitizeFileName() や fnFormatDate8() のような処理を再利用する際、見つけやすく・コピペもしやすい|
|自動変換や整形がやりやすい|	AST（構文木）を使った自動整形でも、接頭辞があれば関数群を自動抽出できる（スクリプト生成や検証時に便利）|

#　🤖 AI向けのプロンプト例（VBAコード出力）
```yaml
以下のルールに従ってVBAコードを出力してください：

- 関数名には `fn` を先頭に付けてください（例：fnSanitizeFileName）
- 複数の関数が1つのメイン処理に従属する場合は、fnMainExport_FormatTitle のように命名してください
- Sub は処理単位で命名し、関数との接頭辞差で役割を明確化してください
```
## 🧠 命名による擬似スコープ・擬似モジュール化

- VBAは**モジュールや名前空間が弱い**
- しかし `fnMainProcess_Step2Clean` のように書けば、    
    **「この関数はどの処理の中核に属するか」が即わかる**
    
- これは Python や C++ における `MainProcess::Step2Clean()` に近い思想

```yaml
' ✅ 関数（戻り値あり）にはすべて `fn` を接頭辞として付ける
Function fnGetTitle(...) As String

' ✅ 機能単位の親子関係は `fnMainFunc_～` のように擬似名前空間で表現
Function fnMainExport_CleanupTitle(...) As String
```
# Accessマクロ用中継Function規約
この命名規則はAccessでも有用である。

- Accessボタン・フォームイベントには `Function` しか関連付けられない。
- したがって、イベントトリガーとしての関数はすべて `fn_Macro_～` で命名する。
- 実際の処理は `Sub` または `Function` として分離して定義し、ロジックとUIを構造分離する。

### 例：
```yaml
' Macro Button用
Function fn_Macro_ExportCustomerList()
Call ExportCustomerList
End Function

Sub ExportCustomerList()
' ... CSV出力処理 ...
End Sub
```

# 「fn規約」をさらに活かすガイド
応用として、以下のものが考えられる。

## 🔹 1. **プロジェクト分類テンプレートの導入例**

|用途|	推奨命名|
|:----|:----|
|Access マクロ起点 |	fn_Macro_◯◯|
|Excel メイン処理	|fnMain_Excel_Export|
|外部ファイル処理	|fnFile_ImportCSV|
API連携処理	|fnAPI_FetchData|

## 🔹 2. モジュール設計テンプレートの雛形
```vb
' モジュール: ExportModule.bas
Function fn_Macro_ExportCustomerList()
    Call fnExport_CustomerList
End Function

Function fnExport_CustomerList() As Boolean
    ' 実処理：テーブル→CSV
    On Error GoTo ErrHandler
    ...
    fnExport_CustomerList = True
    Exit Function
ErrHandler:
    fnExport_CustomerList = False
End Function
```
# **✅ VBA構造化設計テンプレート（fn命名規約 × AI出力制御）**

このテンプレートは、`fn`接頭辞に基づいたVBA関数命名規約と、ChatGPTなどのAIからの構造化出力を制御するためのプロンプト設計を目的とする。特に**Access VBA**や**Excel VBA**において、命名で意味・構文・所属を明示するために有効。

## 🔹 命名規約テンプレート

### ✅ 基本ルール
```vb
' 関数（戻り値あり）は必ず fn を接頭辞として付ける
Function fnGetTitle(...) As String

' Sub との構文的区別を明示する
Sub ExportTitle()

' メイン処理に従属する関数は fnMain_ でスコープ関係を明示する
Function fnMain_ExportData()
Function fnMain_FormatTitle()

' 中間ステップを接続して階層的に分ける
Function fnMain_Cleanup_RemoveSymbols()
```
### ✅ Access マクロ向け命名（イベント用中継）
```vb
' マクロボタンから実行する中継Functionは fn_Macro_ を接頭にする
Function fn_Macro_ExportCustomerList()
    Call ExportCustomerList
End Function

Sub ExportCustomerList()
    ' ... 実処理 ...
End Sub
```
## 🔹 AI 出力制御プロンプトテンプレート

以下の指示を ChatGPT に与えることで、fn命名規約に基づいた構造的出力が得られる。
```yaml
以下のルールに従ってVBAコードを出力してください：

- 関数名には `fn` を先頭に付けてください（例：fnSanitizeFileName）
- 複数の関数が1つのメイン処理に従属する場合は、fnMainExport_FormatTitle のように命名してください
- Sub は処理単位で命名し、関数との接頭辞差で役割を明確化してください
- Access のマクロ用にイベントと結びつける場合は、fn_Macro_ExportX のように書き、中で Sub を呼び出す構造にしてください
```
## 🔹 関数群の意味階層例（擬似名前空間）
|関数名|	意図・階層|
|:----|:-----|
|fnSanitizeFileName|	一般的な文字列整形関数|
|fnMain_CleanupTitle|	メイン処理内の1ステップ|
|fnMain_Cleanup_RemoveSymbols|	上記の下位階層（サブステップ）|
|fn_Macro_ExportToCSV|	Accessマクロイベント用中継関数|
|ExportToCSV|	実際の業務ロジック本体（Subで定義）|

## ✅ 利用上のポイント

- VBAは名前空間やクラス構造が弱いため、**命名だけで構文構造を擬似的に表現する**必要がある
- `fn`接頭辞は**人間とAIの両方に可読性と意味構造を伝える**ための記号である
- 本テンプレートは、AI生成コード・自動整形・ドキュメント化すべてに有効な命名構造である。加えて、他言語に移植する際のコード解読の手がかりにもなる。関数名に構造的意味が込められていれば、移植先でも機能の関連性や役割を即座に把握できる

## ✅ 推奨出力形式

- Markdown（Notion展開向け）
- YAML形式のプロンプトテンプレート
- VBAコード断片（`vbnet`シンタックス）

## **✅ AI時代のさらなる視点の展開**

この命名規約は単にVBAに有効なだけでなく、他の言語においても有効性を持っており、特に、**AIがコードを生成する時代において構造認識を助ける命名インターフェース**として機能する。

### 📐 複数関数・複数ファイル時代の命名構造の意義

- AIが複数の関数・処理ブロックを一度に出力できるようになったとき、**関数間の関連性を命名で伝える**ことが重要になる
- `fnMain_Export`, `fnMain_Export_FormatDate` などの命名は、**構造と従属関係を即座に理解可能にする**

## 🤖 AIにとっての利点
|構文的課題	|fn命名の利点|
|:--------------|:----------|
|関数の関連性が不明|	fnMain_X_Y により構文的階層が明示される|
|モデル間の処理連携が困難|	命名で意味が伝わりやすくなり、再利用が促進される|
|コードの入口が不明|	fnMain_ や fn_Macro_ によりUI起点やロジック起点が明確|

## 🌐 他言語・他分野への応用例

|言語／分野|	命名例|	効果|
|:-----|:-------|:------|
|Python	|fnPipeline_CleanData()|	関数パイプライン構造の可視化|
|JavaScript|	fnUI_HandleSubmit()|	DOM操作・UI関数の構造化|
|PowerShell|	fnDeploy_ValidateEnvironment()|	部署系スクリプトの意味区分|
|Shell Script|	fnBackup_ExportSQL()|	関連スクリプトの構造理解に有効|

このように `fn` を「構文型 × 意味階層」のトークンとして活用することで、**AI時代の構造的コード生成を支える“読解言語”としての命名構造**が成立する。

以上が、`fn命名規約` を核とした構造化命名テンプレートと、AI出力との連携について視点を展開した。なにかのヒントになれば幸いである。