[[20190121161218]] 『セル内の文字数と改行数の確認』(ルイボス) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル内の文字数と改行数の確認』(ルイボス)

1つのセルに文字列が、改行を含めて入力されている。
例:)朝ご飯は、
   食べていません。
   お腹がすきました。
【欲しい結果】
1.このセル内の行数
2.1行ごとの文字数カウント
3.このセル内の文字数カウント

最終的には、条件付き書式や、作業セル内で警告表示を行う予定です。
マクロではなく、関数で行うことは可能でしょうか?
自分が調べた範囲だとマクロしかないのかなと思います。

もしマクロしか解決できないなら欲しい結果を判定するための簡単なサンプルコードみたいなのを書いてもらえればありがたいです。
最悪VBA関数名だけでも大丈夫です。

大変難しいとは思いますが、よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 1.=LEN(A1)-LEN(SUBSTITUTE(A1,CHAR(10),""))+1
 3.=LEN(SUBSTITUTE(A1,CHAR(10),""))
 でどうだろうか?
 2は考え中。
 で、2に関して確認。
 文中にスペースが入っていることはあるだろうか?
(ねむねむ) 2019/01/21(月) 16:24

2番の数式案なぞ。
何文字ずつなのかを、どういう表現で出力したいのか判りませんが、1行につき1セルの文字長として、横に連ねるのはいかがでしょうか。

文字数を出力する最初の列を以下の式として、これを必要な行数分、右にドラッグコピーしてください。(行数を超えたら…、という判定は入れていないので、途中から0になります)

 =LEN(CLEAN(MID(SUBSTITUTE($A1,CHAR(10),REPT(CHAR(9),100)),100*COLUMN(A1)-99,100)))

スペース文字も1文字としてカウントされます。(ねむねむさんがスペース文字を気にしているということは、スペース無しなら何か妙案があるのですかね? 私は思いつけませんでした)
(???) 2019/01/21(月) 16:56


 スペースなしならCLEANの代わりにTRIM、CHAR(9)の代わりに" "となるだけで、式そのものは???さんと同じになる。
(ねむねむ) 2019/01/21(月) 17:03

なるほど、納得です。
CLEANならTAB文字でも消せる、というのは、以前誰かの回答で見て覚えました。
(???) 2019/01/21(月) 17:19

ねむねむさん ???さん お早い回答ありがとうございます!

2.に関しては、スペースが入ることはありません。
式的には↓でよいでしょうか?

 =LEN(TRIM(MID(SUBSTITUTE($A1,CHAR(10),REPT("",100)),100*COLUMN(A1)-99,100)))

また、大変申し訳ありませんが、お二人が利用なさっている関数が、LEN以外さっぱりわかりません。
簡単で構いませんので、「引数Aを参照、引数Bで引数Aを元に計算」みたいな実用的な解説をしていただけるとありがたいです!

解説に関しては、こちらで様々な要件に対応するために、変数や引数などを変更することがあるかもしれない
のでお願いしたいです。
そして、実際にExcel上で組み込むのに少し時間がかかりそうです。(別の作業と並行しているため)
またしばらくしたら書き込むことがあるかもしれません。

本掲示板は基本的に閲覧状態ですので、質問等あれば随時させていただきます。
よろしくお願いします。
(ルイボス) 2019/01/21(月) 17:45


1番は、元の文字長 - 改行を消した文字長、つまり改行の個数が行数だ、という式です。+1 しているのは、末尾行には改行コードが付いていないから。

2番は、改行コード1つをTAB文字100個(空文字100個じゃ駄目ですよ?)に置き換えてしまい、列位置に応じた位置から100文字取り出すことで、前後に余分なTABがくっついたままの、目的の行の文字列を抜き出してます。 実際の行毎の文字長分、切り出し位置はずれるのですが、余分なTAB文字でカバーしている訳ですね。 その後、CLEANで余分なTAB文字を消すと、目的の行の文字列だけになるので、その長さを得てる、と。

3番は、改行を消した文字長を得ているだけですね。
(???) 2019/01/21(月) 18:11


???さん

ありがとうございます。
前提として、
 SUBSTITUNE = 特定の文字列の捜査
 CHAR(10) = TAB(改行コード)
という認識でよいでしょうか?

2.だけが処理順を丁寧に追わないとちゃんと理解はできなさそうですね…
単純な計算や抽出ではないので、なかなか難しいですね…
(ルイボス) 2019/01/21(月) 19:41


  1と3は 2と各々を利用すればよさげっすね。

 -----------------------------------------------
 (1) 1 と 2 を 今までの数式利用

  3 =SUM(2の範囲)

  または

  3 =LEN(A1)-(1の結果)+1

 -----------------------------------------------

 (2) 2 と 3 を 今までの数式利用

  1 = COUNT(2の範囲)

  または

  1 =LEN(A1)-(3の結果)+1  
(GobGob) 2019/01/22(火) 08:44

	A	B	C	D
	AAA			
1	BB	3	2	6
	CCCC			

 B1 =LEN(LEFT($A1,FIND(CHAR(10),$A1&CHAR(10),SUM($A1:A1)+COLUMN(A1))-1))-SUM($A1:A1)-COUNT($A1:A1)

 でもいいかも。

 ※改行コードの位置を順番に見て文字数出してます。

 なお、

 CHAR(10) は 改行、 CHAR(9) がTAB。
(GobGob) 2019/01/22(火) 09:11

2番目を図解してみます。 \は、TAB文字だと思ってください。TAB100個だと長いので、説明用に10個で表現しています。
私が考えたロジックではありませんが、Excelの数式でよく利用される方法ですね。(GobGobさん案は、これとは違う方法です。長い文字列を経由しないので、無駄が無いですね)

 (1)セル内の文字列
 ABC
 DEFG
 HI

 (2)改行をTAB10個に置換したところ。
 ABC\\\\\\\\\\DEFG\\\\\\\\\\HI

 (3)10文字ずつ取り出したところ。
 ABC\\\\\\\	\\\DEFG\\\	\\\\\\\HI

 (4)TAB文字を消す。
 ABC	DEFG	HI
