VBA_電話番号フォーマット成形(ハイフン付与)

電話番号のハイフンを、正確に付与するExcelのVBAコードだよん。
簡単に誰でも実行＆実装可能なExcelVBAでは作成している人見かけないし、いても文字数からハイフンを入れる方法は転がってるけど正確には付与されないし、有料なら販売しているけど無料でなんとかならないかなということから作成しちゃった！！

結構、電話番号のハイフン付与に苦労してる人多いのでは？

あーちなみに、ざっくり作成したので実務で使用するならキレイに色々修正してくださいな！
<br/>
まずは、完成形サンプルコード！
```
Sub FormatHaihun()

    Dim ws As Worksheet ' 電話番号が記載されているシート
    Dim masterSheet As Worksheet ' 市外局番リストが記載されているシート
    Dim phoneColumn As Range ' 電話番号が含まれるA列全体の範囲
    Dim phoneNumber As String ' 電話番号
    Dim formattedNumber As String ' ハイフン付与電話番号
    Dim cityCode As String ' 市外局番
    Dim restNumber As String ' 市外局番を抜いた残りの番号
    Dim cell As Range ' 対象電話番号のセル
    
    Dim masterArray() As Variant ' 市外局番のマスタ配列
    Dim i As Long ' ループカウンタ
    Dim maxCityCodeLength As Long ' 市外局番の最大文字数

    ' データがあるシートと市外局番マスタのシートを定義
    Set ws = ThisWorkbook.Sheets("PhoneNumbers") ' 電話番号があるシート
    Set masterSheet = ThisWorkbook.Sheets("CodeMaster") ' 市外局番リストがあるシート

    ' B列をクリア
    ws.Columns("B").ClearContents

    ' ヘッダーを設定
    ws.Cells(1, "A").Value = "電話番号貼り付け"
    ws.Cells(1, "B").Value = "ハイフン付与電話番号"

    ' 電話番号と市外局番の範囲を定義
    Set phoneColumn = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
    masterArray = masterSheet.Range("A1:A" & masterSheet.Cells(masterSheet.Rows.Count, "A").End(xlUp).Value)

    ' 市外局番リストの中で最大文字数を求める
    maxCityCodeLength = 0
    For i = LBound(masterArray, 1) To UBound(masterArray, 1)
    
        If Len(masterArray(i, 1)) > maxCityCodeLength Then
            maxCityCodeLength = Len(masterArray(i, 1))
        End If
        
    Next i

    ' 電話番号をフォーマットしてB列に出力
    For Each cell In phoneColumn
    
        ' 電話番号を文字列として取得し、全角から半角に変換
        phoneNumber = CStr(cell.Value)
        phoneNumber = StrConv(phoneNumber, vbNarrow) ' 全角を半角に変換

        ' 不要な記号を除去
        phoneNumber = Replace(phoneNumber, "(", "")
        phoneNumber = Replace(phoneNumber, ")", "")
        phoneNumber = Replace(phoneNumber, "-", "")

        cityCode = ""
        formattedNumber = ""

        ' 最大長から順に市外局番を検索
        For i = maxCityCodeLength To 1 Step -1
        
            For j = LBound(masterArray, 1) To UBound(masterArray, 1)
            
                If Len(masterArray(j, 1)) = i Then
                
                    If Left(phoneNumber, i) = masterArray(j, 1) Then
                        cityCode = masterArray(j, 1)
                        Exit For
                    End If
                    
                End If
                
            Next j
            
            If cityCode <> "" Then Exit For
            
        Next i

        ' 市外局番が見つかった場合、ハイフンを挿入
        If cityCode <> "" Then
        
            ' 市外局番の次の文字
            restNumber = Mid(phoneNumber, Len(cityCode) + 1)

            ' 市外局番 + 残りの番号を分割してハイフンを挿入
            If Len(restNumber) > 4 Then
                ' 市外局番 + 残りの番号-4文字 + 残り番号の右4文字
                formattedNumber = cityCode & "-" & Left(restNumber, Len(restNumber) - 4) & "-" & Right(restNumber, 4)
            Else
                formattedNumber = cityCode & "-" & restNumber
            End If
            
        Else
        
            ' 市外局番が見つからなかった場合はそのまま
            formattedNumber = phoneNumber
            
        End If

        ' フォーマット済みの番号をB列に書き込む
        cell.Offset(0, 1).Value = formattedNumber
        
    Next cell

    MsgBox "電話番号にハイフン付与完了"
    
End Sub

```
<h1>準備するシート</h1>
<dl>
  <dt>CodeMaster</dt>
  <dd>・市外局番マスタ<br/>　A列に市外局番全て記載</dd>
  <dt>PhoneNumbers</dt>
  <dd>・成形用シート<br/>　A列に成形前電話番号<br/>　B列に成形後電話番号</dd>
</dl>

<h1>市外局番マスタ</h1>
▼総務省
<a href="https://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html#kotei-denwa">ここから</a>
<br/>
▼電話帳ナビ
<a href="https://www.telnavi.jp/landline/">ここから</a>

上記どちらかから CodeMaster シートのA列に転記してください。


