• ベストアンサー

Excelのセルに有る文字列の切り分けの仕方

MIDを使ってやってみましたが、思った通りの結果が得られなかったので、ご質問させていただきます。 セルのL1、M1に★・・・、●・・・・・、▲・・・・・・、★・・、と言うような文字列が入っております。(これはその時により異なりますが、MAXでL100ぐらいになり、記号もセル内で複数回出現、・は定数ではありません) それをL1に有る★以降次の記号までの文字列をO1に、●以降をP1に、▲以降をQ1に、 同じくM1に有る文字列もR1、S1、T1に文字列を ボタン1つで入れたいのですが、どの様に関数又は VBAで組んだらいいのでしょうか?よろしくお願いいたします。

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

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

こんばんは。 Wendy02です。 「インデックスが有効範囲にありません」 原因は、おそらくは、「 "★●▲"」という切り分けマークが必ずしも入っているとは限らない、ということですね。とりあえず、応急処置だけになります。 Private と名前のついてコードから下を以下に、差し替えしてみてください。 Private Sub SplitMarks(ByVal myRange As Range, myPasteRange As Range) Dim Matches As Object Dim Match As Object Dim i As Long Dim ArrayBuf() As Variant Dim buf As Variant 'マーク Const MARKS As String = "★●▲" With CreateObject("VBScript.RegExp")  .Global = True  .Pattern = "([" & MARKS & "][^" & MARKS & "]+)"  Set Matches = .Execute(myRange.Value)  For Each Match In Matches   ReDim Preserve ArrayBuf(i)   ArrayBuf(i) = Match.Value   i = i + 1  Next End With   On Error Resume Next   buf = ArrayBuf(0)   If Err.Number = 0 Then     myPasteRange.Resize(, UBound(ArrayBuf) + 1) = ArrayBuf()   Else     myPasteRange.Value = myRange.Value   End If   On Error GoTo 0 End Sub

その他の回答 (5)

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

こんにちは。 #3の Wendy02です。返事が遅くなりました。 私の書いたマクロを標準モジュールに登録しましたら、後は、 Private Sub CommandButton2_Click()  Call TestSplitting End Sub としてみてください。

oshimaru
質問者

補足

Wendy02様 度々で大変申し訳ございません。 ご指示のようにやってみた?ところ、「インデックスが有効範囲にありません」とのエラーが出ます。 現在MVE上で書かれているのは 下記のような形です。 私の作業手順が悪いのだと思いますが、どこをいじればよろしいのでしょうか? ご指導下さいよろしくお願い致します。 Private Sub CommandButton2_Click() Call TestSplitting End Sub Sub TestSplitting() Dim sRng As String Dim strRngs As Variant Dim strPasteRngs As Variant Dim rng As Variant Dim c As Range Dim i As Integer Dim j As Long 'データの先頭位置 Const MYRANGE_TOP As String = "L1,M1" strRngs = Split(MYRANGE_TOP, ",") '切り分け '貼り付け左端 Const MYPASTE_RANGE As String = "O1,R1" strPasteRngs = Split(MYPASTE_RANGE, ",") '切り分け Application.ScreenUpdating = False For Each rng In strRngs For Each c In Range(Range(rng), Cells(65536, Range(rng).Column).End(xlUp)) If Not IsEmpty(c) Then SplitMarks c, Range(strPasteRngs(i)).Offset(j) j = j + 1 End If Next i = i + 1 j = 0 Next Application.ScreenUpdating = True End Sub Private Sub SplitMarks(ByVal myRange As Range, myPasteRange As Range) Dim Matches As Object Dim Match As Object Dim i As Long Dim ArrayBuf() As Variant 'マーク Const MARKS As String = "★●▲" With CreateObject("VBScript.RegExp") .Global = True .Pattern = "([" & MARKS & "][^" & MARKS & "]+)" Set Matches = .Execute(myRange.Value) For Each Match In Matches ReDim Preserve ArrayBuf(i) ArrayBuf(i) = Match.Value i = i + 1 Next End With myPasteRange.Resize(, UBound(ArrayBuf) + 1) = ArrayBuf() End Sub '----------------------------------------

noname#22222
noname#22222
回答No.4