(???) 2019/01/22(火) 09:34

 ちょっと気になるのは

 >最終的には、条件付き書式や、作業セル内で警告表示

 コレ。。。。

 改行毎の文字列数を限定するの?
(GobGob) 2019/01/22(火) 09:51

 ???さん案で。

 例:1セルに必ず3行、4文字以内じゃないと書式変える ・・・ として。

 条件付き書式

 =SUM((TEXT(LEN(TRIM(MID(SUBSTITUTE(A1,CHAR(10),REPT(" ",100)),ROW($1:$10)*100-99,100))),"[=0]!0;[<5]!1;!0"))*10^(ROW($1:$10)-1))<>111

 書式設定。
(GobGob) 2019/01/22(火) 10:26

GobGobさん

丁寧な解説ありがとうございます!

行数の上限を指定するような設定を行います。
 例:)20文字、3行まで
という感じで制限を付け、それに反する場合条件付き書式で着色するような感じです。

今回お聞きした3つの欲しい結果を条件付き書式に落とし込んで着色ルールとする感じです。
(ルイボス) 2019/01/22(火) 11:08


 >例:)20文字、3行まで 

 これなら 2 の条件 いらないんじゃない?

 ねむねむさん案で。

 条件付き書式

 =OR(LEN(A1)-LEN(SUBSTITUTE(A1,CHAR(10),""))>2,LEN(SUBSTITUTE(A1,CHAR(10),""))>20)
(GobGob) 2019/01/22(火) 11:22

 1行当たり20文字までということであれば
  条件としてはこうだろうか?
 =OR(MAX(LEN(TRIM(MID(SUBSTITUTE(A1,CHAR(10),REPT(" ",100)),100*ROW($1:$3)-99,100))))>20,LEN(A1)-LEN(SUBSTITUTE(A1,CHAR(10),""))>2)
 か?
(ねむねむ) 2019/01/22(火) 11:25

GubGubさん ねむねむさん

すいません!求めたい結果がぶれてるので、再定義させてください!!

・条件付き書式として設定する。
・確認セルは G5 から下のセルすべてが対象。
1.1行ごとの文字数制限
2.1セル内の行数制限

上記の制限をかけたい場合はどうなるのでしょうか?
また、12時までの組み込みなので、なるはやだと嬉しいです!
無茶を言っていますが、よろしくお願いいたします。
(ルイボス) 2019/01/22(火) 11:31


 >1.1行ごとの文字数制限

 これはセル単位の行なの?セル内改行なの?

 セル内改行なら、ねむねむさん案でいいのでは?(A1をG5に変えて範囲で指定すればいいだけ)
(GobGob) 2019/01/22(火) 11:38

ねむねむさん GubGubさん

ねむねむさん の提示してくださった式だと、行数チェックは問題なく動いたのですが、
文字数制限の部分だけうまく動かないです。

制限以下の文字数だが、警告表示になる。

>1行ごとの文字数制限
『セル内の文字数/行数』でお願いします。
(ルイボス) 2019/01/22(火) 11:42


すいません。行数チェックは入ってるっぽいですが、どうにもエラーが出てます。

出てる箇所の共通は、

1.3行ある。(3行以上) 2.ある程度の文字数がある。 ように見られます。
(ルイボス) 2019/01/22(火) 11:48

 G5セルに文字列があるとして。
 空いているセルに
 =LEN(TRIM(MID(SUBSTITUTE($G$5,CHAR(10),REPT(" ",100)),100*ROW(A1)-99,100)))
 と入力して下へフィルコピーすると何と表示されるだろうか?
(ねむねむ) 2019/01/22(火) 11:50

以下結果です。

16  G6
19   :
0
0
0

(ルイボス) 2019/01/22(火) 11:52


3行あり、おかしいところへのフィル結果

13
17
19
0

(ルイボス) 2019/01/22(火) 11:55


ちなみに、文字数カウントの20はそのまま使うとダメっぽいです。(日本語だと文字コードで2つ使うから?)
40に変更して確認しています。

(ルイボス) 2019/01/22(火) 11:56


 念のため条件付き書式で設定している数式をそのままコピーして掲示板に張り付けてくれないか?
 なお、LEN関数は全角も半角も区別せず一文字を1と数える。
(ねむねむ) 2019/01/22(火) 11:59

=OR(LEN(G5)-LEN(SUBSTITUTE(G5,CHAR(10),""))>2,LEN(SUBSTITUTE(G5,CHAR(10),""))>=40)

↑使ってます
(ルイボス) 2019/01/22(火) 12:00


 >セル内改行なら、ねむねむさん案でいいのでは?(A1をG5に変えて範囲で指定すればいいだけ)

 こっちね。

 =OR(MAX(LEN(TRIM(MID(SUBSTITUTE(A1,CHAR(10),REPT(" ",100)),100*ROW($1:$3)-99,100))))>20,LEN(A1)-LEN(SUBSTITUTE(A1,CHAR(10),""))>2)

 ※ねむねむさん 11:25回答の数式
(GobGob) 2019/01/22(火) 12:17

GubGubさん

ねむねむさん

ありがとうございます!

そもそも使うもの間違えてたんですね。申し訳ありません。
↑の式適応したらうまくいきました!
処理チェックをかけてみて問題なさそうだったのでここまでに記載していただいた解説を読み返して、
自分の理解を深めておきます!

ありがとうございました!
(ルイボス) 2019/01/22(火) 14:39


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.