人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: u-chan
●カテゴリ:コンピュータ
✍キーワード:スプリット セル バイト 関数
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● りくっち
●20ポイント

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

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

前半部分=LEFTB(A1,B1)

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

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

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

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

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


2については、

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

◎質問者からの返答

ありがとうございます。

2.は、

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

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

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


2 ● bomby
●20ポイント

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

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

でどうでしょうか?

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

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

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

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

◎質問者からの返答

ありがとうございます。


3 ● hokuraku
●20ポイント

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)))

のようになります。


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

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

◎質問者からの返答

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


4 ● りくっち
●20ポイント ベストアンサー

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


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

先ほどの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内の「$」を「△」や「○」などの記号に変えて使用してください。

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


以上ご参考まで。

◎質問者からの返答

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

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

大変助かりました。


5 ● たか
●20ポイント

上記の方とは別に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(文字列,バイト数,前後フラグ)」でいけます。


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

◎質問者からの返答

ありがとうございます。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