s_husky です。 少し、補足しておきます。   [  A ][    B     ] 1 ○AAA BBBB☐CCCC 2 △BBBB 3 ☐CCCC これは、Excel で B1 に表示したものです。 B1の数式=CutStr(A1 & A2 & A3, "△", 2) CutStrの第一引数の文字列の合成については自力で工夫して下さい。

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

こんにちは。 #2のWendy02です。 まあ、ぶつかっても、それは、ご本人が考えればよいことですので、あとはユーザー設定で、都合が悪ければ、書き換えればよいとします。 コードの「貼り付け左端上」のところに書いていただければよいです。なお、マークに関しては、「マーク」という所に、切り分け文字を入れればよいです。 「★・・・、●・・・・・、▲・・・・・・、★・・、」 この順序は問いません。後は、フォーム・ツールのボタンにでも取り付けてください。 '標準モジュール '---------------------------------------- Sub TestSplitting() Dim sRng As String Dim strRngs As Variant Dim strPasteRngs As Variant Dim rng As Variant Dim c As Range Dim i As Integer Dim j As Long 'データの先頭位置 Const MYRANGE_TOP As String = "L1,M1" strRngs = Split(MYRANGE_TOP, ",") '切り分け '貼り付け左端 Const MYPASTE_RANGE As String = "O1,R1" strPasteRngs = Split(MYPASTE_RANGE, ",") '切り分け Application.ScreenUpdating = False For Each rng In strRngs  For Each c In Range(Range(rng), Cells(65536, Range(rng).Column).End(xlUp))   If Not IsEmpty(c) Then     SplitMarks c, Range(strPasteRngs(i)).Offset(j)     j = j + 1   End If  Next  i = i + 1  j = 0 Next Application.ScreenUpdating = True End Sub Private Sub SplitMarks(ByVal myRange As Range, myPasteRange As Range) Dim Matches As Object Dim Match As Object Dim i As Long Dim ArrayBuf() As Variant 'マーク Const MARKS As String = "★●▲" With CreateObject("VBScript.RegExp")  .Global = True  .Pattern = "([" & MARKS & "][^" & MARKS & "]+)"  Set Matches = .Execute(myRange.Value)  For Each Match In Matches   ReDim Preserve ArrayBuf(i)   ArrayBuf(i) = Match.Value   i = i + 1  Next End With   myPasteRange.Resize(, UBound(ArrayBuf) + 1) = ArrayBuf() End Sub '----------------------------------------

oshimaru
質問者

補足

丁寧なご回答ありがとうございます。もう少し甘えさせていただきたいのですが、書いていただいたプログラムですがVBエディターをおこしたときに表示されているPrivate Sub CommandButton2_Click() *************** End Sub の部分の*のところに貼り付けそれをボタンに当込めばよろしいのでしょうか?、知識がなくてスイマセン!

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

こんにちは。 一応、考えてみましたが、ロジックとしては、ちょっとおかしな部分がありますね。 ★・・・、●・・・・・、▲・・・・・・、★・・、 これですと、4個のセルが必要ですね。 それを、O1,P1,Q1,R1 まで必要となるのに、 M1に同様にあるものを、 R1,S1,T1 としたら、ぶつかってしまいますね。 なお、切り分けるのは、正規表現のほうが簡単でしょうね。

noname#22222
noname#22222
回答No.1

Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function ? CutStr("AAA,BBB,CCC", ",", 2) BBB ? CutStr("THIS IS A PEN.", " ", 2) IS ? CutStr("THIS IS A PEN.", "THIS ", 2) IS A PEN ? CutStr("THIS IS A PEN.", "IS ", 1) THIS 私にとって、必須の関数です。 ******************************** "AAAA○BBBB△CCCC" から BBBB を抜き出す用法 ******************************** ? CutStr("AAAA○BBBB△CCCC", "○", 2) BBBB△CCCC ? CutStr("BBBB△CCCC", "△", 1) BBBB よって、 ? CutStr(CutStr("AAAA○BBBB△CCCC", "○", 2), "△", 1) BBBB

