質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

Excelでセル内の文字列をカウントする。

解決済

回答 3

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 349

zuzu1984

score 17

[B2]のようにセル内に複数行の文章がある場合、各行の文字数を知りたいです。

・[C2]に1行目を書き出させています。
([C3]は式です)
・[C5]は1行目のカウント数です。
([C6]は式です)
・[B2]のような文章が[B3]以下に続きます。
イメージ説明

以下が知りたいです。
①2行目の文章の求め方
②3行目の文章の求め方
③以下のように、1~3行目の文字数を一気にカウントすることは出来るのしょうか。
イメージ説明

お知恵を貸していただければ幸いです。
宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

各行をC2,C3,C4に取得。

C2セル
=LEFT(B2,FIND(CHAR(10),B2)-1)
C3セル
=LEFT(SUBSTITUTE(B2,C2&CHAR(10),"",1),FIND(CHAR(10),SUBSTITUTE(B2,C2&CHAR(10),"",1))-1)
C4セル
=SUBSTITUTE(B2,C2&CHAR(10)&C3&CHAR(10),"",1)


上記は抽出した結果を使いまわしています。
C3はC2を参照、C4はC2とC3を参照しています。
なので、1セルで完結させるためには使いまわさないようにする必要があります。
展開するとこうなります。

C2セル
=LEFT(B2,FIND(CHAR(10),B2)-1)
C3セル
=LEFT(SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1),FIND(CHAR(10),SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1))-1)
C4セル
=SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10)&LEFT(SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1),FIND(CHAR(10),SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1))-1)&CHAR(10),"",1)


そして1セル内で各行の文字数を出力するには、上記の結果をLENすれば良いので、連結してこうなります。

=LEN(LEFT(B2,FIND(CHAR(10),B2)-1))&CHAR(10)&LEN(LEFT(SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1),FIND(CHAR(10),SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1))-1))&CHAR(10)&LEN(SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10)&LEFT(SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1),FIND(CHAR(10),SUBSTITUTE(B2,LEFT(B2,FIND(CHAR(10),B2)-1)&CHAR(10),"",1))-1)&CHAR(10),"",1))


※3行限定の処理です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 23:25

    この式を考えられるなんて凄いです。
    頭が整理できず、かなり前半で思考停止してしまっていました。
    式も勿論ですが、答えからこういう考え方をしたらいい、と今後に役立たさせて頂きます。
    理が党ございました。

    キャンセル

0

1つのセルというのは無理がありますが、図のようにC5にカウントを置いて、かつD2に値を抽出して…というやり方ならMID関数を使えばいいですよ。
一つ目の改行以降の文字列を取得する
MID関数

MID(B2,C5,LEN(B2))


理屈を説明するとMID(対象列,検索開始する文字列の始点,始点から取得する文字数)となりますので、後はそれを繰り返していくだけで何行あっても対応可能です。

もし、一つのセルにしたい場合は計算シートだけ別に作っておいて、計算値だけをあとで埋め込ませたらいいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

エクセルのワークシート関数で処理するのは、できなくはないけれど少し苦手というか面倒な部類になると思います。
どうしてもということであれば、ttyp03さんのアドバイスのような方法で実現できますが、ご覧のとおり1セルで実現するには非常に長い式の羅列になりますし、説明にもある通り行数の制約もできてしまいます。

今回の質問タグには含まれていませんが、VBAを視野に入れられるのならもう少しスマートな対応が可能です。

例えばVBAで「標準モジュール」に以下のような関数を作成します。

'文字列sを指定文字sepで区切り、r番目の要素を取り出す関数
Function SplitLine(ByVal s As String, ByVal r As Integer, Optional ByVal sep As String = vbLf) As String

    'セルの値を指定した区切り文字(規定値は改行(CHAR(10))で分割
    Dim ary
    ary = Split(s, sep)

    '指定された番号が、分割した数よりも大きい場合は処理中断
    If UBound(ary) < r - 1 Then Exit Function

    '指定された番号の要素を戻り値として返す
    SplitLine = ary(r - 1)

End Function


上記は、第一引数に指定した文字を、第三引数の区切り文字(指定しない場合は改行文字)で分割し、第二引数で指定された番号の部分を抜き出す関数です。
これを作成しておくと、SplitLine関数はワークシート上でも利用できる関数となります。

例えばC2セルに=SplitLine(B2, 1)と記述すれば1行目の"Please use an appropriate amount"が取得できます。
また=Len(SplitLine(B2, 2))とすれば2行目の文字数を出力することができます。


勝手にVBAでのアドバイスをしてしまいましたが、参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 23:26

    やはり、エクセル関数だけで対応するのは、しんどいですね。
    VBAも考えて頂き、大変参考になります。
    自分も、頭の柔軟性を養いたいと思います。
    御協力頂き、誠にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる