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

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

新規登録して質問してみよう
ただいま回答率
85.51%

Q&A

解決済

1回答

2790閲覧

配列数式での判定が期待通りにならない

sazi

総合スコア25085

1グッド

0クリップ

投稿2017/09/11 09:36

編集2017/09/11 15:07

###前提・実現したいこと
VBAを使用せず数式のみで、数字と数字以外がランダムな全角/半角混在の文字列から、出現する連続した数字(1文字含む)のうち最後尾のものを取り出したい。

VBAで行った方が簡潔なのは分かっています。
こちらの質問で、ハマってしまいました。
###発生している問題・エラーメッセージ
以下の手順で取り出そうとしていますが、③のNOT判定が意図通りに動作しません。
何か記述に足りないところがあるのでしょうか?

①文字列の最後尾にある数字の位置を取得(=B1)
※文字列分の配列をROW()関数で生成し、MID()により1文字ずつ、"0"~"9"に含まれるかの判定結果と文字位置との積を取りTrueとなる文字位置の配列の最大値を求める。

②①の位置までの文字列を生成(=C1)

③②文字列の最後尾にある数字以外の位置を取得(=D1)
※対象文字列と判定が逆転している以外は①に同じ。

④文字列より③と①で挟まれる文字列を取得(=E1)

###該当のソースコード

A1="あいうえお12345かきくけこ67890さしすせそ" B1=MAX((MID(ASC(A1),ROW(INDIRECT("1:"&LEN(A1))),1)={"1","2","3","4","5","6","7","8","9","0"})*ROW(INDIRECT("1:"&LEN(A1)))) C1=MID(A1,1,B1) D1=MAX((MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"1","2","3","4","5","6","7","8","9","0"})*ROW(INDIRECT("1:"&LEN(C1)))) E1=MID(A1,D1+1,B1-D1)

※先頭のA1~D1はセルの位置を表したものです。B1およびD1は、ctrl+shift+enterによる配列数式です。

上記例では、B1=20となり正しい結果ですが、D1=15となって欲しいのにD1=20となります。
###試したこと
NOT()関数に変更したり、ISERROR()とFIND()の組み合わせに変更したりしてみましたが、同様の結果です。

###補足情報(言語/FW/ツール等のバージョンなど)
Excel 2010
Windows 10

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

解決策は、わからないですが記述に問題があるのは、わかります。
単純にいうと、

※対象文字列と判定が逆転している以外は①に同じ。

が、問題です。①は一致していることを確認するので、orになりますが、③は反転させるので、andとしなくてはいけません。
いわゆるドモルガンの式にしないとダメなやつです。

実際に

D1=MAX((MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"0"})*ROW(INDIRECT("1:"&LEN(C1))))

にすると、20でなく19となるので、腑に落ちるかと。

で、解決策が思い浮かばず・・・
あまり数式を理解しきれていないのですが、以下のようにすると想定通りになりますが、
もっときれいな書き方あるかもしれません。

D1=MAX((MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"0"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"9"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"8"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"7"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"6"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"5"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"4"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"3"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"2"}) *(MID(ASC(C1),ROW(INDIRECT("1:"&LEN(C1))),1)<>{"1"}) *ROW(INDIRECT("1:"&LEN(C1))))

投稿2017/09/11 10:48

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/09/11 12:53 編集

回答ありがとうございます。 成程、言われてみれば確かに。 理由が分かってすっきりしました。 後は、簡潔な書き方ができるかどうかですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問