[[20260318215411]] 『文字列の数値を再計算させたい』(NK) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『文字列の数値を再計算させたい』(NK)

マクロで出来ればいいなあと思っていたんですけど
E列4行目から

誕100/享60/没40

という斜線で括られたパターンの文字列があります 
誕と没のあとに続く数値を+1づつ加算してください
享の後の数値はそのままです

誕101/享60/没41 という風に変わります

E列には全部で4種類の文字列のパターンがあります

誕50 誕のみ単独で数値を+1加算してください

誕51

誕?/享?/没200 誕と享が疑問符で没のみ+1加算してください

誕?/享?/没201

誕102/享96/忌7 ※没が無くて忌の字が付いている時は没に置換えして数値は+1加算しないでください

誕103/享96/没7

E列の値は作業列の計算結果で表示していましたが本体側のブックから抽出して装飾した簡易表を作ったごとによってコピペで値になってしまっています
膨大な量の本体側で再計算させて、また作りなおすとなると手間が大変なんです
可能であれば宜しくお願いします

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 マクロでももちろんできます。

 数式を使って、
 となりの列くらいに結果を書き出して、
 確認してから固定してみてはどうでしょうか。
 (確認済みのものを値のみコピーで自身に上書きし、それを元のセルに上書きします)

 数式は以下です。
 置換内容は、
 ・誕+数字 は 誕+(1加算した数値)に置換
 ・没+数字 は 没+(1加算した数値)に置換
 ・忌 は 没 に置換 (これは最後に処理する)
 と、理解しました。

 例えば、F4に下記を入れると、F4:F7に結果がスピルされます。
 =LAMBDA(a,
     IF(a="","",
         LET(
             d, VALUE(IFERROR(REGEXEXTRACT(a,"誕(\d+)",2),0)),
             e, IF(d>0,SUBSTITUTE(a,"誕"&d,"誕"&(d+1)),a),
             f, VALUE(IFERROR(REGEXEXTRACT(a,"没(\d+)",2),0)),
             g, IF(f>0,SUBSTITUTE(e,"没"&f,"没"&(f+1)),e),
             SUBSTITUTE(g,"忌","没")
         )
     )    
 )(E4:E7)

 なお、「E列の最初の非空白行から最後の非空白行までの間のセル範囲」を指定したければ、
 E.:.Eという"トリム参照"を使います。(途中に空白行があっても対象になります)

 また、=LAMBDA(.....)(E4:E7)の  =LAMBDA(.....) の部分を名前定義(例えばfn)しておけば、
 =fn(E4:E7)
 =fn(E.:.E)
 =fn(A1)
 などとユーザー定義関数として使えます。
(xyz) 2026/03/19(木) 06:34:16

早速のご回答ありがとうございます
F4セルに、ご提示の数式を入れてF71行目(最終行:途中空白行無し)までオートフィルしましたが
計算結果は全行「#スピル!」と結果が出ました
数式は閉じ括弧が離れたり間隔が空いていたり改行されていたりしていますがこの通りに入れればいいのですか
あとE.:.Eというのは数式の最後の行の(E4:E7)のところを変えればいいのですか

又マクロも一応教えていただけないでしょうか

(NK) 2026/03/19(木) 10:13:02


 その数式は、
 E4:E7というセル範囲に対してそれぞれ計算して、その結果を入力セル以下に自動展開して下さい、
 と言う意味です。これをスピルと呼びます。
 一つの計算式を一か所に入れるだけで、多数のセルに結果が書き込まれます。
 スピルというのは、もともと「あふれ出る」とかいった意味らしいですな。

