
下記の数式は以前教えて頂いた数式で、
指定セル値「受付!F2」の表示の一部に{"NO.","NO","No.","No"}があった場合に
(№)に表示を変更出来る数式になっております。
しかし、「受付!F2」の表示の一部のナンバー表示が{"NO.","NO","No.","No"}以外の時もあり、
その場合は(№)に表示を変更出来ません。
{"NO.","NO","No.","No"}部分が色々なケース(ナンバー表示)に対応できる方法があれば、教えてください。
現状の数式
「=REDUCE(受付!F2,{"NO.","NO","No.","No"},LAMBDA(x,y,SUBSTITUTE(x,y,"№")))」
以上となります。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
ご質問者の補足コメントに対し、No.1さんからの追加回答が付かないようです。
No.1さんの回答内で、正規表現を用いる方法が解説されているものの、VBAでは使えない表現が登場している気がします(大変失礼ですが、No.1さんの回答を見て生成AIの回答を想起してしまいました)。
そこで、失礼を承知のうえで、横ヤリになってしまいますが、その部分を修正したものを以下にお示しします。
Function ReplaceNumberFormat(inputText As String) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
inputText = StrConv(inputText, vbNarrow)
regex.Pattern = "(no[\.:]?|number[\.:]?)"
regex.Global = True
regex.IgnoreCase = True
ReplaceNumberFormat = regex.Replace(inputText, "№")
End Function
上記のコードは正規表現による置換前の文字列と置換後の文字列をコード内に記載していますが、関数を呼び出す都度指定する(可変にする)こともできます。
Function ReplaceNumberFormat2(inputText As String, ByVal Pattern As String, ByVal ReplaceWith As String) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
inputText = StrConv(inputText, vbNarrow)
regex.Pattern = Pattern
regex.IgnoreCase = True
regex.Global = True
ReplaceNumberFormat2 = regex.Replace(inputText, ReplaceWith)
End Function
しかし、No.1さんのバターンにあるnumberという語句は"NO.","NO","No.","No","No.","NO","no.","no"の例示からすると違和感があります。
また、「受付!F2」セルに"NO.","NO","No.","No","No.","NO","no.","no"のどれも無く、「No.」をタイプミスして「Mo.」となっていたり、「#」だったり、さらに#入力もれで「数字だけ」だったりすると上記のコードでは役に立ちません。
そこで、究極のお節介としては、「数字の前に"№"を強制付与する」という考えもあります。
その場合、上段のコードを若干修正して、以下のようなコードにすればよいと思います。
Function ConvertToNumber(ByVal inputText As String) As String
Dim regex As Object
Dim matches As Object
Dim str As String
Dim result As String
Set regex = CreateObject("VBScript.RegExp")
inputText = StrConv(inputText, vbNarrow)
regex.Pattern = "(no|#|mo)[\.:]?"
regex.Global = True
regex.IgnoreCase = True
result = regex.Replace(inputText, "№")
regex.Pattern = "\d+"
Set matches = regex.Execute(result)
If matches.Count > 0 And InStr(result, "№") = 0 Then
str = Left(result, InStr(result, matches(0)) - 1)
If str <> "" Then
result = Replace(result, str, str & "№", 1, 1)
Else
result = "№" & result
End If
End If
ConvertToNumber = result
End Function
上記コードは置換すべき文字列を"№"に置換するとともに、置換すべき文字列が存在しないときは最初の数字を探して、その前に強制的に"№"を付与するものです。
従って「北海太郎1234」は「北海太郎№1234」に置換され、「東神楽町南1番通no1234」は「東神楽町南1番通№1234」に置換されます。
しかし、上記コードは「お節介コード」なので余計なお節介が働き「東神楽町南1番通1234」は「東神楽町南№1番通1234」に置換されてしまいます。
いずれのコードも標準モジュールに貼り付けてから、結果を表示したいセルに
=ReplaceNumberFormat(受付!F2)
=ConvertToNumber(受付!F2)
などと記述すれば使えます。
正規表現による置換パターンを都度指定するReplaceNumberFormat2の場合、パターンの指定は自由に変更できるので、「#」パターンや「Mo」パターンも自由に追加指定できます。
=ReplaceNumberFormat2(受付!F2,"(no|#|mo)[\.:]?","№")
結果を表示したいセルに、上記のように記述すればよいだけです。
お好みでご利用ください。
※老婆心ですが、環境依存文字である"№"に置換するという方針が、将来展望も含めてシステムとして好ましいのかは疑問が残ります。
No.2
- 回答日時:
こんばんは
>ナンバー表示が{"NO.","NO","No.","No"}以外の時もあり、
>その場合は(№)に表示を変更出来ません。
許容する範囲が明示されていませんけれど、何があっても「№」と表示したいのなら、そのセルに
=IF(受付!F2="","","№")
という式でも設定しておけば、必ず「№」と表示されます。
対象とする範囲をきちんと限定できるのなら、ご提示の式で対象範囲を広げれば良いでしょう。
多いようなら、リストにしてそちらを参照するようにすれば宜しいかと。
No.1
- 回答日時:
現状の数式では、特定のナンバー表示({"NO.","NO","No.","No"})にしか対応していないため、その他の形式には対応できません。
この問題を解決するには、以下のアプローチを考えられます。1. より広い条件で置換する方法
正規表現を用いると、様々な「ナンバー表示」に対応できますが、Excelの標準関数では正規表現を直接扱えません。そのため、以下のように複数のパターンを手動で列挙する必要があります。
改良した数式例:
=REDUCE(受付!F2,{"NO.","NO","No.","No","No.","NO","no.","no"},LAMBDA(x,y,SUBSTITUTE(x,y,"№")))
上記では以下のバリエーションも置換対象に加えています:
大文字・小文字混合 (No. / no.)
全角バリエーション(No. / NO)
2. すべてのナンバー形式を包括するアプローチ
正規表現を活用すれば、ナンバー表示をより包括的に処理できます。ただし、これにはExcel内で正規表現を使えるようにする工夫が必要です。例えば:
Power Query を使用する方法 Power Query(Excel内蔵のデータ変換ツール)で正規表現を使えば、例えば以下のような形式を一括処理できます:
NO.123
No:123
Number 123
Power Query のステップ例:
置換ステップ: 正規表現でナンバーのパターン(例:No.*, NO.* など)を検出して № に変換します。
VBA を使用する方法 VBA で正規表現を使う方法を実装します。以下に簡単なコード例を示します:
Function ReplaceNumberFormat(inputText As String) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "(?i)(no[\.:]?|number[\.:]?)"
regex.Global = True
ReplaceNumberFormat = regex.Replace(inputText, "№")
End Function
この関数をセルで使用できます:=ReplaceNumberFormat(受付!F2)
正規表現パターン (?i) は大文字・小文字を区別しない設定です。
3. 条件が複雑でない場合の手動更新のアプローチ
複雑な形式を網羅する必要がない場合、REDUCE 関数のリストに追加するだけで多くのケースに対応可能です。
まとめ
置換対象のパターンが増える場合は、数式の REDUCE にリストを拡張する。
正規表現が必要な場合は Power Query や VBA を利用する。
パターンが無限に広がる場合は、プログラミング的アプローチ(VBA)が最も柔軟です。
要件に応じた方法を選んでください!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Excelで、日付と数量からなるデータのうち日付が飛び飛びになっているデータから、
Excel(エクセル)
-
Excelの関数を教えて下さい。
Excel(エクセル)
-
自動的に日付入力 応用
Excel(エクセル)
-
-
4
Excelの数式について教えてください。
Excel(エクセル)
-
5
エクセルの数式について教えてください。
Excel(エクセル)
-
6
Excel いい方法教えてください。
Excel(エクセル)
-
7
2枚のエクセル表で数字をマッチングさせる方法を教えてください
Excel(エクセル)
-
8
Excelについて教えてください。
Excel(エクセル)
-
9
至急お願いします!エクセルのフィルターについて
Excel(エクセル)
-
10
空白処理を空白に
Excel(エクセル)
-
11
【マクロ】コードを少しでも、減らする為には
Excel(エクセル)
-
12
関数を教えて下さい
Excel(エクセル)
-
13
Excel 複数のセルが一致するときに網掛けをする式は作れますか
Excel(エクセル)
-
14
Excel 日付の表示が直せません、2025/1/1の表示にしたい
Excel(エクセル)
-
15
Excel関数の解決方法
Excel(エクセル)
-
16
ExcelのIF関数との組み合わせの相談
Excel(エクセル)
-
17
エクセル 月間シフト表で曜日ごとの休み数をカウントしたい
Excel(エクセル)
-
18
名前の間のスペースをそろえる関数はありますか?佐藤 太郎 佐藤 太郎
Excel(エクセル)
-
19
エクセルについてどう関数を使えばいいか教えてください。
Excel(エクセル)
-
20
【マクロ 画像あり】Exact関数の結果【FALSE】という文字に条件付書式設定にて赤字にする為には
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VLOOKUP FALSEのこと
-
【関数】【マクロ】売上X円以上...
-
エクセルシートの見出しの文字...
-
【マクロ 画像あり】Exact関数...
-
空白処理を空白に
-
同じ名前(重複)かつ 日本 ア...
-
excel
-
if関数の複数条件について
-
エクセルでフィルターした値を...
-
空白のはずがSUBTOTAL関数でカ...
-
【マクロ】エラー【#DIV/0!】が...
-
【マクロ】数式を入力したい。...
-
【関数】3つのセルの中で最新...
-
Excelで4択問題を作成したい
-
エクセルの文字数列関数と競馬...
-
オートフィルターの絞込みをし...
-
表計算ソフトでの様式の呼称
-
【画像あり】【関数】指定した...
-
エクセルに写真が貼れない(フ...
-
【関数】=EXACT(a1,b1) a1とb1...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでフィルターした値を...
-
if関数の複数条件について
-
エクセルシートの見出しの文字...
-
excel
-
エクセルの文字数列関数と競馬...
-
VLOOKUP FALSEのこと
-
同じ名前(重複)かつ 日本 ア...
-
表計算ソフトでの様式の呼称
-
エクセルに写真が貼れない(フ...
-
【マクロ】数式を入力したい。...
-
【マクロ】実行時エラー '424':...
-
【画像あり】オートフィルター...
-
Office2021のエクセルで米国株...
-
【画像あり】【関数】指定した...
-
エクセルのVBAで集計をしたい
-
【マクロ】【画像あり】4つの...
-
【関数】3つのセルの中で最新...
-
【マクロ】excelファイルを開く...
-
LibreOffice Clalc(またはエク...
-
エクセルのライセンスが分かり...
おすすめ情報
回答ありがとうございます。
色々と教えていただきまして感謝いたします。
=REDUCE(受付!F2,{"NO.","NO","No.","No","No.","NO","no.","no"},LAMBDA(x,y,SUBSTITUTE(x,y,"№")))
で上手く行きましたが、今後の事を考えて「VBA」を設定したいと思います。
教えて頂いた「VBA」コードをどこに設定すればよろしいでしょうか。
又、数式を設定しているセルに
=ReplaceNumberFormat(受付!F2)
を設定しても良いとの解釈でしょうか。
よろしくお願いいたします。