• ベストアンサー

文字列から数値を抽出したいのですが・・。

文字列から数値(integer型)を抽出したいのですが、うまくいきません。 val関数だと文字の途中の数値が判別できないし、困っています。 よろしくお願いします。 ※以下、文字列と数値の関係です。 ・"文字列" → 抽出したい数値  "0k,abc,5k,abc3.0" → 0530  "abc()_3t" → 3

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

「プロジェクト」-「参照の追加」-「COM」で Microsoft VBScript Regular Expressions 5.5 を選択してOK。 コマンドボタン3での実行できたコード。  Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click   Dim re As New VBScript_RegExp_55.RegExp   Dim matchs As VBScript_RegExp_55.MatchCollection   Dim matchstr As VBScript_RegExp_55.Match   'Dim submatch As VBScript_RegExp_55.SubMatches   Dim v() As String, x() As String   Dim i As Integer   ReDim v(0 To 4), x(0 To 4)   v(0) = "abc012()_001t"   v(1) = "abc3()_2t"   v(2) = "abc5()_3t"   v(3) = "abc6()_4t"   v(4) = "abc7()_5t"   re.Pattern = "\D*(\d+)\D*"   re.Global = True   For i = 0 To UBound(v)       If re.Test(v(i)) = True Then          matchs = re.Execute(v(i))          For Each matchstr In matchs              x(i) = x(i) & matchstr.SubMatches.Item(0)          Next          Debug.Print(v(i) & " " & x(i))       End If  Next End Sub 初めの宣言方法も違うようですね。 >  ReDim v(0 To 4), x(0 To 4) 配列は0からのようです。 (なんせ2005は初めたばかりで。ExcelVBAならよくやってますけど) ご参考になれば。

shishsi
質問者

お礼

お礼が遅れてすみません。 わざわざ、実行までして確かめてくれたんですね。。申し訳ないです。。 とても助かりました!ありがとうございます!!

その他の回答 (4)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

VB6.0で参考URLの参照設定を行なった後で、 コマンドボタンを押すとイミディエイトウィンドウに書き出してる サンプルです。 Private Sub Command1_Click()  Dim re As New RegExp  Dim matchs As MatchCollection  Dim matchstr As Match  Dim submatch As SubMatches  Dim v() As String, x() As String  Dim i As Integer  ReDim v(1 To 5), x(1 To 5)  v(1) = "abc012()_001t"  v(2) = "abc3()_2t"  v(3) = "abc5()_3t"  v(4) = "abc6()_4t"  v(5) = "abc7()_5t"  re.Pattern = "\D*(\d+)\D*"  re.Global = True    For i = 1 To UBound(v)      If re.Test(v(i)) = True Then         Set matchs = re.Execute(v(i))         For Each matchstr In matchs             Set submatch = matchstr.SubMatches             x(i) = x(i) & submatch.Item(0)         Next         Debug.Print v(i), x(i)      End If  Next End Sub ご参考になれば。

shishsi
質問者

補足

回答ありがとうございます。 しかし、実はVB2005を扱っているんです。 なので、いただいたプログラムが正しく動きませんでした。 VB2005で実行するとするとどうプログラムすればよいのでしょうか? 何度もすみません。。。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

>しかし、実は僕はまだVB初心者なためか ところでVBとは、VB6.0?VB.NET(2002~2008)?或いはVBA? のどれでしょう?

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

ところで数値だとすると、 >"0k,abc,5k,abc3.0" → 0530 この場合は530になってしまいますが。 数字(文字列)の事ですか?

shishsi
質問者

補足

数値だと、0530は530になってしまうんですね。誤算でした。 ご指摘ありがとうございます。 ちなみに僕が何でこんなことをしているのか簡単に説明しますと・・ 実は今ソートのプログラムを作っているのですが、2種類のソートの仕方を実行しないといけなくて、その前処理として抽出プログラムを作ろうとしているんです。 (1)単に数値で昇順に並び替える "abc()_3t" → 3 "abc()_5t" → 5 "abc()_2t" → 2 "abc()_1t" → 1 を、抽出した数値をもとに以下のように並び替える。 "abc()_1t"  "abc()_2t"  "abc()_3t"  "abc()_5t"  (2)0k..5k→5k..0k→0k..5k→5k..0k、のように連続する項の終わりの数値と最初の数値をくっつけるように並び替え。(abc3.0は無視するようにする。) "0k,abc,5k,abc3.0" → 05 "0k,abc,5k,abc3.0" → 05 "5k,abc,0k,abc3.0" → 50 "5k,abc,0k,abc3.0" → 50 を、抽出した”数?”をもとに以下のように並び替える。 "0k,abc,5k,abc3.0"  "5k,abc,0k,abc3.0" "0k,abc,5k,abc3.0"  "5k,abc,0k,abc3.0" 

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

[VBA] 正規表現オブジェクトの使い方 http://arrow3.way-nifty.com/shige/2006/07/vba__fc44.html 等々 正規表現を使用されてみては如何でしょうか?

shishsi
質問者

補足

回答、ありがとうございます。 しかし、実は僕はまだVB初心者なためか、参照ページを理解しきれませんでした。 お時間がありましたら、具体的に参考プログラム等、ヒントをいただけませんか?

関連するQ&A