【Excel2003】1つのセル内にある長文を前半部分、後半部分に分けて、2つのセルにスプリットしたいのですが、


1.バイト数指定してスプリットできる方法(関数)はあるでしょうか?
2.指定バイト数の直前の "、" "。" で切れるとなお可です。

教えていただければ幸いです。

回答の条件
  • 1人3回まで
  • 登録:2007/05/16 21:52:59
  • 終了:2007/05/17 22:35:37

ベストアンサー

id:rikuzai No.4

りくっち回答回数1366ベストアンサー獲得回数1412007/05/16 23:56:00

ポイント20pt

それではお言葉に甘えて再回答いたします。


全て全角ということですので、ここは少しでも数式の文字数を減らすために文字数指定の関数を使用することにします。

先ほどの1のケースでは作業セルが一つで十分でしたが、

作業セルを使用しない方向で書いていたら気持ち悪い長さになってしまったので、

更に作業セルを二つ増やした形で算出してみました。


A1=長文

B1=指定文字数

C1=FIND("$",SUBSTITUTE(LEFT(A1,B1),"、","$",B1-LEN(SUBSTITUTE(LEFT(A1,B1),"、",""))))

D1=FIND("$",SUBSTITUTE(LEFT(A1,B1),"。","$",B1-LEN(SUBSTITUTE(LEFT(A1,B1),"。",""))))

E1=IF(AND((ISERROR(C1)),ISERROR(D1)),LEFT(A1,B1),IF(AND(N(C1),ISERROR(D1)),LEFT(A1,C1),IF(AND(N(D1),ISERROR(C1)),LEFT(A1,D1),IF(C1>D1,LEFT(A1,C1),LEFT(A1,D1)))))

F1=MID(A1,LEN(E1)+1,LEN(A1)-LEN(E1))


C1は指定文字数で切った文字列の中にある「、」の一番最後は何文字目にあるかを算出。

D1は指定文字数で切った文字列の中にある「。」の一番最後は何文字目にあるかを算出。

E1が長文前半、F1が後半を表示します。


ただし、(まずないと思いますが)長文内に「$」が含まれることがあるようでしたら、

C1、D1内の「$」を「△」や「○」などの記号に変えて使用してください。

(長文内に絶対含まれない文字ならなんでも構いません)


以上ご参考まで。

id:u-chan

...ここまで必要なんですね。

詳しく教えていただきありがとうございました。

大変助かりました。

2007/05/17 22:33:26

その他の回答(4件)

id:rikuzai No.1

りくっち回答回数1366ベストアンサー獲得回数1412007/05/16 22:36:19

ポイント20pt

1については問題ありません。

A1に長文、B1に指定バイト数が入力されているとして、

前半部分=LEFTB(A1,B1)

後半部分=MIDB(A1,B1+1,LENB(A1)-B1)

で分けることができます。

ただしバイト数なので境界に全角文字が含まれる場合きれいに分けることができません。

全角を含む場合は文字数指定のLEFT、MIDを使用したほうがよいかと思います。

全角・半角を含む文字列をバイト数できれいに分けるにはまた別の関数をかませる必要がでてきます。


2については、

  • 文字列が全角か半角か混合か、
  • 長文の中に、。が複数含まれるのか、一つだけか

これによって数式がかわってきますので、返信で教えていただければコメント欄で補足いたします。

id:u-chan

ありがとうございます。

2.は、

[文字列が全角か半角か混合か]⇒全角のみです

[長文の中に、。が複数含まれるのか、一つだけか]⇒単複両方のケースでご教授ください。

※ 貴重なご回答ですので、再回答いただいて構いません。ご遠慮なくお願いいたします。

2007/05/16 22:42:52
id:bomby No.2

bomby回答回数4ベストアンサー獲得回数02007/05/16 22:41:06

ポイント20pt

=LEFTB(文字列,バイト数)

=RIGHTB(文字列,LENB(文字列)-バイト数)

でどうでしょうか?

ただし、バイト数は半角単位のため、全角文字列の場合は偶数で

指定しないといけません。

ちなみにすべての関数からBをとると、全角も半角も1文字と

数えてバイト数ではなく文字数での指定になります。

id:u-chan

ありがとうございます。

2007/05/16 22:45:45
id:hokuraku No.3

