• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:長い文字列から特定の数字を取り出す方法)

長い文字列から特定の数字を取り出す方法

このQ&Aのポイント
  • エクセルの関数を使って文字列から数値のみを取り出す方法を教えてください。
  • 特定の番号のみを取り出し、行ごとにデータを整理する方法を教えてください。
  • 不要な数値を取り除いて、ほしい数値のみを取り出す方法を知りたいです。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.4

colinaさん こんにちは。 Visual Basicのカテゴリーでの質問なのでVBA(マクロ)で回答します。 ユーザ関数を作成してみました。 ※標準モジュールに作成してください。 Public RE As Object Public mc As Object Function 数字取得(検索文字 As Range, 位置 As Integer) As String  If RE Is Nothing Then Set RE = CreateObject("VBScript.RegExp")  RE.Pattern = "(\d{3,8})"          ' 数字が3個~8個連続してマッチ  RE.Global = True  Set mc = RE.Execute(検索文字)  数字取得 = "該当なし"  If 位置 <= mc.Count Then 数字取得 = mc.Item(位置 - 1) End Function 使用方法法は  セルB2 ==数字取得(A2,1)  セルB3 ==数字取得(A2,2) ※数字の連続桁数は RE.Pattern = "(\d{3,8})"  を自由に変更してください。 皆様から指摘通り、仕様(プログラム等を作る時のルール)が確定しないと、回答も難しくなります。 今回は【8ケタの連続数字を取得したい】ようなことを記述すればもっとわかりやすかったと思います。

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

正規表現を使うと簡単です。 Function 数字8桁取得(ByVal 対象となる文字列 As String) As String() Dim 正規表現 As Object Dim 一致集合 As Object Dim 一致    As Object Dim I      As Long ReDim 戻り値(0) As String Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Global = True 正規表現.Pattern = "\d{8}" Set 一致集合 = 正規表現.Execute(対象となる文字列) For Each 一致 In 一致集合     ReDim Preserve 戻り値(I)     戻り値(I) = 一致.Value     I = I + 1 Next 数字8桁取得 = 戻り値 End Function 使用例 Dim 行 As Long Dim 文字列 Dim 結果() As String 結果 = 数字8桁取得(Cells(2,1)) '★A2のこと 行 = 2 For Each 文字列 In 結果     If 文字列 = "" Then Exit For     Cells(行, 2).EntireRow.Insert     Cells(行, 2) = 文字列     行 = 行 + 1 Next 正規表現の構文は下記を参照してください。 http://msdn.microsoft.com/ja-jp/library/cc392437.aspx

colina
質問者

お礼

VBAでの回答ありがとうございました。参考にさせていただきます。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

> エクセルの関数を使って文字列から数値のみを拾う方法を試してみましたが、 それって、どんな関数ですか? 関数でのやり方は私には解りませんが、VBAマクロでユーザー関数を作れば対応できます。 7桁以下の数値も9桁以上の数値も対象外ということで良いんですよね? 標準モジュールに Function test(ByVal s As String, ByVal n As Long) As Long Application.Volatile s = s & "x" Dim c As Long, i As Long i = 1 For c = 1 To Len(s) - 8 If IsNumeric(Mid(s, c, 8)) And Not IsNumeric(Mid(s, c + 8, 1)) Then If i < n Then i = i + 1 Else test = Mid(s, c, 8) Exit For End If End If Next c End Function と書き、 B2に =test(A2,1) B3に =test(A2,2) と入力すれば良いです。

colina
質問者

お礼

VBAのご回答ありがとうございました。参考にさせていただきます。 >当初mid 関数を使いましたが、うまくできませんでした。。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

補足されたい。 条件を質問者は、文章で書いてないではないか。プログラム仕様書など書いた事無いのだろう。 こういう場合データの1例や、図・写真は他人向けには適切でない。何を注目したら良いかわからない場合が多いから。 こういうところでプログラム経験の少なさが現れる。 (1)当事者で無いと条件はわからない。データの実情と、ニーズがわかりにくいから。 (2)プログラムはわからなくても、文章なら表現できるだろう。出来ないような問題では、コンピュター処理は難しい。 (文章では簡単でも、コンピュター処理は難しいのも当然あるが、それは回答者に教えてもらう。) ーーー 質問文ではカッコ内の数字を抜き出せば仕舞いのようだが、実際はどうなのか。 ーーー >ほしい数値だけを取り出す方法があれば 何がほしいか、質問者の頭にしかない状態。こんな文章は書いても意味ない。 >エクセルの関数・・ これも成功しなかった例なら質問に書いても意味無い。式も書いてないし。 沢山の人に見てもらう場合だから、余分なことをかかず、必要なことを書くように心がけること。

colina
質問者

お礼

ご回答ありがとうございます。残念ながら、プログラム仕様書どころかVBAは全くの初心者です。今後質問する際の参考にさせていただきますね。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

> エクセルの関数を使って文字列から数値のみを拾う方法を試してみましたが、 > ”1-2”や”2-2”といった不要な数値も拾ってしまいました。 数値と判断できたら、変数にカウントしていって 8桁連続で、かつ9文字目が数値以外である 条件に合うかどうかを判定するだけでは?

colina
質問者

お礼

ご回答ありがとうございました。参考にさせていただきます。

関連するQ&A