アプリ版:「スタンプのみでお礼する」機能のリリースについて

A2セルの値が「100021_りんご01青森県」からInStrで「りんご」を抽出したい。
セルの値が「100021_りんご01青森県」のような並びで「_」より右「01」より左の「りんご」を切り出したい。
下記コードで「_」より右は切り出せますがこのコードを代えて切り出すことは可能でしょうか?ご指南のほどよろしくお願いいたします。
・・・・・・・・・・・・・・
Dim N As Long
Set cel = wbk.Worksheets("Sheet3").Cells(2, 1)
N = InStr(cel, "_")
cel.Offset(-1, 1) = Mid(cel, N + 1)

質問者からの補足コメント

  • Dim cel as Range が抜けてました

      補足日時:2022/08/15 09:59

A 回答 (5件)

以下のようにしてください。


Dim N As Long
Dim P As Long
Dim cel As Range
Set cel = wbk.Worksheets("Sheet3").Cells(2, 1)
N = InStr(cel, "_")
P = InStr(cel, "01")
cel.Offset(-1, 1) = Mid(cel, N + 1, P - N - 1)
    • good
    • 2
この回答へのお礼

ありがとうございます。
理解できました!

お礼日時:2022/08/16 17:49

InStr を使った方法だと。



1.InStr はパターンマッチができない
2.01の部分が可変(数字ではある?)

の条件下だとアンダーバー以降を1文字毎にチェックすることになります。
速攻で書いたので冗長かもしれませんが、こんな感じ。

Sub sampleProc1()

  Dim word   As String
  Dim pos_start As Long
  Dim pos_end  As Long
  
  word = "100021_りんご01青森県"
  
  'アンダーバーの位置検索
  pos_start = InStr(1, word, "_")
  '見つからない--> アンマッチ
  If pos_start > 0 Then
    'アンダーバーの1文字後が抜き出し位置
    pos_start = pos_start + 1
    '上記位置から1文字ずつ数字かチェックする
    'LIKE演算子が使える
    Dim i As Long
    For i = pos_start To Len(word)
      If Mid$(word, i, 1) Like "[0-9]" Then
        '数字が見つかったらループを抜ける
        pos_end = i
        Exit For
      End If
    Next
  End If
  
  If pos_start > 0 And pos_end > 0 Then
    '抜き出し
    MsgBox Mid$(word, pos_start, pos_end - pos_start)
  Else
    MsgBox "一致しません"
  End If

End Sub
    • good
    • 2

ちょっと遅かったですかね。


質問文の内容しか記載してませんけど。

Sub test()
Dim MyReg As Object
Dim cel As Range

Set cel = Worksheets("Sheet3").Cells(2, 1) 'テスト用にBookは切り離し

Set MyReg = CreateObject("VBScript.RegExp")
MyReg.Pattern = "_(\D+?)\d"

If MyReg.test(cel.Value) Then MsgBox MyReg.Execute(cel.Value)(0).SubMatches(0)

Set MyReg = Nothing
Set cel = Nothing
End Sub
「A2セルの値が「100021_りんご01」の回答画像4
    • good
    • 0

こんにちは。



本末転倒かもしれませんが、正規表現使った方が早いし柔軟かなぁ。
RegExp VBA で検索してみて。

Sub sampleProc()

  Dim reg As Object 'RegExp
  Set reg = CreateObject("VBScript.RegExp")
  
  With reg
    .Global = False
    .IgnoreCase = False
    .Pattern = "(^\d+_)(\D+)(\d+)(.+$)" '<--正規表現パターン
  End With
  
  Dim mc As Object 'MatchCollection
  Set mc = reg.Execute("100021_りんご01青森県")
  
  If mc.Count > 0 Then
    MsgBox mc(0).SubMatches(0) '1番目()にマッチ 100021_
    MsgBox mc(0).SubMatches(1) '2番目()にマッチ りんご
    MsgBox mc(0).SubMatches(2) '3番目()にマッチ 01
    MsgBox mc(0).SubMatches(3) '4番目()にマッチ 青森県
  Else
    MsgBox "一致しません"
  End If
  
End Sub
    • good
    • 0

_ は常に存在するのでしょうけど、 01 は常に同じなのでしょうか?

    • good
    • 0
この回答へのお礼

おっしゃるとおり「01」が「04」に変化する箇所を見つけました。

お礼日時:2022/08/15 12:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!