Excel VBA で 名前性別予測（GenderEstimate）をする方法

# 1. はじめに
今回は、自分自身への備忘録を兼ねて、Excel VBA で 名前性別予測（GenderEstimate）をする方法を、お伝えしたいと思います

- 参考文献：[VBAマクロ向け関数。GenderEstimate。漢字の名前とふりがなから、性別を推定する関数](https://gist.github.com/lunark/4344906)

# 2. この記事を読んでできること
- Excel VBA で 名前性別予測（GenderEstimate）をすることができるようになる

# 3. 注意事項
- テスト用の名前データは、各自でご用意ください（今回テストで用いたデータは、ChatGPTにて生成した名前データを利用しています）

# 4. 必要なもの
- Windows OS PC（Windows11を想定）
- Microsoft Excel（ソフト版・・・VBAが動作するものをお使いください）

# 5. Excelファイルの新規作成
- Excelを起動し、任意の名前のExcelファイル（拡張子は必ず .xlsm ）を作成する
- （例）名前性別予測ツール（GenderEstimate）.xlsm

# 6. 「使い方」シートの作成
- サンプル画像を参考に、1つ目のシートに「使い方」シートを作成する
- 配置するコマンドボタンは、開発メニュー ⇒ 挿入 から「コマンドボタン（ActiveX コントロール）」を選択すること
- 「開発メニュー」が表示されていない場合は、事前にメニュー表示するようExcel設定の変更を済ませておくこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/913fb7a4-c4dc-367f-7c2c-dec3d9cf989f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/0421d97c-0d81-b5b0-02f4-4ff854c42df4.png)

# 7. 「分析データ」シートの作成
- サンプル画像を参考に、2つ目のシートに「分析データ」シートを作成する
- テスト用の名前データは、各自でご用意ください
- 必ず「No.」、「名（必須）」、「めい（必須）」の列に値を設定してください
- 「予想結果（ブランク）」の列は、未設定で結構です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/208bfb0b-e414-fc48-e957-0be8ead1b065.png)

# 8. 「標準モジュール」の作成
- VBAを開き、「標準モジュール（Module1.bas）」を新規挿入する
- 「標準モジュール（Module1.bas）」に、参考文献に記載されている「GenderEstimate関数」を貼り付ける（1行目の関数目コメント以外、ソースプログラムの変更はおこなっていません）
- 「GenderEstimate関数」を貼り付ける際は、文字化けしないよう文字コード（SJISでの貼り付け）に気を付けてください

- 参考文献：[VBAマクロ向け関数。GenderEstimate。漢字の名前とふりがなから、性別を推定する関数](https://gist.github.com/lunark/4344906)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/372bcb04-5801-0634-432c-c6111720eab3.png)

```plaintext:引数一覧
GenderEstimate(strMK As String, Optional strMF As String)
第1引数：名（漢字）　…英語は自動的に無視しますが、中国語は一部反応してしまいます
第2引数：名（ふりがな）　…カタカナも可
返り値：性別（"男性" or "女性"）
```


# 9. 「Sheets1（Sheet1.cls）」の作成
- VBAを開き、「Sheets1（Sheet1.cls）」の実行ボタンクリックイベント「Private Sub CommandButton1_Click()」にプログラムを貼り付ける

```vb:Sheet1.cls
' 実行ボタンクリック
Private Sub CommandButton1_Click()
    ' 変数宣言
    Dim iRowStart As Integer        ' 先頭行
    Dim iRowCount As Integer        ' 行数
    Dim iRowEnd As Integer          ' 最終行
    Dim iColStart As Integer        ' 先頭列
    Dim iColCount As Integer        ' 列数
    Dim iColEnd As Integer          ' 最終列
    Dim iRowCurrent As Integer      ' カレント行の番号
    Dim strMK As String             ' 名（漢字）
    Dim strMF As String             ' めい（ひらがな）
    Dim sResultGender As String     ' 予測結果性別
    
    ' 定数宣言
    Const iSheetsNo As Integer = 2  ' 対象シートの番号
    Const iColMK As Integer = 3     ' 名（漢字）の列番号
    Const iColMF As Integer = 5     ' めい（ひらがな）の列番号
    Const iColResultGender As Integer = 7     ' 予測結果性別の列番号
    
    ' 画面描画の一時停止
    Application.ScreenUpdating = False
    
    ' デバッグログの出力
    Debug.Print "START LOG：" & Format(Now, "yyyy/mm/dd hh:nn:ss")
    
    ' アクティブシートの移動
    Sheets(iSheetsNo).Select
    
    ' アクティブシートの変更
    Worksheets(iSheetsNo).Activate
    
    ' 行数の取得
    iRowStart = ActiveSheet.UsedRange.Row
    iRowCount = ActiveSheet.UsedRange.Rows.Count
    iRowEnd = iRowCount + iRowStart - 1
    iColStart = ActiveSheet.UsedRange.Column
    iColCount = ActiveSheet.UsedRange.Columns.Count
    iColEnd = iColCount + iColStart - 1
    
    ' デバッグログの出力
    Debug.Print "iRowStart = " & iRowStart
    Debug.Print "iRowCount = " & iRowCount
    Debug.Print "iRowEnd   = " & iRowEnd
    Debug.Print "iColStart = " & iColStart
    Debug.Print "iColCount = " & iColCount
    Debug.Print "iColEnd   = " & iColEnd

    '2行目から最終行まで繰り返し
    For iRowCurrent = 2 To iRowEnd
        ' 予測結果性別のクリア
        sResultGender = ""
        
        ' 名（漢字）、めい（ひらがな）の取得
        strMK = Worksheets(iSheetsNo).Cells(iRowCurrent, iColMK).Value
        strMF = Worksheets(iSheetsNo).Cells(iRowCurrent, iColMF).Value
        
        ' 名前性別予測関数の呼び出し
        sResultGender = GenderEstimate(strMK, strMF)
        
        ' デバッグログの出力
        Debug.Print "No." & iRowCurrent - 1 & " " & strMK & "（" & strMF & "）は『" & sResultGender; "』かな？"
    
        ' 予測結果性別をセルに反映
        Worksheets(iSheetsNo).Cells(iRowCurrent, iColResultGender).Value = sResultGender
    
    Next

    ' 画面描画の再開
    Application.ScreenUpdating = True
    
    ' デバッグログの出力
    Debug.Print "END   LOG：" & Format(Now, "yyyy/mm/dd hh:nn:ss")
    Debug.Print "----------"


End Sub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/c86257d3-3308-a846-cc97-91b8dc96d488.png)

# 10. Excelファイルを保存する
- 必ずExcelファイルを保存しましょう
- VBA実行時にエラーが発生すると、保存していなかった編集内容が消えることがあります

# 11. テスト実行
- Excelの「使い方」シートを開き、「実行」ボタンをクリックしてみましょう
- 作成に問題がなければ、自動的に「分析データ」シートが表示され、「予測結果（ブランク」の列に予測結果が表示されます
- 実行時のデバッグログは、VBAの「イミディエイト」ウィンドウに出力されていますので、デバッグ時にご参照ください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/a760e349-e808-5bf0-ddcd-62cba398f6d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/71ea6c69-24ad-bcde-7e3b-e5933932cb15.png)

---

# 12. おわりに
いかがでしたでしょうか？Excel VBA で 名前性別予測（GenderEstimate）をすることができたのではないかと思います
今回の記事が、みなさまの学習の参考になれば幸いです

2023/03/04 TAKAHIRO NISHIZONO

---