ですから、オートフィルは不要です。

 (オートフィルすると、自身が計算して結果を書いた上に、再度別の計算式の結果が多重に展開されるので、
   重なってしまって困るわ、と言う意味で「#スピル!」というエラーが出ます。
   このような形式の計算式を入れる場合、結果が展開されるべきセル範囲は、
   何も入力されていない状態にしておく必要があります。)

 ・F4:F71を消去して綺麗にしたうえで、
 ・E4:E7をそのままにした式を、いったんそのままF4セルに入力して下さい。
 ・その後、そのセルをF2キーで修正モードにして、E4:E71 に変更して下さい。
   (これで、F4:F71に結果が自動展開されるはずです)  

 >あとE.:.Eというのは数式の最後の行の(E4:E7)のところを変えればいいのですか
 そうです。

 また、数式は可読性を考えてそのような形式にしています。
 そのまま入力してください。数式バーの高さを広げると見やすいかも。
 一部、誤字修正等しました。(12:05) 

(xyz) 2026/03/19(木) 11:20:48


 マクロも提示しておきます。

 Sub test()
     Dim re      As RegExp
     Dim matches As Object
     Dim m       As Object
     Dim t       As String
     Dim d       As Long
     Dim s       As String
     Dim k       As Long

     Set re = New RegExp     'Excel365ならCreateObject("VBScript.RegExp")は不要となりました。
     re.Pattern = "(誕|没)(\d+)"
     re.Global = True

     For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
         s = Cells(k, "A")

         If re.test(s) Then
             Set matches = re.Execute(s)
             For Each m In matches
                 t = m.SubMatches(0)
                 d = m.SubMatches(1)
                 s = Replace(s, t & d, t & (d + 1))
             Next
         End If
         s = Replace(s, "忌", "没")
         Cells(k, "B") = s
     Next
 End Sub 

 A列をもとに結果を隣の列に入れる形式で作ったマクロです。
 まず、別のシートで動作確認をしてください。
 そのうえで、セル範囲はあなたのほうで適当に修正して下さい。

 (もちろん、私は断らない限り、正常動作することを確認して投稿するようにしていますが、
  それとは別に、質問者さんが中身をある程度学習されることは必要なことだと思っております。)

 ワークシート計算も、上記のマクロも「正規表現」とい呼ばれる道具を使っています。
 文字列のある種のパターンを検索するための道具です。
 おいおい、それの基本的なことも学習されると良いと思います。(ご存じであれば失礼)

 なお、正規表現を使わない方法も他の方から提示されるかもしれません。
 追記の追記: やっぱり最初のものはドン臭かったので差し替えました。

(xyz) 2026/03/19(木) 11:39:26


マクロの作成ありがとうございました
これで動作OKばっちりで素晴らしいです

その一方マニュアル操作が、どうしても上手くできません
やはり先ほどのエラー値が出てしまいます
もう少し詳しく教えていただけますでしょうか

この部分が引っ掛かるのですが

 ・F7:F47を消去して綺麗にしたうえで、
 ・E4:E7そのままにした式を、そのままF7セルに入力して下さい。
 ・その後、そのセルをF2キーで修正モードにして、E4:E47 に変更

 ・F列全体を消去、或いは削除して綺麗にしたうえで、
 ・E4:E71そのままにした式を、そのままF4セルに入力して下さい。
 ・その後、そのセルF4をF2キーで修正モードにして、E4:E71に変更

数式を一部抜粋

            SUBSTITUTE(g,"忌","没")
         )
     )    
 )(E4:E7) '最後の行で、ここを最初から、)(E4:E71)

としなければならないと素人考えでは思うのですがいかがでしょうか

あとマクロの要望なんですが没から忌に替える節は67データ中そう滅多に出ないので手作業で見つけては後からやることになりますが現状から没に+1加算された時に
数値が下のリストに該当された時の変化で

没1

忌1

没2

忌3

没6

忌7

没12

忌13

没32

忌33

以上5点をマクロに組み込まれていただけたら有難いです
宜しければお願いします
かなりの変更を余儀なくされ大幅な作り変えとなり面倒でしたらはっきり断ってくださって結構です
(NK) 2026/03/19(木) 13:34:36


 >としなければならないと素人考えでは思うのですがいかがでしょうか
 それでOKです。
 E4:E7そのままにした式を使って、4ケースの検証を実施してから、範囲を拡張したほうがよいと
 思ったまでです。

 「没から忌に替える節」って何ですか?
 忌を没に変換する話はありましたが。
 まったく新しい話ですか?
 変換後の文字列に、その5ケースの置換を追加するだけなので、そちらで追加すればよいでしょう。

 私はあなたの下請けじゃないです。ごめんね。

