[[20200825093511]] 『市外局番に自動ハイフン』(まるこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『市外局番に自動ハイフン』(まるこ)

固定電話の市外局番に自動ハイフンをユーザーフォーム上でふりたいので、くみました。
2桁、3桁まで対応してますが、4桁、5桁にも対応したいのですが、なにかありますか。よろしくお願いします。

Private Sub TextBox固定電話_Change()

   Dim tempresa_tel As String, tempresa_tel2 As String, tempresa_tel3 As String
   Dim i As Integer, j As Integer, n As Integer
   Dim ddd1 As String, ddd2 As String
   tempresa_tel = TextBox固定電話.Value
   TextBox固定電話.MaxLength = 12

   i = Len(tempresa_tel)

   For j = 1 To i
       If IsNumeric(Mid(tempresa_tel, j, 1)) Then
           tempresa_tel2 = tempresa_tel2 & Mid(tempresa_tel, j, 1)
       End If
   Next

   i = Len(tempresa_tel2)

   For j = 1 To i
       tempresa_tel3 = tempresa_tel3 & Mid(tempresa_tel2, j, 1)
       ddd1 = Left(tempresa_tel, 2)
       If ddd1 = "03" Or ddd1 = "06" Then
           If j = 3 Or j = 7 Then
               n = Len(tempresa_tel3) - 1
               tempresa_tel3 = Left(tempresa_tel3, n) & "-" & Right(tempresa_tel3, 1)
           End If
       ElseIf ddd1 <> "03" Or ddd1 <> "06" Then
           If j = 4 Or j = 7 Then
               n = Len(tempresa_tel3) - 1
               tempresa_tel3 = Left(tempresa_tel3, n) & "-" & Right(tempresa_tel3, 1)
           End If
       End If
   Next

   TextBox固定電話.Value = tempresa_tel3

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows8 >


4桁、5桁の場合、頭3桁までは3桁の市外局番と同じなので、ロジックでは判断が難しいでしょう。 If文で判定するのは大変なので、文字長の長い順に並べ替えた市外局番リストをシートにでも定義しておき、これとマッチングする事で桁数判定してはいかがでしょうか。
(以下は2014年時点の一覧。最新は総務省のページから得る事になるでしょう)
https://www.wdic.org/w/WDIC/%E5%B8%82%E5%A4%96%E5%B1%80%E7%95%AA
(???) 2020/08/25(火) 10:14

そうなると、どういった桁数判定にすれば問題なく動作しますでしょうか。
(まるこ) 2020/08/25(火) 10:35

下記で公開しているツールを利用すれば全国の電話番号を編集できます。

幾つかの関数を提供していますが、実際には PhoneNumber 関数ひとつで事足ります。

AddinBox/Tips29: JavaScript で電話番号(局番)の検証/編集
http://addinbox.sakura.ne.jp/Excel_Tips29.htm

VBA用ソースコード閲覧
http://addinbox.sakura.ne.jp/AreaCode/ColorSource_VBA.htm

リンク『ダウンロード』の場所に、VBA 用インポートモジュールを用意していますので、
それをダウンロードして自ブックにインポートすれば、すぐに使えます。

尚、他にアドインブックを用意していますし、
kt関数アドイン( ktPhoneNumber ) / kt電話郵便アドイン( ktTelEdit )でも
同じ機能を提供しています。

(AddinBox 角田) 2020/08/25(火) 11:50


こんな感じかな・・・

Private Sub TextBox固定電話_Exit((ByVal Cancel As MSForms.ReturnBoolean)
 Dim Resp As Variant

  Dim TelNumber As String

 If (TextBox固定電話.Value = "") Then
  Exit Sub
 End If

 ' ハイフン付き入力の場合に、区切り位置が正しいかチェック
 Resp = PhoneNumber(TextBox固定電話.Value, "V")
 Select Case Resp
  Case "0"
   ' 区切り位置不正等、ハイフン編集し直して更新
  Case "1"
   ' 区切り位置 正常
   Exit Sub
  Case "2"
   ' 数字のみ入力⇒ハイフン編集
 End Select

 TelNumber = Replace(TextBox固定電話.Value, "-", "")
 TelNumber = Replace(TelNumber, "(", "")
 TelNumber = Replace(TelNumber, ")", "")

 ' ハイフン編集
 Resp = PhoneNumber(TextBox固定電話.Value, "F1")
 If (Resp = "Phone Error") Then
  Beep
  Cancel = True
  Exit Sub
 Else
  TextBox固定電話.Value = Resp
 End Sub
End Sub

(AddinBox 角田) 2020/08/25(火) 12:16


間違い2箇所

Private Sub TextBox固定電話_Exit((ByVal Cancel As MSForms.ReturnBoolean)
左括弧が余計

 Else
  TextBox固定電話.Value = Resp
 End Sub  ← End If
End Sub

(AddinBox 角田) 2020/08/25(火) 12:22


Sheet1のA列を「文字列」にしておき、市外局番の桁数が多い順で、5〜2桁全てが定義されているものとします。
現在の、1文字入力する度に判定するインターフェースや、変数宣言を活かした場合、以下のような感じでしょうかね。
 Private Sub TextBox固定電話_Change()
    Dim tempresa_tel As String, tempresa_tel2 As String, tempresa_tel3 As String
    Dim i As Integer, n As Integer
    Dim ddd1 As String

    tempresa_tel = TextBox固定電話.Value

    For i = 1 To Len(tempresa_tel)
        If IsNumeric(Mid(tempresa_tel, i, 1)) Then
            tempresa_tel2 = tempresa_tel2 & Mid(tempresa_tel, i, 1)
        End If
    Next i

    With Sheets("Sheet1")
        n = Len(tempresa_tel2)
        For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
            ddd1 = .Cells(i, "A").Text
            If Len(ddd1) < n Then
                If tempresa_tel2 Like ddd1 & "*" Then
                    If 6 < n Then
                        tempresa_tel3 = ddd1 & "-" & Mid(tempresa_tel2, Len(ddd1) + 1, 6 - Len(ddd1)) & "-" & Mid(tempresa_tel2, 7)
                    Else
                        tempresa_tel3 = ddd1 & "-" & Mid(tempresa_tel2, Len(ddd1) + 1)
                    End If
                    TextBox固定電話.Value = tempresa_tel3
                    Exit For
                End If
            End If
        Next i
    End With
 End Sub
(???) 2020/08/25(火) 14:04

市外局番だけでは不十分で、ところによっては、
市内局番の最後の桁まで見ないと決まらないところもあります。
極僅かですけどね・・・

[ 09934x xxxx ]
 0993-40-FGHJ
 0993-41-FGHJ
 099-343-FGHJ
 099-345-FGHJ
 099-347-FGHJ
 0993-49-FGHJ

0993 ⇒ 099 の順でチェックしても、
全部が[0993-4x-xxxx]の方でヒットしてしまいます。

(AddinBox 角田) 2020/08/25(火) 15:59


令和2年の一覧を見ると…、ホントだ、0993-40、0993-41、0993-42、0993-44 とかなのに、099-331、099-343、099-345、099-347 ってなってますね。 鹿児島、統一されていないんだ…。 都道府県市町村の名前もそうですが、自動処理しやすいよう、統一して欲しいですねぇ。 感染者数報告をFAXで行い、手集計している国ですから、こんなものでしたか。

A列定義だけでは鹿児島対応できないので、6桁判定にして、B列で桁数定義するとかしないと、完全対応できないですね。
(???) 2020/08/25(火) 16:34


何も反応が無いのは悲しいね (T_T)

上手くいったのか、いかなかったのか・・・
反応を貰えるのが回答者の励みになるんだけど・・・

もう無くなったけど、エクセルファンクラブの頃から、
何も手を入れなくても、直ぐにそのまま使えるサンプルコードを
提示すると、何の音沙汰も無く過去ログへ消えていくことが多いよね・・・

すみません、単なる愚痴です。

(AddinBox 角田) 2020/08/30(日) 17:29


下からすみません。

角田さんのサイトのAddinBox、以前よりいろいろと参考にさせていただいていました。
こちらで直接回答されているのに今気が付き、ちょっと感動してついコメントしてしまいました。
多くの有用な情報を提供いただいて助かったことが多くあり、本当にありがとうございました。

質問に関係ないお話で失礼いたしましたm(_ _)m
(QS) 2020/08/30(日) 17:44


> 以前よりいろいろと参考にさせていただいていました。
ありがとうございます。

そういった声が聞こえるのが、続ける励みになります♪

(AddinBox 角田) 2020/08/30(日) 17:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.