• ベストアンサー

エクセルVBAの文字列操作について

エクセルVBAの文字列操作について 例えば、[1-10,12,15-20,22-38]と入っているセルがあるとします。 各数字は","で区切られています。このセルに数を足したり引いたりしたいのです。 例えば、このセルから”5”を引いて[1-4,6-10,12,15-20,22-38]と表示したり、 "21"を足して[1-10,12,15-38]と表示したいのですが どなたかご教授いただけないでしょうか?

noname#150547
noname#150547

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

#1 DOUGLAS_ です。 >この煩雑な コーディング をご覧になって、 >もっと スマート なご回答の付くことを  もう少し スマート な ヤリカタ が見付かりましたのでお知らせいたします。  使い方は、#1 と同じです。 Function NUMORDER(myStr As String, num As Integer) As String  Dim strRng As Range  Dim myRng As Range '文字列を セルアドレス に変換  myStr = "$A" & myStr  myStr = Replace(myStr, " ", "")  myStr = Replace(myStr, "-", ":$A$")  myStr = Replace(myStr, ",", ",$A$") 'アドレス を Range オブジェクト に代入し '「数を足した」場合は、Union メソッド で セル範囲 の集合を求める  Set strRng = Range(myStr)  If num > 0 Then   Set myRng = Application.Union(Range("$A$" & num), strRng) '「数を引いた」場合は Intersect メソッド で共有セル範囲を求める  Else   Set strRng = strRng.Offset(1)   num = num - 1   Set myRng = Application.Intersect(strRng, _    Application.Union(Range("$A$1:$A$" & -num - 1), _     Range("$A$" & -num + 1 & ":$A$" & Rows.Count)))   If myRng Is Nothing Then Exit Function   Set myRng = myRng.Offset(-1)  End If '求められた セル範囲 の アドレス を文字列に変換  myStr = myRng.Address  myStr = Replace(myStr, "$", "")  myStr = Replace(myStr, "A", "")  NUMORDER = Replace(myStr, ":", "-") End Function

noname#150547
質問者

お礼

ありがとうございます!解決しました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