(xyz) 2026/03/19(木) 14:12:56


マクロの追加要望勝手気ままですいませんでした
5ケースの置換を追加コードの記述とどこの部分に入れるのか全く分かりませんので手作業でやることにします
でものちほどUPしてくれるんじゃないかと期待してます(^^ゞ

それで数式の方はF4:F71に結果が自動展開されるようですが何度試してもエラー値になってしまいました
これ以上はこちらは無理みたいですのでマクロでやることにします。何度もすいませんでした
これで解決です
この度もどうもありがとうございました

(NK) 2026/03/19(木) 14:57:29


 >何度試してもエラー値になってしまいました
 なんというエラーなんですか?
 エラーだけではわかりませんよ、皆さんが回答できないです。
(xyz) 2026/03/19(木) 15:07:27

ひょっとして、セルの左上に三角マークがつくとかの類
(ソラン) 2026/03/19(木) 15:34:58

別セルに表示させる。
="誕"&IF(
        MID(SUBSTITUTE(E4,"忌","没"),2,1)="?",
        MID(SUBSTITUTE(E4,"忌","没"),2,FIND("/",SUBSTITUTE(E4,"忌","没")&"/")-2),
        VALUE(MID(SUBSTITUTE(E4,"忌","没"),2,FIND("/",SUBSTITUTE(E4,"忌","没")&"/")-2))+1
     )
&IF(
     ISNUMBER(FIND("享",SUBSTITUTE(E4,"忌","没"))),
     "/"&MID(
            SUBSTITUTE(E4,"忌","没"),
            FIND("享",SUBSTITUTE(E4,"忌","没")),
            FIND("/",SUBSTITUTE(E4,"忌","没")&"/",FIND("享",SUBSTITUTE(E4,"忌","没"))+1)
            -FIND("享",SUBSTITUTE(E4,"忌","没"))
        ),
     ""
 )
&IFERROR(
   "/没"&IF(
          ISNUMBER(FIND("忌",E4)),
          MID(SUBSTITUTE(E4,"忌","没"),FIND("没",SUBSTITUTE(E4,"忌","没"))+1,99),
          IF(
             MID(SUBSTITUTE(E4,"忌","没"),FIND("没",SUBSTITUTE(E4,"忌","没"))+1,1)="?",
             MID(SUBSTITUTE(E4,"忌","没"),FIND("没",SUBSTITUTE(E4,"忌","没"))+1,99),
             VALUE(MID(SUBSTITUTE(E4,"忌","没"),FIND("没",SUBSTITUTE(E4,"忌","没"))+1,99))+1
          )
       ),
   ""
)
(お遊び) 2026/03/20(金) 21:10:27

期待を込めて何度も訪れていました
ここの掲示板は解決後も追伸ができる点が気に入っています
(お遊び)さまありがとうございます
全行一発で再計算が行われこれで完璧でした
なるほど出来てみると凄い関数式です
改めて感動しました

(xyz)さまのは計算結果は全行「#スピル!」と表示されます
何度も仰せの通りやったんですが、こちらの環境下と何か違うのか知れませんが不明でした
もし識者の方々が検証をなされてみてエラー値になれば証明されるんですが恐らくできなかった方が
いらしたので再UPしてくれて頂けたものと思います

PS
追加希望の5項目は1年に1回更新作業の約70名で済むので何とか手作業でやります
約17万名の中から選出して他人にリポート提出しています
もし(お遊び)さまの方でお時間の許す限り考察してもいいということであれば期限なしで後ほど
またサイトを訪ねてみたいと思います
しかしながら数式では不可能ということであれば早めに教えてくだされば幸甚です(すぐ見切りが利きますもので)

(NK) 2026/03/21(土) 02:21:15


>全行一発で再計算が行われこれで完璧でした
「#スピル!」は表示されなかったんですか。

>他人にリポート提出しています
式は出来ましたが個人情報に抵触する恐れがあるので退散します。

(お遊び) 2026/03/21(土) 09:33:19


もうしわけないです
出来るということだけでも知れて安堵しました

これは趣味でやっててあくまでも家族間です
全データは歴史上の人や著名人などの自分の観賞用
ドラマとか映画を見る時に換算表を作って楽しんでいるのですが
商業目的や第三者などに利用しません

全データ用ブックはO列1行目に今年の西暦年が入ると再計算が行われます
またその年に没すると表記が変わります
あと没年が回忌に該当するとこちらも変わります
1900年以前の人物はエクセルで月日まで対応していないので大雑把に満年数だけで計算させます
それで見たい肩書別の人物を抽出するわけです。戦国大名別、タレント別などest.

例えば三英傑など
織田信長 誕492/享49/没444
豊臣秀吉 誕489/享62/没428
徳川家康 誕483/享74/没410

瞬時にして分かるような仕組みになっています
数人ならまだしも数百人を対象とした時など、どんな頭のいい人でも暗算は大変だと思います
それとどんな高価な書籍本だって活きたデータは活用できません
それなら自分でエクセルで作ってみようと思ったのがきっかけです
ところが小生は造っていくうちにマクロや関数の必要性が出てきて
こうやって知識者の知識をお借りしている次第です
それらを踏まえてもOKが出ないなら諦めます( ノД`)シクシク…
まあ他人さまから見れば変なことだと思われるかもしれませんが趣味だからしょうがないんですよ
(NK) 2026/03/21(土) 11:40:11


 > 全行「#スピル!」と表示されます
 私が書いたことをもう一度読み直して下さい。
 結果が展開されるべきF4:F71はいったんすべて消去して下さい。

 >オートフィルすると、自身が計算して結果を書いた上に、再度別の計算式の結果が多重に展開されるので、
 >重なってしまって困るわ、と言う意味で「#スピル!」というエラーが出ます。
 と書きました。
 F4に入れた数式が返す結果が、そのセル(F4)だけでなくF4:F71に展開される(スピル機能)ので、
 F5以降に何か書いたらアウト、NG、不可です。 
 上記のことを理解されていれば、
 "心配になったので、念のためF4を以下にコピーペイストしました"などということはあり得ません。
  (が、やっている可能性ありますね。そうでもなければ、全行「#スピル!」エラーなんてことにはなりません。
 全行にスピルエラーが表示されるということは、全行に数式が入れてあることを意味します。)
 他人の回答をよく読んで理解するようにしてください。

 -----------------------------
 追加案件の件、サンプルデータの提示を求めるコメントを手元で書いてありましたが、
 直近発言を見て考えが変わりました。

 そもそもそんなデータの持ち方はやめて
 氏名   生年月日    仮想年齢    享年    没後年数
 という5列の普通の表にすべきです。表計算の基本中の基本ですよ。
 一つのセルに情報を詰め込むから扱いが難しくなるんです。簡単な表じゃないですか。

 正規表現など使う場面ではまったくなかったですな。
 バカバカしい時間を使ってしまった。できることなら返して欲しい。

 趣味の話なら、自分でなんとかすべきです。それが趣味たる所以でしょ?
 私からは以上です。

(xyz) 2026/03/21(土) 12:08:13


>西暦年が入ると再計算が行われます
実際の式と計算前後のデータを見たいものですね。

(お遊び) 2026/03/21(土) 14:49:21


文章には句読点を付けましょうよ。
(お遊び) 2026/03/21(土) 14:51:22

> 約17万名の中から選出して他人にリポート提出しています

> これは趣味でやっててあくまでも家族間です
> 全データは歴史上の人や著名人などの自分の観賞用

 17万人ものリストを作成し、家族間でリポートし合ってるって、とっても平和なご家族でステキです。

> 没が無くて忌の字が付いている時は没に置換えして数値は+1加算しないでください

 ちなみに、「忌1」のときだけは、没に置換えて数字を +1すべきなのでは?
 「忌1」の翌年は、「没2」か「忌3」のような気がしますけど。 間違ってたらご免なさいね。
(通行人) 2026/03/22(日) 09:12:44

(通行人)さま。
お褒めのお言葉有難く頂戴致します。

まず(xyz)さまのプラン。
氏名 生年月日 仮想年齢 享年 没後年数は、
A4用紙を縦でプリントすると幅が限られ、肩書の項目文字が長いのもあるので、
文字の縮小により小さくなって見えなくなってしまいます。
折り返しも行数を増やす素なのでPassです。
それで最後の処理で&関数を使って一纏めにしてしまっているのです。
質問者は知識人の方には不明な数々もあると思われますが出来るだけ念願の希望に沿って
回答を求めているので、それはそれとしてご回答願えればと言った感じです。

バカバカしい時間を使ってしまった。できることなら返して欲しい。 これは人に対する侮辱発言だと思いませんか。そう言われてもどうすることも出来ませんし、まあどうでもいいですし気にしません。
(xyz)さまにおかれましては、このような二度轍を踏まないようご活躍を願っております。

(お遊び)さま、ご指摘の句読点入れてみました。ありがとうございます。
それで退散ですか承知つかまりました。この度はありがとうございました。

(通行人)さま。の御回答に戻りますけど、
「忌1」の時だけは、没に置換えて数字を +1しなくていいのです(ややこしいですがこれは特例と思ってください)。
2026年に没した場合は、翌年(2027年)が没後1年で1回忌でもあります。
この時に1年足してしまうと没後2年なってしまいます。
「忌1」の翌年(2028年)は、「没2」になるので「忌3」で、正しくその通りです。
これは要望パターンの項目で述べさせていただきました。
欧米諸国の西暦年数と日本の数え年の違いです。
例えば最近変わりましたが、以前は競走馬は数え年を採用されていました。
人も生まれた年を1歳としていた日本の1950年までにあった年齢法の名残です。
なので没後2年は宗教上3回忌、6年を7回忌として法要を営んでいます。

(通行人)さまに有難いお言葉を掛けていただき嬉しいです。
大学に通う甥っ子さんにも「これはすげえ」と褒めてもらい同感してくれました。
この集大成を理解ある身内に残せると思うと感慨無量です。
ただ自力以外のマクロと高度な一部数式は人に作ってもらったんだよと正直に言うしかないですが(^^ゞ。
思えばかれこれコツコツもう30年以上はデータを蓄積してきたなあ。
収録人数としてはどんな市販されている年齢換算辞典にも負けないです。
(NK) 2026/03/22(日) 11:08:46


>収録人数として
昭和天皇は登録しているの。
(いやみ) 2026/03/22(日) 11:46:09

 まだテスト版なので使える人が限られるんですけど
 =COPILOT(
 "以下のルールで文字列を変換してください:
 1. '誕'の後の数値は+1する
 2. '没'の後の数値は+1し、かつ文字を'忌'に書き換える(例:没40→忌41)
 3. '享'の後の数値はそのまま
 4. '忌'という文字が含まれる場合は'没'に書き換え、数値は+1する(例:忌7→没8)
 5. '?'はそのまま維持する
 ", E:.E)
(ちくわ) 2026/03/22(日) 13:12:03

[修正]
 =COPILOT(
 "以下のルールで文字列を変換してください:
 1. '誕'の後の数値は+1する
 2. '没'の後の数値は+1し、かつ文字を'忌'に書き換える(例:没40→忌41)
 3. '享'の後の数値はそのまま
 4. '忌'という文字が含まれる場合は'没'に書き換える(例:忌7→没7)
 5. '?'はそのまま維持する
 ", E:.E)

 忌は加算しないんでした。
(ちくわ) 2026/03/22(日) 13:14:36

 >(xyz)さまのは計算結果は全行「#スピル!」と表示されます 

 #スピル!エラーが発生する事情が不可解ですね。
 F4セル以下に「数式とかデータとか」が入ってないですか? 入っていればそれが原因と分かるんですが。

 1.F列全体をクリアする。
 2.F3セルに下式を入力する。

 =LET( a,DROP(E:.E,3),
     bt,"没"&{1;2;6;12;32}&" ",
     ki,"忌"&{1;3;7;13;33}&" ",
     sq,SEQUENCE(5),
     IF(a="","",
         LET(
             d, VALUE(IFERROR(REGEXEXTRACT(a,"誕(\d+)",2),0)),
             e, IF(d>0,SUBSTITUTE(a,"誕"&d,"誕"&(d+1)),a),
             f, VALUE(IFERROR(REGEXEXTRACT(a,"没(\d+)",2),0)),
             g, IF(f>0,SUBSTITUTE(e,"没"&f,"没"&(f+1)),e),
             h, SUBSTITUTE(g,"忌","没")&" ",
             TRIM(REDUCE(h,sq,LAMBDA(acm,pos,SUBSTITUTE(acm,INDEX(bt,pos),INDEX(ki,pos))))))
   )
 )

  <結果図>
 行  ________E________  ________F________
  1  タイトル                            
  2                                      
  3                                      
  4  誕100/享60/没40    誕101/享60/没41  
  5  誕50               誕51             
  6  誕?/享?/没200      誕?/享?/没201    
  7  誕102/享96/忌7     誕103/享96/没7   
  8  誕102/享96/忌6     誕103/享96/忌7   
  9  誕100/享60/没45    誕101/享60/没46  
 10  誕100/享60/没46    誕101/享60/没47  
 11  誕100/享60/没31    誕101/享60/忌33  
 12  誕100/享60/没100   誕101/享60/没101 

(半平太) 2026/03/22(日) 17:49:55 →19:31 一部修正


 質問者さん、下記のケースではどうなればいいんですか?右に追記して下さい。
 誕90/享90/没0
 誕91/享90/忌1
 誕92/享90/忌3
 誕93/享90/没3
 誕94/享90/没4
 誕95/享90/没5
 誕96/享90/忌7
 誕97/享90/没7
 誕98/享90/没8
 誕99/享90/没9
 誕100/享90/没10
 誕101/享90/没11
 誕102/享90/忌13
 誕103/享90/没13
 誕104/享90/没14
 それは示されたルールで導くことができますか?

(通行人2) 2026/03/22(日) 18:36:08


F3に入れろだのF4に入れろだの錯綜します。
これは(お遊び)さんの 2026/03/20(金) 21:10:27ので完成して動作OKになっています。

忌41なんかないんです。2026/03/19(木) 13:34:36の5種類だけなんです。
こちらは一人で皆さんで寄ってたかって対応に大変です。
数式に関してはハイハイもう解散。
たまに見に来て出来ているものあれば対応するのであしからず。
もう疲れるのでどうでもいいですわ。

(NK) 2026/03/22(日) 21:20:59


>寄ってたかって対応に大変

質問掲示板は、そういうモノでしょ。
「寄ってたかって」が迷惑と思うなら一対一で面倒見てくれるAIに回答をもらえば良い。
AIならご立腹させるような発言も無い。。。。
(ROM) 2026/03/23(月) 06:49:00


(ちくわ)さまへ。
一言お詫びしておきます。
41回忌というのはありました。
このようなレアな回忌よくご存じで詳しいですね。
今まで全く知りませんでした。
情報ありがとうございます。
実は回忌は他にも17回忌、23回忌、27回忌、37回忌、50回忌、100回忌、150回忌…以降50年ごと
200、250…と続きますが、とりあえず有名な5種類だけに絞りました。
自分の本体のデータブックは、いずれも対応させています。
ただし外国人は回忌なんて無いので、これにも対応しております。

親父もデータに入れて、生きていたら誕生から何年、亡くなってからもうすぐ何年、何回忌なんだぁと思う今日この頃です。
(NK) 2026/03/23(月) 08:51:17


コメント返信:

[ 一覧(最新更新順) ]


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