[[20220706111947]] 『ワークシートで LTRIM・RTRIM 』(まなぶ君) ページの最後に飛ぶ

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

 

『ワークシートで LTRIM・RTRIM 』(まなぶ君)

 いつもここで勉強させていただいております。
 質問というかお願いは以下のとおりです。

 ワークシート関数に TRIM はありますが、VBA関数にある LTRIM 及び RTRIM はなく、時折不便を感じております。
 そこで、LTRIM や RTRIM の機能を、ワークシート上で使える別の関数で、汎用的に表現することは可能でしょうか?
 これができたら色んなシーンで使えると思い、達人が集うここならと思いお願いしてみました。

 以上、よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 ワークシートのTRIM関数は文字列の前後のスペースを削除、文字列中のスペースを圧縮(スペースが複数連続している場合一文字だけにする)
 対してVBAのTRIM関数は前後のスペースだけを削除と違いがあるがLTRIM、RTRIMを関数で再現する場合、
 文字列中のスペースの圧縮は必要だろうか?
(ねむねむ) 2022/07/06(水) 11:36

 他のワークシート関数で同等のことは再現できるでしょうけど、
 関数一つを入力するだけというわけにはいかないと思います。

 | 汎用的に表現する
 ということならユーザー定義関数ということになるでしょう。
 それならいっそ、
 Function LTRIM(s As String) As String
     LTRIM = VBA.LTRIM(s)
 End Function
 などと、個人用マクロBOOKに登録しておいて、
 ユーザー定義関数としてLTRIM,RTRIMなどを使ったらダメなんですか?
 # ワークシート関数TRIMを便利と思うことはあっても逆は余りなかったですね。
(γ) 2022/07/06(水) 11:53

 ねむねむ様

 有難うございます。
 LTRIM、RTRIMを再現できればと考えていましたので、文字列中のスペースの圧縮は考えておりませんでした(圧縮はむしろ困るかも)。

 γ様

 有難うございます。
 できればご提案のユーザー定義関数以外を希望します。
 個人(私の業務)的にはTRIMを使うことはまずなく、VBAでLTRIM・RTRIMしてからデータ処理するというのがほとんどです。

(まなぶ君) 2022/07/06(水) 12:41


 とりあえず組んでみた。
 対象の文字列の長さが20文字まで。
 LTRIM:=REPLACE(A1,1,AGGREGATE(15,6,ROW($1:$20)/(MID(ASC(A1),ROW($1:$20),1)<>" "),1)-1,"")
 RTRIM:=LEFT(A1,AGGREGATE(14,6,ROW($1:$20)/(MID(ASC(A1)&REPT(" ",20),ROW($1:$20),1)<>" "),1))
 で、どうだろうか?
(ねむねむ) 2022/07/06(水) 13:39

 =LAMBDA(s,LET(ss,LEFT(TRIM(s),1),i,FIND(ss,s),MID(s,i,LEN(s)))) 
 この式をLTRIMとして名前の定義するのはどうでしょう

 RTRIMはちょっとアイディアわきません
(´・ω・`) 2022/07/06(水) 13:54

昔は RTRIMをやろうと思ったらめんどくさい計算が必要でしたけど
Microsoft365なら簡単です。

LTRIM:=REPLACE(A1,1,FIND(LEFT(TRIM(A1)),A1)-1,"")

RTRIM:=LEFT(A1,XMATCH(1,N(MID(A1,SEQUENCE(LEN(A1)),1)=RIGHT(TRIM(A1))),0,-1))
(d-q-t-p) 2022/07/06(水) 14:04


RTRIMに IFERROR入れるの忘れてました。「=IFERROR(……,A1)」にネストしてください。
配列を使わないならこんな方法もあります。

=LEFT(A1,FIND(RIGHT(TRIM(A1))&REPT("♪",LEN(A1)),SUBSTITUTE(SUBSTITUTE(A1," "," ")," ","♪")&REPT("♪",LEN(A1))))
(d-q-t-p) 2022/07/06(水) 14:15


 ねむねむ様、(´・ω・`) 様、d-q-t-p様

 みなさんの数式を試してみましたが、LTRIM・RTRIMが再現できました。
 すごいです。

 ただし、数式の意味はまだ全く理解できていないので、後で解析したいと思います。
 有難うございました。

 でもMicrosoftが最初から用意してくれさえすれば・・・とは思います。

(まなぶ君) 2022/07/06(水) 14:27


 未確認ですが、
 愚直に
 LTRIMとして名前定義 =LAMBDA(s,IF(LEFT(s,1)=" ",LTRIM(RIGHT(s,LEN(s)-1),s))
 RTRIMとして名前定義 =LAMBDA(s,IF(LEFT(s,1)=" ",RTRIM(LEFT(s,LEN(s)-1),s))
 としてもいいかもしれません
(´・ω・`) 2022/07/06(水) 14:32

>でもMicrosoftが最初から用意してくれさえすれば・・・とは思います。
私の手法だと
B1: =LTRIM(A1)
と書くだけです。
個人用マクロブックが気に入らなければ、そのBookの標準モジュールに
置くだけです。
=RTRIM(LTRIM(A1))などと組み合わせることも可能です。
用意してくれていると言えなくもない。
(γ) 2022/07/06(水) 15:54

 ほいで、[LPAD]や[RPAD]も欲しくなって、副産物的に[REPTB]とか意味不明なの作っちゃって、
 どこかのタイミングでサロゲートペア対応の為にバイト配列に翻弄され、
 「思ったよりコードが長くなってしまったなー」と悦に浸ってたら、
 しばらくして「しっかし全然出番来ないよねー」ってなる。

 そして結局この手の処理はシート上で関数のまま使う事が稀であることに気付き、
 むしろ一過性の変換作業にいちいち数式を打ち込むのすら面倒に感じてきて
 「今更?」ってタイミングで[RTrimボタン]とか作り始める白茶であった・・・

(白茶) 2022/07/06(水) 18:27


 前の投稿で間違いがありました
 右括弧)がひとつたりない RTRIMは右端の文字を検査するので、RIGHT(s,1)を比較
 LTRIMとして名前定義 =LAMBDA(s,IF(LEFT(s,1)=" ",LTRIM(RIGHT(s,LEN(s)-1)),s))
 RTRIMとして名前定義 =LAMBDA(s,IF(RIGHT(s,1)=" ",RTRIM(LEFT(s,LEN(s)-1)),s))
 でした
(´・ω・`) 2022/07/06(水) 18:38

コメント返信:

[ 一覧(最新更新順) ]


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