Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6795 / 13644 ツリー ←次へ | 前へ→

【43063】文字列から数字だけを半角数字で抜き出す... 無人島 06/10/1(日) 9:29 質問[未読]
【43064】Re:文字列から数字だけを半角数字で抜き出... ぱっせんじゃー 06/10/1(日) 10:02 発言[未読]
【43065】Re:文字列から数字だけを半角数字で抜き出... かみちゃん 06/10/1(日) 10:12 回答[未読]
【43066】Re:文字列から数字だけを半角数字で抜き出... Hirofumi 06/10/1(日) 10:18 回答[未読]
【43078】Re:文字列から数字だけを半角数字で抜き出... yata 06/10/1(日) 17:41 回答[未読]

【43063】文字列から数字だけを半角数字で抜き出す...
質問  無人島  - 06/10/1(日) 9:29 -

引用なし
パスワード
   エクセルを初めて一週間程度でして、VBをちょこっとかじった程度なので申し訳ないですが詳しくお願いします。

文字列から数字だけ抜き出して半角数字にする方法を探しているのですが、どうしてもうまくいきません

例えば
A1 電話番号:012-345-6789
から
B1 0123456789

A1 郵便番号: 〒999−8888
から
B1 9998888"

A1 (000) 11-2222
から
B1 000112222

などです。

元の数字自体は半角か全角かは決まっておらず、数字の位置や数も完全ランダムで:の後に全角や半角のスペースがある場合もあったりします。また数字の間の「-」も「:」も全角か半角か決まっておらず、ない場合もあります。決まってる事は数字の最後の後には文字が入らないくらいです。

エクセルのSUBSTITUTE関数やASC関数である程度まではうまくいくのですが確実ではありませんでした。また過去ログ等を参照したり他サイトをあたってみましたが090だと最初の0が抜けてしまって90になったり完全にはうまくいきません。
どのようにすればよいかどうかご指導お願いします。

【43064】Re:文字列から数字だけを半角数字で抜き...
発言  ぱっせんじゃー  - 06/10/1(日) 10:02 -

引用なし
パスワード
   とりあえずのサンプルです。

Sub test()
Dim c As Range
Dim i As Long
Dim j As Long
Dim s As String
 For Each c In Selection
  s = ""
  j = 0
  For i = 1 To Len(c)
  If IsNumeric(Right(Left(c.Value, i), 1)) = True Then
    j = j + 1
    If j = 1 Then s = "'"
    s = s & StrConv(Right(Left(c.Value, i), 1), 8)
  End If
  Next i
  If s <> "" Then c.Offset(, 1).Value = s
 Next
End Sub

【43065】Re:文字列から数字だけを半角数字で抜き...
回答  かみちゃん  - 06/10/1(日) 10:12 -

引用なし
パスワード
   こんにちは。かみちゃん です。

ぱっせんじゃーさんからコメントがついていますが、私も書いてしまいましたので
せっかくなので提示させていただきます。

>文字列から数字だけ抜き出して半角数字にする方法

数字だけをすべて抜き出した後に、最後に半角に変換して、文字列にする接頭辞
'(アポストロフィ)を付けています。
また、A1からA列の最後のセルまでを処理するようなコードです。
(この点は、処理対象範囲をあらかじめ選択してから実行する、ぱっせんじゃー
さんのコードと異なるところです。)

Sub Macro1()
 Dim LastCell As Range
 Dim c As Range
 Dim i As Integer
 Dim strData As String

 Set LastCell = Cells(Rows.Count, 1).End(xlUp)
 For Each c In Range("A1", LastCell)
  strData = ""
  For i = 1 To Len(c.Value)
   If IsNumeric(Mid(c.Value, i, 1)) Then
    strData = strData & Mid(c.Value, i, 1)
   End If
  Next i
  c.Value = "'" & StrConv(strData, vbNarrow)
 Next
End Sub

【43066】Re:文字列から数字だけを半角数字で抜き...
回答  Hirofumi  - 06/10/1(日) 10:18 -

引用なし
パスワード
   こんなかな?

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim strResult() As String
  
  Dim strProm As String
  
  'Listの左上隅セル位置を基準として設定(列見出しの最左セル位置)
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データが無い場合
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データを配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  ReDim strResult(1 To lngRows, 1 To 1)
  For i = 1 To lngRows
    strResult(i, 1) = NumberConv(vntData(i, 1))
  Next i
  
  rngList.Offset(, 1).Resize(lngRows).Value = strResult
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  
  MsgBox strProm, vbInformation
  
End Sub

Private Function NumberConv(ByVal vntValue As Variant) As String

  Const cstrNumb As String = "0123456789"

  Dim i As Long
  Dim strResult As String
  Dim strChr As String
  
  If vntValue = "" Then
    Exit Function
  Else
    vntValue = StrConv(vntValue, vbNarrow)
  End If
  
  
  For i = 1 To Len(vntValue)
    strChr = Mid(vntValue, i, 1)
    If InStr(1, cstrNumb, strChr, vbBinaryCompare) > 0 Then
      strResult = strResult & strChr
    End If
  Next i
  
  NumberConv = strResult
        
End Function

【43078】Re:文字列から数字だけを半角数字で抜き...
回答  yata  - 06/10/1(日) 17:41 -

引用なし
パスワード
   こんばんは
皆さんの簡潔なコードは大変参考になります。
スマートでないですが私も作ってみました
SUBSTITUTE関数ならエラー対策が要らないと聞いていましたので。
セルが空白でも出来そうです。
接頭辞の付け方は皆さんのをまねました。

Sub 数字抽出()
Dim Data As Range
Dim 文字列 As String, moji As String,suuji As String

Set Data = Range(Cells(1, 1), Range("A65536").End(xlUp))
For Each myRng In Data
文字列 = StrConv(myRng, 8)  '半角文字にしておく

'文字列から数字だけを消す
moji = 文字列
For i = 0 To 9
 moji = Application.WorksheetFunction.Substitute(moji, i, "")
Next

R = Len(moji)  '数字を除いた記号や文字の数
suuji = 文字列
'元の文字列から文字を消す
For i = 1 To R
suuji = Application.WorksheetFunction.Substitute(suuji, Mid(moji, i, 1), "")
Next
'残った数字部分を表示
myRng.Offset(, 1) = "'" & suuji
Next myRng
Set myRng = Nothing
End Sub

6795 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free