エクセルVBAの文字列操作について2
エクセルVBAの文字列操作について2
以前、こちらでご教授いただいた以下のような文字列操作方法があります。
この方法ですと例えば[1-3]から3をひいた際に"1-2"と表示されますが
今回は連続する数字が2つの場合は1,2と表示させ3つ以上の場合は-でつないで表示させたいと思います。
一週間ほど考えたのですが解決できませんでした。
どなたかご協力お願いいたします。
質問内容
例えば、[1-10,15-20,22-38]と入っているセルがあるとします。
このセルに数を足したり引いたりしたいのです。
例えば、このセルから”5”を引いて[1-4,6-10,15-20,22-38]と表示したり、
"21"を足して[1-10,15-38]と表示したい。
いただいたご回答
A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに
=NUMORDER(A1,-5)
と入力すると「1-4,6-10,12,15-20,22-38」と表示し
=NUMORDER(A1,21)
と入力すると「1-10,12,15-38」と表示します。
1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。
Function NUMORDER(myStr As Variant, num As Integer) As String
Dim i As Long
Dim j As Double
Dim myNum As Variant
'文字列中の スペース を削除
myStr = Replace(myStr, " ", "")
'文字列の前後に「0」・「100」を挿入
Select Case Left(myStr, 2)
Case "1,", "1-"
myStr = myStr & ",100"
Case Else
myStr = "0," & myStr & ",100"
End Select
'文字列を カンマ で分割し、ハイフン の区間の数字を補完する
myStr = Split(myStr, ",")
For i = 0 To UBound(myStr)
If InStr(myStr(i), "-") > 0 Then
myNum = Split(myStr(i), "-")
myStr(i) = ""
For j = myNum(0) To myNum(1)
myStr(i) = myStr(i) & " " & j
Next
myStr(i) = Trim(myStr(i))
End If
Next
'欠番に「●」を入れ、「数を足したり引いたり」する
myStr = Split(Join(myStr))
For i = 0 To UBound(myStr) - 1
myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)
Next
myStr = Split(Join(myStr))
If num > 0 Then
myStr(num - myStr(0)) = num
Else
myStr(-num - myStr(0)) = "●"
End If
'前後に挿入した「0」・「100」を削除
myStr = Replace(Join(myStr), " 100", "")
If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)
'連続数字を ハイフン で繋ぐ
myStr = Split(myStr, "●")
For i = 0 To UBound(myStr)
If myStr(i) <> " " Then
myNum = Split(Trim(myStr(i)))
If UBound(myNum) > 0 Then
myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))
End If
End If
Next
'カンマ で文字列に分割する
myStr = Application.Trim(Join(myStr))
NUMORDER = Replace(myStr, " ", ",")
End Function
お礼
上記の指摘どおりInStrの引数が逆だったみたいです。 ご指摘ありがとうございました。
補足
Arrayの文字列とシート名との文字列比較(部分一致)を行いたいです。 例)Arrayの文字列内容が"テスト","てすと" シート名が"aaaテストbbb" Arrayの文字列を順番にシート名と比較してシート名にArrayの文字列が含まれている場合はそのインデックスを返却したい。 上記の場合はテストで一致してインデックス1を返却する。