[[20230310141212]] 『1文字おきに伏字にしたい_2』(ゆき) ページの最後に飛ぶ

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

 

『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


稲葉さん、ありがとうございます。
できたら、数式の方がうれしいです。
すみません・・。
(ゆき) 2023/03/10(金) 15:03:38

偶数桁を「●」にして何をしようとしているのでしょう。
(あめ) 2023/03/10(金) 15:10:05

先頭の文字を表示するようにしたいからです。
(ゆき) 2023/03/10(金) 15:13:04

 たぶんだけど
 (ねむねむ)さん 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


>先頭の文字を表示するようにしたいからです
それだけの理由であれば、偶数桁とは言わず2桁目以降が●になればよいのでは?と思ってしまいます。
本当に「偶数桁を●にする」必要があるかを考えたほうが簡潔に済むと思います
(初心者X) 2023/03/10(金) 15:22:26

 =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


みなさま、ありがとうございました。
(ゆき) 2023/03/10(金) 22:12:38

 終わってしまいましたが、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.