• ベストアンサー

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

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

Public Function lastword(s As String) As String Dim a a = Split(s, "。") lastword = a(UBound(a)) End Function

その他の回答 (6)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.7

>できれば関数で、 無理やり、1つの式で行いました。 セル(E5)に文字があるとします。 セル(F5)に =MID(E5, MAX(IF(MID(E5,ROW(INDIRECT("A1:A"&LEN(E5))),1)="。" ,ROW(INDIRECT("A1:A"&LEN(E5)))))+1 ,LEN(E5)-ROW(INDIRECT("A1:A"&LEN(E5)))+1) と入力して(上の4行はつながっている1つの式です)、これは配列数式なので、 Ctrl+Shift+Enter で確定します。 うまく確定できれば、数式の窓で、上の式が {上式} のようにカギカッコで囲まれて見えます。 失敗したら、F2キーを押して編集モードにして、再度Ctrl+Shift+Enterとしてみてください。 また、上の式は文字列の長さを任意(最大行数まで)としています。例えば、100文字が最大なら、 =MID(E5, MAX(IF(MID(E5,ROW(INDIRECT("A1:A100")),1)="。" ,ROW(INDIRECT("A1:A100"))))+1, 100) のようにしてかまいません。 <チョッと説明> 普通の関数だけでは、一番右の『。』の位置の特定に苦労します。 上の式では、  ROW(INDIRECT("A1:A"&LEN(E5))) と 配列数式 でVBAのForNextのような意味合いを行っています。 この方法で、Excelの式に特殊な繰り返しを行わせることができるはずです。 ただ、ユーザー定義関数を書けば、非常に簡単なことを考えると、VBAの威力を再認識します。 ご参考に。(WinXP、Excel2000です)

noname#18526
質問者

補足

皆さんのご協で仕事が楽になりつつあります。すばらしい!

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

こんばんは。 関数処理ということで、ユーザー定義関数にしました。 最後の句点の句点を探すパターンを使用しました。正規表現のパターンで組めれば、多少の変化には対応できます。 '<標準モジュールのみ> Function GetPostPunctuation(arg As String) As String   Dim Matches As Object   Dim Match As Object   Dim ArgTmp As String   Dim buf As String   ArgTmp = Replace(arg, Chr(&HA1), "。")   With CreateObject("VBScript.RegExp")    .Global = False '検索は一回きり    .IgnoreCase = True '大文字小文字なし    .Pattern = "(.*。)([^。]+)$" 'パターン    If .Test(arg) = False Then      If InStr(ArgTmp, "。") = 0 Then       buf = arg       Else       buf = ""      End If      GetPostPunctuation = buf      Exit Function    End If        Set Matches = .Execute(ArgTmp)    For Each Match In Matches      buf = .Replace(Match.Value, "$2")    Next Match   End With   GetPostPunctuation = buf End Function 実際は、以下がイレギュラーのようです。 >「明日は雨か」→「明日は雨か」 使用方法はこのようにします。 =GetPostPunctuation(A5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

ユーザー関数にしてみました。下記aftは好きな英数の名前をつけてよい。 Function aft(A) p = 0 Do s = p + 1 p = InStr(s, A, "。") Loop While p <> 0 aft = Mid(A, s, Len(A) - s + 1) End Function 標準モジュールに貼り付ける。 シートのセルに =aft(A1) と入れる。(A1に文字列があるものとする。) (例) How are you? こんにちは。東京。日本。 How are you? こんにちは。東京。日本 日本 明日は雨か 明日は雨か

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

ユーザー定義関数で、、、 F5 に =myFunc(E5) Function myFunc(r As Range) As String Application.Volatile If InStr(1, r.Text, "。", vbTextCompare) = 0 Then   myFunc = r.Text Else   For i = Len(r.Text) To 1 Step -1    If Mid(r.Text, i, 1) = "。" Then      myFunc = Right(r.Text, Len(r.Text) - i)      Exit For    End If   Next i End If End Function

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.2

取り敢えず一例です。 Sub 抽出() Dim i As Integer Dim j As Integer Dim str As String str = Sheet1.Cells(5, 5) j = 0 For i = 1 To Len(str) If Mid(str, i, 1) = "。" _ Then j = i Next i Sheet1.Cells(5, 6) = Right(str, Len(str) - j) End Sub

  • ramuta
  • ベストアンサー率32% (74/227)
回答No.1

処理用に列を何列か使ってしまいますが、 LENとINSTRとMIDとIFだけで出来ると思いますね。 >LENで全体の文字数をチェック >INSTRで「。」の位置をチェック >MIDで「。」以降の文字を抜き取り これで列に文字を切り出して、隣の列に更に次の「。」以降の 文字を切り出してと言うのを一文に含まれる「。」の最大数繰り返して 最後の列をIFで決めれば行けますね。 http://www.moug.net/tech/exvba/0140016.htm ↑これが比較的近いですかね http://www.moug.net/tech/exvba/0140036.htm ↑Excel2000以降であればこれを使うともっと楽ですね。 式も書いておきたいのですけどちょっと今は書けません・・・

関連するQ&A