ちなみに下記は、面倒な人向けコピー用(※202411閲覧時)
```
市外局番	
0120	フリーダイヤル
0800	フリーダイヤル
050	IP電話
070	携帯電話
080	携帯電話
090	携帯電話
020	IoT/PHS（現在はIoT用途）
0570	ナビダイヤル
0990	テレドーム/情報提供ダイヤル
104	電話番号案内
110	警察
113	電話の故障受付
115	電報受付
116	加入電話の相談受付
117	時報
118	海上保安庁
119	消防
171	災害用伝言ダイヤル
177	天気予報
188	消費者ホットライン
189	児童相談所
011	
0123	
0124	
0125	
0126	
01267	
0133	
0134	
0135	
0136	
01372	
01374	
0137	
01377	
0138	
01392	
0139	
01397	
01398	
0142	
0143	
0144	
0145	
01456	
01457	
0146	
01466	
0152	
0153	
0154	
01547	
015	
0155	
01558	
0156	
01564	
0157	
0158	
01586	
01587	
0162	
01632	
01634	
01635	
0163	
0164	
01648	
0165	
01654	
01655	
01656	
01658	
0166	
0167	
0172	
0173	
0174	
0175	
0176	
017	
0178	
0179	
0182	
0183	
0184	
0185	
0186	
0187	
018	
0191	
0192	
0193	
0194	
0195	
019	
0197	
0198	
022	
0220	
0223	
0224	
0225	
0226	
0228	
0229	
0233	
0234	
0235	
023	
0237	
0238	
0240	
0241	
0242	
0243	
0244	
024	
0246	
0247	
0248	
025	
0250	
0254	
0255	
0256	
0257	
0258	
0259	
0260	
0261	
026	
0263	
0264	
0265	
0266	
0267	
0268	
0269	
0270	
027	
0274	
0276	
0277	
0278	
0279	
0280	
0282	
0283	
0284	
0285	
028	
0287	
0288	
0289	
0291	
029	
0293	
0294	
0295	
0296	
0297	
0299	
03	
0422	
042	
0428	
04	
043	
0436	
0438	
0439	
044	
045	
0460	
046	
0463	
0465	
0466	
0467	
0470	
047	
0475	
0476	
0478	
0479	
048	
0480	
049	
0493	
0494	
0495	
04992	
04994	
04996	
04998	
052	
053	
0531	
0532	
0533	
0536	
0537	
0538	
0539	
054	
0544	
0545	
0547	
0548	
0550	
0551	
055	
0553	
0554	
0555	
0556	
0557	
0558	
0561	
0562	
0563	
0564	
0565	
0566	
0567	
0568	
0569	
0572	
0573	
0574	
0575	
0576	
05769	
0577	
0578	
058	
0581	
0584	
0585	
0586	
0587	
059	
0594	
0595	
0596	
0597	
05979	
0598	
0599	
06	
072	
0721	
0725	
073	
0735	
0736	
0737	
0738	
0739	
0740	
0742	
0743	
0744	
0745	
0746	
07468	
0747	
0748	
0749	
075	
0761	
076	
0763	
0765	
0766	
0767	
0768	
0770	
0771	
0772	
0773	
0774	
077	
0776	
0778	
0779	
078	
0790	
0791	
079	
0794	
0795	
0796	
0797	
0798	
0799	
082	
0820	
0823	
0824	
0826	
0827	
0829	
083	
0833	
0834	
0835	
0836	
0837	
0838	
08387	
08388	
08396	
0845	
0846	
0847	
08477	
0848	
084	
08512	
08514	
0852	
0853	
0854	
0855	
0856	
0857	
0858	
0859	
086	
0863	
0865	
0866	
0867	
0868	
0869	
0875	
0877	
087	
0879	
0880	
0883	
0884	
0885	
088	
0887	
0889	
0892	
0893	
0894	
0895	
0896	
0897	
0898	
089	
092	
0920	
093	
0930	
0940	
0942	
0943	
0944	
0946	
0947	
0948	
0949	
09496	
0950	
0952	
0954	
0955	
0956	
0957	
095	
0959	
096	
0964	
0965	
0966	
0967	
0968	
0969	
0972	
0973	
0974	
097	
0977	
0978	
0979	
098	
0980	
09802	
0982	
0983	
0984	
0985	
0986	
0987	
09912	
09913	
099	
0993	
0994	
0995	
0996	
09969	
0997	
```


<h1>コード内容</h1>
ちょっと眠いので一言で。<br/>
市外局番リストの中で最大文字数の数字分を対象に、マスタと成形前の電話番号をそれぞれその数字分で比較して一通り終わったら、－1してまた比較・・・を繰り返してるよ！
<h1>使用方法</h1>
1.CodeMaster シートに上記市外局番をA列に貼り付け<br/>
2.PhoneNumbers シートのA列に電話番号入力<br/>
3.マクロ実行でB列にハイフン付与
<br/><br/><br/>


Excel VBAはエンジニア業界だと見下されている言語の一つだけど、ある程度のことなら何でもできる便利な言語だよ！
有料に頼らずとも、皆様のお力になれたらいいな。
そんなわけでまた！