『文字列の数値を再計算させたい』(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
又マクロも一応教えていただけないでしょうか
(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
その一方マニュアル操作が、どうしても上手くできません
やはり先ほどのエラー値が出てしまいます
もう少し詳しく教えていただけますでしょうか
この部分が引っ掛かるのですが
↓
・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
それで数式の方はF4:F71に結果が自動展開されるようですが何度試してもエラー値になってしまいました
これ以上はこちらは無理みたいですのでマクロでやることにします。何度もすいませんでした
これで解決です
この度もどうもありがとうございました
(NK) 2026/03/19(木) 14:57:29
>何度試してもエラー値になってしまいました なんというエラーなんですか? エラーだけではわかりませんよ、皆さんが回答できないです。 (xyz) 2026/03/19(木) 15:07:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.