hokuraku回答回数529ベストアンサー獲得回数972007/05/16 22:50:56

ポイント20pt

A1セルに対象の長文が入ってるとします。


=RIGHTB(A1,LEN(A1)-X)

でXバイト目から後の文字列が取り出せます。

なお、文字数で行いたいのなら

=RIGHT(A1,LEN(A1)-X)

です。

同様に前半部分を取り出すには

=LEFTB(A1,X)

=LEFT(A1,X)

です。


次に、Xバイト目から一番最初の「。」または「、」から取り出すには、先ほどの式のXの部分を

MIN(FIND("。",A1,X),FIND("、",A1,X))

に書き換えて

=RIGHT(A1,LEN(A1)-MIN(FIND("。",A1,X),FIND("、",A1,X)))

のようになります。


直前は…ちょっと大変そうなので直後でダメな場合レスください。

コメント欄開放していただければ考えてそちらで回答します。

id:u-chan

ありがとうございました。

2007/05/17 22:33:29
id:rikuzai No.4

りくっち回答回数1366ベストアンサー獲得回数1412007/05/16 23:56:00ここでベストアンサー

ポイント20pt

それではお言葉に甘えて再回答いたします。


全て全角ということですので、ここは少しでも数式の文字数を減らすために文字数指定の関数を使用することにします。

先ほどの1のケースでは作業セルが一つで十分でしたが、

作業セルを使用しない方向で書いていたら気持ち悪い長さになってしまったので、

更に作業セルを二つ増やした形で算出してみました。


A1=長文

B1=指定文字数

C1=FIND("$",SUBSTITUTE(LEFT(A1,B1),"、","$",B1-LEN(SUBSTITUTE(LEFT(A1,B1),"、",""))))

D1=FIND("$",SUBSTITUTE(LEFT(A1,B1),"。","$",B1-LEN(SUBSTITUTE(LEFT(A1,B1),"。",""))))

E1=IF(AND((ISERROR(C1)),ISERROR(D1)),LEFT(A1,B1),IF(AND(N(C1),ISERROR(D1)),LEFT(A1,C1),IF(AND(N(D1),ISERROR(C1)),LEFT(A1,D1),IF(C1>D1,LEFT(A1,C1),LEFT(A1,D1)))))

F1=MID(A1,LEN(E1)+1,LEN(A1)-LEN(E1))


C1は指定文字数で切った文字列の中にある「、」の一番最後は何文字目にあるかを算出。

D1は指定文字数で切った文字列の中にある「。」の一番最後は何文字目にあるかを算出。

E1が長文前半、F1が後半を表示します。


ただし、(まずないと思いますが)長文内に「$」が含まれることがあるようでしたら、

C1、D1内の「$」を「△」や「○」などの記号に変えて使用してください。

(長文内に絶対含まれない文字ならなんでも構いません)


以上ご参考まで。

id:u-chan

...ここまで必要なんですね。

詳しく教えていただきありがとうございました。

大変助かりました。

2007/05/17 22:33:26
id:takashi_m17 No.5

たか回答回数104ベストアンサー獲得回数122007/05/17 10:23:41

ポイント20pt

上記の方とは別にVBAを使ったユーザー定義関数を使ってみました。


'「前後」引数は0=前、1=後
Function B_Split(文字列, 区切バイト数, 前後)

    x = LeftB(文字列, 区切バイト数)
    
    '区切バイト数手前の句読点を検索しその場所をintSrchに返す
    intSrch = InStrRev(x, "、")
    If intSrch < InStrRev(x, "。") Then
        intSrch = InStrRev(x, "。")
    End If
    
    '区切り位置内に句読点が無い場合、区切バイト数で区切る
    If intSrch = 0 Then
        intSrch = Len(x)
    End If
    
    '前後判定し、intSrchの場所で区切る
    If 前後 = 0 Then
        y = Left(文字列, intSrch)
    Else
        y = Right(文字列, Len(文字列) - intSrch)
    End If
    
    B_Split = y

End Function

VBEでモジュールを追加し、上記のコードを貼り付け。

セルに「=B_Split(文字列,バイト数,前後フラグ)」でいけます。


ユーザー定義関数について

id:u-chan

ありがとうございます。

VBAは使えないので、ちょっと躊躇していますが、トライしてみます。

2007/05/17 22:35:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません