特定文字列を取り出すには?


はろ  2004-08-06 21:59:54  No: 115445  IP: [192.*.*.*]

DBへの住所データの取り込みで悩んでいます。
電話番号の取り込み時に「電話番号:xxx-xxx-xxx」という
データがあり、このデータの「xxx-xxx-xxx」のみを
取り出したいのです。
上記以外のケースも考えられるので数値とハイフンのみを
取り出したいのですが方法が分かりません。

開発環境はVB6+XPです。
宜しくお願い致します。

編集    削除
初心者999  2004-08-06 22:09:42  No: 115446  IP: [192.*.*.*]

Left関数やRight関数又はMid関数を使えば可能と思われます。
上記の場合だと、Right$("電話番号:xxx-xxx-xxx", 11)
とすればxxx-xxx-xxxだけが取得出来ます。

編集    削除
ふむ  2004-08-06 22:22:24  No: 115447  IP: [192.*.*.*]

splitで区切りを:にすればいいのでは?

編集    削除
nanashi  2004-08-06 22:38:42  No: 115448  IP: [192.*.*.*]

InStr関数で:の位置を取得してMidで取り出すって手もある。

編集    削除
特攻隊長まるるう  2004-08-06 22:39:54  No: 115449  IP: [192.*.*.*]

>上記以外のケースも考えられるので数値とハイフンのみを
>取り出したいのですが方法が分かりません。
その『上記以外のケース』にどんなものがあるかが重要なんですが?(^^;)
数値とハイフンのみ取り出す方法は 初心者999さんのあげてくれた
関数なんかを使えば可能ですが、例えば
 ○○区△△マンション301
の 301 とか
 郵便番号:999-8877
  ○○町333-11番地
の 999-8877 とか 333-11 も数値とハイフンのみなんですが?
電話番号と識別できる必要がありますよね?そのあたりをもっと
考えていただかないと誰にも実現できないと思います。

編集    削除
はろ  2004-08-06 23:09:37  No: 115450  IP: [192.*.*.*]

みなさんありがとうございます。
具体的にはCSVデータの取り込みになりますので、電話番号のみが
入っていることが前提となります。
ただ、電話番号以外のゴミが入っているケースがありましたので
電話番号だけを取り出したいのです。

そこで、以下のような方法でやってみたのですが、
電話番号 = "tel  xxx-xxxx-xxxx"
    '0〜9と-()以外は除去
    For liCnt = 1 To Len(電話番号)
        Select Case Mid(電話番号, liCnt, 1)
        
        Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "(", ")"
            電話番号 = 電話番号
        Case Else
            電話番号 = Replace(電話番号, Mid(電話番号, liCnt, 1), "")
        End Select
    Next liCnt

結果は「e xxx-xxxx-xxxx」になってしまいます。
liCntの値が一つ前の処理よりも少なくなるとFor文ではダメなんでしょうか??

編集    削除
特攻隊長まるるう  2004-08-07 00:36:12  No: 115451  IP: [192.*.*.*]

削除したぶん引けばええやん??
[VB6.0]
Private Sub Command1_Click()
    Dim 電話番号 As String
    Dim wDeleteCount As Integer
    Dim wMidIndex As Integer
    電話番号 = "tel  111-2345-9999"
    wDeleteCount = 0
    
    '0〜9と-()以外は除去
    For liCnt = 1 To Len(電話番号)
        wMidIndex = liCnt - wDeleteCount
        
        Select Case Mid(電話番号, wMidIndex, 1)
        
        Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "(", ")"
            電話番号 = 電話番号
        Case Else
            電話番号 = Replace(電話番号, Mid(電話番号, wMidIndex, 1), "")
            wDeleteCount = wDeleteCount + 1
        End Select
    Next liCnt
    MsgBox 電話番号
End Sub

編集    削除
はろ  2004-08-07 00:50:04  No: 115452  IP: [192.*.*.*]

特攻隊長まるるうさん、ありがとうございました。
よく考えれば仰るとおりですね。

編集    削除
nanashi  2004-08-07 01:00:26  No: 115453  IP: [192.*.*.*]

Do〜Loopを使うって手もある。

Private Sub Command1_Click()
    Dim sTel$, sBuff As String
    Dim lPos As Long
    
    sTel = "tel  111-2345-9999"
    
    lPos = 1
    Do Until (lPos > Len(sTel))
        sBuff = Mid$(sTel, lPos, 1)
        
        If Not (sBuff Like "[0-9()-]") Then
            sTel = Left$(sTel, lPos - 1) & Mid$(sTel, lPos + 1)
        Else
            lPos = lPos + 1
        End If
    Loop
    
    Debug.Print sTel
End Sub


※普段あんまりLike使わないから書き方間違ってるかも?
  一応動きますが、詳しい方フォロー願いますm(__)m

編集    削除
特攻隊長まるるう  2004-08-07 01:29:35  No: 115454  IP: [192.*.*.*]

過去 ListView の Item 削除なんかでサンプル載せたけど、
ループを逆に回すってのも定番ですよねぇw
[VB6.0]
Private Sub Command1_Click()
    Dim 電話番号 As String
    電話番号 = "tel  111-2345-9999"
    
    '0〜9と-()以外は除去
    For liCnt = Len(電話番号) To 1 Step -1
        
        Select Case Mid(電話番号, liCnt, 1)
            Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "(", ")"
                電話番号 = 電話番号
            Case Else
                電話番号 = Replace(電話番号, Mid(電話番号, liCnt, 1), "")
        End Select
    Next liCnt
    
    MsgBox 電話番号
End Sub

…解決したなら解決マークつけて欲しい(TT)

編集    削除