=SERIALCHECKER(F1,TRUE,11,13,21)  TRUE の場合は、加える、FALSE は、引く, AddVal は、30個まで可能、しかし、数値に限ります。区切りは、[,]カンマ '--- Public Function SerialChecker(ByVal Nums As Variant, EraseFlg As Boolean, ParamArray AddVal()) 'EraseFlg[True-数値をリストに加える,False -抜く,AddVal 加える数列 Dim arNum As Variant Dim arTmp As Variant Dim Ar() As Long Dim Ar2() As Long Dim i As Long, j As Long, k As Long Dim n As Variant, c As Variant, ret As Variant Dim a As Long, b As Long Dim arBuf As Variant Dim buf As String Dim flg As Boolean Const blDOUBLE As Boolean = True '使われていない If IsNumeric(Nums) Then Exit Function Nums = StrConv(Nums, vbNarrow) If Nums Like "[[]#*" Then   Nums = Mid(Nums, 2, Len(Nums) - 2) End If arNum = Split(Nums, ",") For Each n In arNum   If InStr(n, "-") Then     arTmp = Split(n, "-")     If arTmp(1) > arTmp(0) Then       a = arTmp(0)       b = arTmp(1)     Else       a = arTmp(1)       b = arTmp(0)     End If     For i = a To b       ReDim Preserve Ar(j)       Ar(j) = i       j = j + 1     Next   Else     ReDim Preserve Ar(j)     Ar(j) = n     j = j + 1   End If Next n If IsArray(AddVal) Then   arBuf = Array(AddVal) End If If EraseFlg Then 'Add   For Each c In AddVal     ReDim Preserve Ar(j)     Ar(j) = c     j = j + 1   Next   ReDim Ar2(j - 1)   For i = 0 To j - 1     Ar2(i) = Application.Small(Ar, i + 1)   Next Else 'Erase   For Each c In Ar     ret = Application.Match(c, arBuf, 0)     If IsError(ret) Then       ReDim Preserve Ar2(j)       Ar2(j) = c       j = j + 1     End If   Next   For i = 0 To j - 1     Ar2(i) = Application.Small(Ar2, i + 1)   Next End If '-- 'ダブリを抜くコード省略 '-- buf = Ar2(0) For i = 1 To j - 1   If Ar2(i) = Ar2(i - 1) + 1 Then     flg = True   ElseIf flg Then     buf = buf & "-" & Ar2(i - 1) & "," & Ar2(i)     flg = False   ElseIf Ar2(i) <> Ar2(i - 1) Then     buf = buf & "," & Ar2(i)     flg = False   End If Next If flg Then buf = buf & "-" & Ar2(i - 1) SerialChecker = buf End Function

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

読み取り方次第でどうとでも読み取れる例は止めてください。混乱します。 セルに入っているのは「1,2,3,4,5,6,7,8,9,10,12,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38」と言う文字列? そうだと仮定して、 5を取るサンプル Sub Sample1()  Range("A1") = Replace(Range("A1"), ",5,", ",") End Sub 21を20の後に追加するサンプル Sub Sample2()  Range("A1") = Replace(Range("A1"), ",20,", ",20,21,") End Sub

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

>[1-10,12,15-20,22-38]と入っているセルがあるとします。 >各数字は","で区切られています。 とのことですが、「1,2,3,4,5,6,7,8,9,10,12,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38」と入力された セル がある、ということでしょうか? それとも、正味「1-10,12,15-20,22-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

関連するQ&A

  • セル内の文字列操作について

    Excelでセル内の文字列を操作したいのですが、Excelの標準の関数では出来そうにないので、どなたかお力をお貸しください。 1つのセル内に、文字列や数値が複数入っています。 (例) Excel 12 りんご Word 11 このセルを調べて、数値のデータが複数入っている場合、最大値のみを表示させ、残りの数値データは削除したいのです。 (結果) Excel 12 りんご Word この処理の対象はセル内の数値データであって文字列には作用させず、結果的には文字列はそのまま表示させたいのです。 Excelの文字列に関する関数を調べてみたのですが、該当するものがなく、VBAを使用しなくてはならないのかもしれません。処理するデータが大量なため、VBAマクロなどで処理できれば大変ありがたいのですが、どなたかご存知の方がいらっしゃいましたら、ご教授くださいませ。どうぞよろしくお願いいたします。

  • 文字列操作(ExcelのVBAですが)

    特定のExcelセル内にある文字列について、 例えば、 138.40.8.7 と入っている場合、 138.40.08.7 に、 35.9.1.6 と入っている場合、 35.09.01.6 にするVBA関数を作りたいのです。(セル関数でもかまわないですが) つまり、小数点で区切られている2番目と3番目の数字が 一桁の場合、頭に0を付けて、必ず二桁になるようにしたいわけです。 どなたか、ご教授くださいませ。 よろしくお願い致します。

  • VBAの文字列操作教えて

    EXCELのVBAを使って、あるセルの8桁の文字列の先頭2桁を取り出したいのですが、どのような命令を使えばいいのですか?例えば、「ABCDEFGH」の「AB」を取り出してその「AB」を違うセルに入れたいのです。教えてください。

  • エクセル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

  • エクセル 文字列から数字だけを抽出

    エクセル2016の操作について教えて下さい。 セル内の文字列から数字だけを抽出したいです。 例えばAの列にこのような文字列が入っているとします。 高度5km 高度10.1km この中の数字だけを取り出して隣のB列の同じ行に数字だけを表示させる方法がありましたら教えて下さい。 宜しくお願いします。

  • エクセルの文字列操作

    住所録の様式で A列にNo、B列に氏名、C列に住所のファイルがあり、 C列の住所で、1個のセルに何故かしら「住所と電話番号」が入っています。 住所と電話番号を夫々別の列に分割したくて、 電話番号は、RIGHT 関数で取り出しました。 住所は、文字数が一定でないので、LEFTまたはMID関数では出来ません。 ここで質問です 住所データの末尾に混在する電話番号は10文字の場合に限定し、 文字数の異なる、住所(○○市XX町△△番地○△荘2-103など)のみ 抽出する方法はありませんか。 なお、VBAなどは無知です、エクセル関数だけの操作があれば教えてください。

  • vbaで文字列の件

    お世話になります。 エクセルVBAで、文字列の右から何文字列目以降を 緑色に着色したいのですが、どうしたら良いか分かりません。 offsetで隣のセルに切り出してから着色とかは出来たのですが・・、 どなたかご教授下さい。 宜しくお願い申し上げます。

  • エクセルの文字列としての数値

    エクセルでは「’」を付けるか、セルを文字列とするかで、数字を文字列として認識させられるようですが、ここで文字列として認識された数値はASCIIにおける、文字列としての数認識コードとやはり同じなのでしょうか?それともエクセル独自のものと解釈した方がよいのでしょうか?

  • EXCEL VBA 文字列

    A列のセルに、文字列が以下の様に並べられています。 【あああああ】いいいいいいううううううえええおおおお 上記のような場合に、”あああああ”と【】の文字だけを取り出して、B列に表示させることはマクロで可能でしょうか?但し、【】のなかの文字数はセルによりバラバラです。 ネットでかなり検索したのですが、自分では解決できませんでした。 どうか、よろしくお願いいたします。

  • エクセルで文字列の計算をしたいのですが。

    エクセルで文字列の計算をしたいのですが。 セルの表示は文字列ですが、実際のデータは数字(だけ)が入っています。 これを計算する事は可能でしょうか?。 例えば A1セル:00001 と入っていて B1セルには、A1セル+1=00002 とさせたいのです。 よろしくお願いいたします。

専門家に質問してみよう