- ベストアンサー
Excel 数字以降、以前抽出
数字があったらそれ以降、最後にあったら数字の前を取り出したいです。 数字に文字がくっついていたらその文字ごといらないです。 例 KA KI KU 8698→KA KI KU KA KI KU KE30→KA KI KU 14SA SHI SU SE→SHI SU SE 101 SA SHI SU.→SA SHI SU. やり方は何でもかまいませんので、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
スペースでわけられていたとして スペースでブロックに分割 数値を含まないブロックのみを結果に追加 Sub RemoveNumericBlocksInRange() Dim ws As Worksheet Dim startCell As Range, endCell As Range Dim currentCell As Range Dim inputStr As String Dim words() As String Dim i As Long Dim result As String ' ワークシートを設定 Set ws = ThisWorkbook.Sheets("Sheet1") ' シート名を適切な名前に変更してください ' 開始セルと終了セルを設定(適切なセルに変更してください) Set startCell = ws.Range("A1") Set endCell = ws.Range("A5") ' 各セルで処理を繰り返す For Each currentCell In ws.Range(startCell, endCell) ' セルの値を取得 inputStr = currentCell.Value ' スペースで文字列を分割 words = Split(inputStr, " ") ' 数値を含まないブロックのみを結果に追加 result = "" For i = LBound(words) To UBound(words) If Not ContainsNumeric(words(i)) Then result = result & words(i) & " " End If Next i ' 末尾の空白を削除 result = Trim(result) ' 結果をB列に書き込む currentCell.Offset(0, 1).Value = result Next currentCell End Sub Function ContainsNumeric(str As String) As Boolean Dim i As Integer For i = 1 To Len(str) If IsNumeric(Mid(str, i, 1)) Then ContainsNumeric = True Exit Function End If Next i ContainsNumeric = False End Function
その他の回答 (3)
- kkkkkm
- ベストアンサー率66% (1719/2589)
回答No.1は 元のデータが分割されていない場合は「データ」の「区切り位置」で分割した状態にして関数でという方法でしたが やりかたは問わないという事でしたのでVBA(マクロ)での方法です。 添付画像のようにデータがひとつのセルに分割されずにある場合です。 通常のマクロです。A1からA列の最終行までが対象となり実行すると結果添付画像のようになります。 Sub Test() Dim i As Long Dim mStr As Variant For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row mStr = Split(Cells(i, "A").Value, " ") If mStr(0) Like "*[0-9]*" Then Cells(i, "C").Value = Replace(Cells(i, "A").Value, mStr(0) & " ", "") ElseIf mStr(UBound(mStr)) Like "*[0-9]*" Then Cells(i, "C").Value = Replace(Cells(i, "A").Value, " " & mStr(UBound(mStr)), "") End If Next End Sub 以下はユーザー定義関数を利用する場合です。 標準モジュールに以下のコードを記載して C1に =NumCut(A1) として下にコピーします。 NumCutは適当に付けましたのでNumCutの部分は適切なものに変更してください。 Function NumCut(ByRef mRng As Range) Dim mStr As Variant mStr = Split(mRng.Value, " ") If mStr(0) Like "*[0-9]*" Then NumCut = Replace(mRng.Value, mStr(0) & " ", "") ElseIf mStr(UBound(mStr)) Like "*[0-9]*" Then NumCut = Replace(mRng.Value, " " & mStr(UBound(mStr)), "") End If End Function
お礼
たくさんありがとうございます。
- Chiquilin
- ベストアンサー率30% (94/306)
=TRIM(TEXTSPLIT(A1,SEQUENCE(10,,0),,TRUE))
お礼
ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
お礼
ありがとうございます。