- ベストアンサー
最後の句点のあとの文字列を別のセルにコピーする
セル(E5)に、文字列データがあります。いろいろな種類です。全角英数・半角英数・漢字・カタカナ・ひらがな。記号など。 その中に句点「。」が何個かありますが、最後の句点からあとの文字列を抽出して、セル(F5)に表示します。 例 「本日は晴天なり。It is fine today。明日はどうでしょうか。終わり」→「終わり」 「How are you? こんにちは。東京。日本。」→「」 「明日は雨か」→「明日は雨か」 「昨日は曇りでした。昨日は曇りでした。昨日は曇りでした。that's all.」→「that's all.」 ---- できれば関数で、・・無理でしたら、マクロ、VBAでもかまいません。VBAで作っていますが、思うように動いてくれません。 Mid関数で、句点の数を把握して、最後の句点の語順を把握し、それ以降の文字列を別のセルに移す。・・・ これでもいいようですが、かなり乱雑なラインになってしまいそうです。 先の質問で、関数でも処理できる回答を頂きまして、何か関数処理が出来そうな気がしてきました。そのほか、VBAでもシンプルなもながありましたらお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
Public Function lastword(s As String) As String Dim a a = Split(s, "。") lastword = a(UBound(a)) End Function
その他の回答 (6)
- nishi6
- ベストアンサー率67% (869/1280)
>できれば関数で、 無理やり、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です)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 関数処理ということで、ユーザー定義関数にしました。 最後の句点の句点を探すパターンを使用しました。正規表現のパターンで組めれば、多少の変化には対応できます。 '<標準モジュールのみ> 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)
ユーザー関数にしてみました。下記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)
ユーザー定義関数で、、、 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)
取り敢えず一例です。 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)
処理用に列を何列か使ってしまいますが、 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以降であればこれを使うともっと楽ですね。 式も書いておきたいのですけどちょっと今は書けません・・・
補足
皆さんのご協で仕事が楽になりつつあります。すばらしい!