関連するQ&A

  • 最後の句点のあとの文字列を別のセルにコピーする

    セル(E5)に、文字列データがあります。いろいろな種類です。全角英数・半角英数・漢字・カタカナ・ひらがな。記号など。 その中に句点「。」が何個かありますが、最後の句点からあとの文字列を抽出して、セル(F5)に表示します。 例 「本日は晴天なり。It is fine today。明日はどうでしょうか。終わり」→「終わり」 「How are you? こんにちは。東京。日本。」→「」 「明日は雨か」→「明日は雨か」 「昨日は曇りでした。昨日は曇りでした。昨日は曇りでした。that's all.」→「that's all.」 ---- できれば関数で、・・無理でしたら、マクロ、VBAでもかまいません。VBAで作っていますが、思うように動いてくれません。 Mid関数で、句点の数を把握して、最後の句点の語順を把握し、それ以降の文字列を別のセルに移す。・・・ これでもいいようですが、かなり乱雑なラインになってしまいそうです。 先の質問で、関数でも処理できる回答を頂きまして、何か関数処理が出来そうな気がしてきました。そのほか、VBAでもシンプルなもながありましたらお願いします。

  • エクセル 文字列検索と検索した文字列が含まれるセルへのジャンプ

    エクセル教えてください。 VBAは使ったことがありません。 現在Q&Aを作っています。 かなりボリュームが増えてしまったので、 文字列検索ができるようにしたいと思っています。 そこで、あるセルに調べたい文字列を入力し、 検索ボタンを押すと、その文字列が含まれるセルにジャンプする。 こんな機能は、エクセルでできませんでしょうか? マクロを組んだりすればよいのでしょうか? 教えてくださいー。

  • Excel VBA   %の入ったセル

    困りました、、、 VBAを使って A×30%+15000 これが入ったセルB2と たとえば250000が入ったセルB2を掛け算したいのですが (B2の数字は固定ではなくいろいろな数字が入ります) 文字列が入っていることにより うまくいきません 今は仕方なくMid関数で数字を抜き出して使っているのですが なにかよい方法はないでしょうか よろしくお願いします<m(__)m>

  • Excel 特定の文字列間のセルの個数を数える方法

    Excelの関数を用いて以下のような処理は可能でしょうか。 A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U| A|B|C|B|C|A|C|A|B|B|C|A|B|B|B|C|A|C|B|A|3| セルA1からT1にはA,B,Cどれかの文字列が入っています。Aの文字列と次に現れるAの文字列との間にセルが3個以上あれば、U1のセルにその現れる回数が表示される。(上記の場合"3") このようなことが、関数だけでできるでしょうか。 もしできるようでしたらそのやり方をご教授ください。 よろしくお願いします。

  • Excelの文字列操作について

    Right・Left・Mid関数は何桁目以降表示しなさい、とか何桁目以降何桁分を抽出しなさいという関数ですが、例えば、@AAAA@BBBBB@CC.***のような文字列があり、文字列の右側から何桁目に@が来るか知る関数はありますか?サンプルの文字列でいうと、***.CC@の順になりますので、7桁目と判るようにできますか?どなたかお知恵をお貸し下さい。よろしくお願い致します。

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

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

  • Excelで特定の文字列があるかないかの検査

    Excel VBAで文字列を調べて、そのセルに文字列が存在すれば切り抜いて変数に保存するという作業を行いたいと 思っています。例えば、本という列があるとします。本の列には、 $$book=本 $$books=本部類 という値が入っていたりします。"="以降を切り抜いて、bookは列1、booksは列2に挿入したいと思います。 この場合、"本"という値は列1へ、"本分類"という値は列2へ入ることになります。 この文字列の調べ方がわかりません。Instr関数を使うことを考えたのですが、どちらの値もヒットしてしまいます。 どのような関数を使ったら上手に文字列を切り抜くことが可能でしょうか?

  • エクセルのセル内の出現文字数をカウントしたい

    エクセルの各セルにはいっている、不特定の文字列の出現回数を調べ、他のセルに出現文字列とその回数を表示させたいのですができますか。 例えば |実態|下記|壮行|実態|………|実態|2|下記|1|壮行|1|というふうにです。  セルに入る文字列が決まっていないので、countifなどの関数が使えません。

  • EXCEL セルの文字列の文字種の判別

    エクセルでセルの文字列が下記のいずれかを判断するにはどうすればよいでしょうか? セルの文字列は英字数字記号が前提で、漢字かな等は入っていません。 ・数字のみ ・英字のみ ・記号のみ ・英字と数字 ・英字と記号 ・数字と記号 ・英字と数字と記号

  • エクセルの文字列操作

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

専門家に質問してみよう