[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『1文字おきに伏字にしたい_2』(ゆき)
お世話になります。
以前に以下の質問がありました。
https://www.excel.studio-kazu.jp/kw/20210127073255.html
これと同じなのですが、偶数桁を「●」にしたいです。
株式会社 UNI食品販売
↓
株●会●U●I●品●売
株●会● U●I●品●売
よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
数式ムズイっす・・・ VBA案で、標準モジュールにコード入れて |[A] |[B] [1]|株式会社 UNI食品販売|●式●社 U●I●品●売
B1=uf伏字(A1,"●",1,2) こんな感じじゃだめ?
Function uf伏字(s As String, blank As String, start As Long, st As Long) Dim i As Long For i = start To Len(s) Step st If StrConv(Mid(s, i, 1), vbNarrow) <> " " Then Mid(s, i, 1) = blank End If Next i uf伏字 = s End Function
(稲葉) 2023/03/10(金) 14:36:35
たぶんだけど (ねむねむ)さん 2021/01/27(水) 16:03 をちょっと変更すればできるはず 元 :=SUBSTITUTE(" "&TRIM(TEXTJOIN(" ",TRUE,MID(A1,ROW(1:10)*2,1)))&" "," ","●") 変更後:=SUBSTITUTE(TRIM(TEXTJOIN(" ",TRUE,MID(A1,(ROW(1:10)-1)*2+1,1)))&" "," ","●") これでできるけど、 例示と違う結果になる 出力→株●会● ●N●食●販●
(稲葉) 2023/03/10(金) 15:19:30
=LET(文字,A1,LET(配列,ROW(OFFSET($A$1,,,LEN(文字))),TEXTJOIN("",TRUE,IF(MOD(配列,2)=1,MID(文字,配列,1),"●")))) これでもいいかも これなら偶数奇数の切替は MOD(a,2)=1 を1か0に切り替えればできる (稲葉) 2023/03/10(金) 16:02:17
=REDUCE(LEFT(A1),MID(A1,SEQUENCE(LEN(A1)-1,1,2),1),LAMBDA(a,b,IF(OR(RIGHT(a)={"●"," "},b=" "),a&b,a&"●")))
<結果図> 行 __________A__________ ___________B___________ 1 株式会社 UNI食品販売 株●会● U●I●品●売
(半平太) 2023/03/10(金) 16:26:16
すみません、勉強のためREDUCEとLAMBDAについて教えてください。 たぶんこんなことしてるんだろうと思っているのですが、あってます? |[A] |[B] |[C]|[D] |[E] |[F] [1]|シーケンス出力|Left(A1)→ |株 |aの値 |bの値|適応される式 [2]| 2|MID(A1,SEQUENCE(LEN(A1)-1,1,2),1)→|式 |株 |式 |IF(OR(RIGHT("株")={"●"," "},"式"=" "),"株"&"式","株"&"●") [3]| 3| |会 |株● |会 |IF(OR(RIGHT("株●")={"●"," "},"会"=" "),"株●"&"会","株●"&"●") [4]| 4| |社 |株●会 |社 | [5]| 5| | |株●会● | |IF(OR(RIGHT("株●会●")={"●"," "}," "=" "),"株●会●"&" ","株●会●"&"●") [6]| 6| |U |株●会● |U |IF(OR(RIGHT("株●会● ")={"●"," "},"U"=" "),"株●会●U"&" ","株●会●U"&"●") [7]| 7| |N |株●会● U |N | [8]| 8| |I |株●会● U●|I |
数式を言葉にすると、 A1の文字を頭から見ていき、 直前の文字が●かスペース または 直後の文字がスペースなら直前の文字と直殿文字をつなげる そうじゃなければ直前の文字と●をつなげる になると思いますが、あってますか?
LAMBDA関数の中でaはREDUCEの第一引数、bはMID-SEQUENCEで2文字目〜最後の文字までの1文字ずつというのはわかるのですが、 aがなぜに計算結果として戻ってくるのか(再帰処理?)わからず・・・
逆に言えば、REDUCEの仕組みで戻ってくる形でしょうか?
(稲葉) 2023/03/10(金) 17:58:13
> A1の文字を頭から見ていき、 > 直前の文字が●かスペース または 直後の文字がスペースなら直前の文字と直殿文字をつなげる > そうじゃなければ直前の文字と●をつなげる
そのつもりで作りました。
> aがなぜに計算結果として戻ってくるのか(再帰処理?)わからず・・・
aはアキュムレーターなので、以前の計算結果を(累積的に且つ単体値として)保持した状態で 次の計算の対象になる、と理解しています。
正に再帰処理なのでしょうね(自分自身を次の数式処理の引数にして、反復処理する)
・と言いつつ、自分を納得させています(訊いていただいてよかったです)
(半平太) 2023/03/10(金) 19:53:08
ありがとうございます。
アキュムレーター 調べてもようわからんけど、とりあえず第一引数に累積していってくれるわけですね・・・ https://excel-ubara.com/excel1/EXCEL673.html https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AD%E3%83%A5%E3%83%A0%E3%83%AC%E3%83%BC%E3%82%BF_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)
マクロにするとこんな感じなんですかね・・・ Optionalの引数みたいな感じ? Function ufREDUCETEST(s As String, blank As String, i As Long, Optional a As String = "") As String Dim b As String If a = "" Then a = Left(s, 1) End If b = Mid(s, i, 1) If Right(a, 1) = blank Or Right(a, 1) = " " Or b = " " Then a = a & b Else a = a & blank End If If Len(s) > i Then a = ufREDUCETEST(s, blank, i + 1, a) End If ufREDUCETEST = a End Function (稲葉) 2023/03/10(金) 20:20:32
言葉が違う気がする Optionalの引数ですらなくて、引数に指定しなくてもよい引数? a・・・モジュールレベル変数 b・・・プロシジャ内変数 のような動きか? まだ違和感・・・
とりあえず納得できました。 ありがとうございます。
(稲葉) 2023/03/10(金) 20:24:37
>(累積的に且つ単体値として)
済みません。 絶対に単体値かどうか確認しておりません。m(__)m
ケースによっては配列が成立するかも知れないので、撤回いたします。
(半平太) 2023/03/10(金) 22:03:42
終わってしまいましたが、365で関数の再帰の例です
名前の定義 で 伏字 という名前で以下の式を定義します。 =LAMBDA(s,IF(LEN(s)<2,s,LEFT(s,1) & "●" & 伏字(MID(s,3,LEN(s)-2)))) そうした後で =伏字("abcd") とすれば、a●c● になります。 =伏字(A1) とすると、A1に入力されている文字が伏字になります (´・ω・`) 2023/03/11(土) 03:04:14
MAKEARRAY関数をつかってみる =LET(s,A1,CONCAT(MAKEARRAY(LEN(s),1,LAMBDA(x,y,IF(MOD(x,2),MID(s,x,1),"●"))))) (´・ω・`) 2023/03/11(土) 07:44:25
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.