Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Excel 2021)
複数候補にも対応するように
投稿日時: 24/03/12 12:00:11
投稿者: Nubo

以下のコードを検討しています。
 
現コードでは、A列の各行に削除候補文字が複数ある場合には対応していません。
(最初にヒットした削除文字でExit Forで抜けてそれ以後はチェックしないため)
 
複数候補にも対応するようにはどうコードを変更したら良いですか ?
(各行の文字列には、2個以上の削除文字候補がある場合が存在します)
 
Sub test()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim i As Long
    Dim j As Long
    Dim found As Boolean
     
    ' シート1とシート2を指定
    Set ws1 = ThisWorkbook.Sheets("シート1")
    Set ws2 = ThisWorkbook.Sheets("削除文字候補")
     
    ' シート1とシート2の最終行を取得
    lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
     
    ' シート1の各行を処理
    For i = lastRow1 To 1 Step -1
        found = False
        ' シート2のA列を検索
        For j = 1 To lastRow2
            If InStr(1, ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value) > 0 Then
                ' シート2に部分的に含まれている場合は削除してB列に書き出し
                ws1.Cells(i, "B").Value = Replace(ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value, "")
                found = True
                Exit For
            End If
        Next j
        ' シート2に部分的に含まれていない場合はA列の文字列をそのままB列に書き出し
        If Not found Then
            ws1.Cells(i, "B").Value = ws1.Cells(i, "A").Value
        End If
    Next i
End Sub

回答
投稿日時: 24/03/12 12:23:26
投稿者: WinArrow

説明が不十分です。
 
何をしたいのか
を説明してください。
シート1とシート2の関係を説明してください。

投稿日時: 24/03/12 12:54:48
投稿者: Nubo

では、具体的に記載します。
 
シート1のA列の各行にシート2のA列にある削除候補文字gある場合は
これを削除してシート2のB列に書き出す
 
例えば、簡単な例では
 
シート1
A1: 魚、肉、野菜、果物
A2: アジ、牛、レタス、リンゴ、みかん
 
シート2
A1: 野菜
A2: 牛
A3: リンゴ
 
であれば
 
シート1
B1: 魚、肉、果実
B2: アジ、レタス、みかん
 

投稿日時: 24/03/12 12:56:28
投稿者: Nubo

すいません。
以下に訂正します。
 
 
では、具体的に記載します。
 
シート1のA列の各行にシート2のA列にある削除候補文字がある場合は
これを削除してシート1のB列に書き出す
 
例えば、簡単な例では
 
シート1
A1: 魚、肉、野菜、果物
A2: アジ、牛、レタス、リンゴ、みかん
 
シート2
A1: 野菜
A2: 牛
A3: リンゴ
 
であれば
 
シート1
B1: 魚、肉、果実
B2: アジ、レタス、みかん
 

回答
投稿日時: 24/03/12 13:47:41
投稿者: Suzu

Exit For に 原因があるとお考えなら、それを コメントアウトすれば 良いでしょう。
 
ですが、今回は それが原因ではありません。
 
改善を行いたいのは、
 文字列の中に複数の 置換対象となる文字が含まれるにも関わらず
 1個の文字だけしか置換されない 事ですよね?
 
1つの置換が行われた「あと」の文字はどこにありますか?
B列 ですよね?
でも、被置換対象となる文字は A列を参照していますよね?
 
1個 置換終わったにも関わらず、
A列の 置換されていない 文字列 から 置換対象となる文字を取得すれば
1個 の文字だけしか置換されなくて 当然ですよね。

投稿日時: 24/03/12 13:53:15
投稿者: Nubo

自己解決したと思います。
 
以下のコードの是非を意見をお願いします。
 
Sub test()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim i As Long
    Dim j As Long
    Dim found As Boolean
      
    ' シート1とシート2を指定
    Set ws1 = ThisWorkbook.Sheets("シート1")
    Set ws2 = ThisWorkbook.Sheets("削除文字候補")
      
    ' シート1とシート2の最終行を取得
    lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
      
  ’オリジナル文字列の退避
 For i = 1 To lc1
       ws1.Cells(i, "B").Value = ws1.Cells(i, "A").Value
    Next
 
    ' シート1の各行を処理
    For i = lastRow1 To 1 Step -1
        found = False
        ' シート2のA列を検索
        For j = 1 To lastRow2
            If InStr(1, ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value) > 0 Then
                ' シート2に部分的に含まれている場合は削除してB列に書き出し
                ws1.Cells(i, "A").Value = Replace(ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value, "")
                found = True
            End If
        Next j
    Next i
 
End Sub

回答
投稿日時: 24/03/12 14:11:59
投稿者: WinArrow

問題にしているのが、
「牛」の時、B列セルは、「アジ、レタス、リンゴ、みかん」になる。
次ん「リンゴ」の時、B列セルは、「アジ、牛、レタス、みかん」になる。
つまり、「牛」が消えない
ということですよね?
 
もう一つ
こちらの問題は、説明ないが、
問題点は
「野菜」が、複数行存在した場合は、
どのように考えるのですか?
 
以下、考え方としてコード化したものです。
 
Sub test()
Dim 検索文字, i As Long, J As Long, JC As Long, JM As Long
 
    検索文字 = Sheets("sheet2").列A
    With Sheets("Sheet1")
        .列B = .列A
        For i = LBound(検索文字) To UBound(検索文字)
            JC = WorksheetFunction.CountIf(.列B, "*" & 検索文字(i) & "*")
            For J = 1 To JC
                JM = WorksheetFunction.Match("*" & 検索文字(i) & "*", .列B, 0)
                .Cells(JM, "B").Value = Replace(.Cells(JM, "B").Value, 検索文字(i), "")
            Next
        Next
    End With
End Sub
 
 
 
 

回答
投稿日時: 24/03/12 14:21:36
投稿者: sk

引用:
以下のコードの是非を意見をお願いします。

引用:
シート1
A1: 魚野菜果物

[シート1]の A 列の各行のセルに格納されている文字列が
「、」で区切られていることに何か意味があるのか否か次第。
 
------------------------------------------------
シート1
A1: 魚、肉、野菜、果物
A2: アジ、、レタス、リンゴ、みかん
A3: タン、魚肉ソーセージ、野菜ジュース、リンゴジュース
  
シート2
A1: 野菜
A2:
A3: リンゴ
------------------------------------------------
 
例えば上記のような状態である場合、[シート1]の A3 セルの値を
評価した結果、B3 セルにはどのような文字列が出力されるべきなのか、
ということ。

投稿日時: 24/03/12 15:00:15
投稿者: Nubo

疑問に付き回答いたします。
 
削除文字候補に「牛」がある時、B列セルは、
「アジ、レタス、リンゴ、みかん」になる。
 
削除文字候補に「リンゴ」がある時、B列セルは、「アジ、牛、レタス、みかん」になる。
「牛」は消えません
 
>「野菜」が、複数行存在した場合は、
存在する各行の野菜は、全て削除します。
 
>「、」で区切られていることに何か意味があるのか否か次第。
 
例(サンプル)は、見やすいように「、」で区切っただけで意味はありません。
カンマ区切りとかのDATAではありません。
 
>B3 セルにはどのような文字列が出力されるべきなのか、
 
以下のようになります。
A3:タン、魚肉ソーセージ、ジュース、ジュース

投稿日時: 24/03/12 15:09:10
投稿者: Nubo

検索文字 = Sheets("削除文字候補").列A で以下のエラーが出ます。
 オブジェクトは、このプロパティまたはメソッドをサポートしていません。
 
たぶん、「.列A」が定義されていない為では?と思いますが?

回答
投稿日時: 24/03/12 15:20:10
投稿者: Suzu

Nubo さんの引用:
自己解決したと思います。
 
以下のコードの是非を意見をお願いします。
 
Sub test()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim i As Long
    Dim j As Long
    Dim found As Boolean
      
    ' シート1とシート2を指定
    Set ws1 = ThisWorkbook.Sheets("シート1")
    Set ws2 = ThisWorkbook.Sheets("削除文字候補")
      
    ' シート1とシート2の最終行を取得
    lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
      
  ’オリジナル文字列の退避
 For i = 1 To lc1  lc1 宣言、値指定なし
       ws1.Cells(i, "B").Value = ws1.Cells(i, "A").Value
    Next  ループ処理不要
 
  例
  With ws1.Range("A1").Resize(lastRow1)
      .Offset(, 1).Value = .Value
  End With

 
 
    ' シート1の各行を処理
    For i = lastRow1 To 1 Step -1
found = False 必要性なし
        ' シート2のA列を検索
        For j = 1 To lastRow2
   InStrによる判定は必要ですか? 単にReplace だけで良くないですか?
            If InStr(1, ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value) > 0 Then

                ' シート2に部分的に含まれている場合は削除してB列に書き出し
ws1.Cells(i, "A").Value = Replace(ws1.Cells(i, "A").Value, ws2.Cells(j, "A").Value, "")
   前提仕様が違う。A列ではなく、B列に出すのでは?

 
found = True  必要性なし
            End If
        Next j
    Next i
 
End Sub

回答
投稿日時: 24/03/12 15:35:33
投稿者: sk

引用:
例(サンプル)は、見やすいように「、」で区切っただけで意味はありません。
カンマ区切りとかのDATAではありません。

その場合、
 
引用:
シート1
A1: 魚、肉、野菜、果物
A2: アジ、、レタス、リンゴ、みかん
  
シート2
A1: 野菜
A2:
A3: リンゴ

シート1
B1: 魚、肉、果実
B2: アジ、レタス、みかん
 
-----------------------------------------------------
 
のように「、」はそのまま残るべきであって、
 
引用:
シート1
B1: 魚、肉、果実
B2: アジ、レタス、みかん

のように削除された文字列と共に「、」が消えてなくなるのは
挙げるべき例として適切であるとは言えないでしょう。
 
さて本題。
 
(標準モジュール)
------------------------------------------------------------------
Sub test()
     
    Dim ws1 As Worksheet
    Dim lastRow1 As Long
       
    Set ws1 = ThisWorkbook.Sheets("シート1")
    lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
     
    Dim ws2 As Worksheet
    Dim lastRow2 As Long
     
    Set ws2 = ThisWorkbook.Sheets("削除文字候補")
    lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
       
    Dim Row1 As Long
    Dim Row2 As Long
    Dim NewValue As Variant
       
    For Row1 = lastRow1 To 1 Step -1
        NewValue = ws1.Cells(Row1, "A").Value
        For Row2 = 1 To lastRow2
            NewValue = Replace(NewValue, ws2.Cells(Row2, "A").Value, "")
        Next Row2
        ws1.Cells(Row1, "B").Value = NewValue
    Next Row1
  
End Sub
------------------------------------------------------------------
 
A 列の各行の値をそのまま残しておきたいのであれば、
以上のように任意の変数にそのセルの値を渡して、更にその変数の値を
変換した結果を同じ行の B 列のセルに代入なさればよろしいでしょう。
 
留意すべき点としては、[シート2]の A 列のセルを先頭の行から順に参照して
置換処理が実行している関係上、より上の行にあるセルの値が優先されるため、
場合によっては期待した通りの結果にならない可能性が残っている、ということ。
 
------------------------------------------------------------------
シート2
A1: 野菜
A2: 牛
A3: リンゴ
A4: 野菜ジュース
------------------------------------------------------------------
 
例えば以上のような状態になっている場合、先に「野菜」が空文字列に
置換された結果「野菜ジュース」は「ジュース」となり、その後で
「野菜ジュース」を置換しようとしてもヒットしなくなります。

投稿日時: 24/03/12 16:33:36
投稿者: Nubo

suzuさん、
 
コードの修正ありがとうございます。
 
 >前提仕様が違う。A列ではなく、B列に出すのでは?
A列にあるオリジナルを削除文字候補が含まれていれば削除して同じA列の同行に書き出す。
変更された文字列(又はオリジナル文字列)を次の削除候補が含まれるか?と順番に判断することで
最初の「複数候補にも対応するように」に対応できるように考えたので最初の仕様と変更しました。
(この説明で理解できますか?)
 
’------------------------------------------------------
skさん、
 
コードの修正ありがとうございます。
 
>のように「、」はそのまま残るべきであって、
 
おっしゃる通りで私のミス記載です。
「、」が同時に消える事は希望しません。
(「、」はそのまま残ります)
 

回答
投稿日時: 24/03/12 16:59:03
投稿者: WinArrow

Nubo さんの引用:
検索文字 = Sheets("削除文字候補").列A で以下のエラーが出ます。
 オブジェクトは、このプロパティまたはメソッドをサポートしていません。
 
たぶん、「.列A」が定義されていない為では?と思いますが?

コードを使って、考え方を説明したもので、
そのままでは動きません。
簡単に修正するならば
  
列A⇒Columns("A")
列B⇒Columns("B")
のように修正してみてください。

投稿日時: 24/03/12 18:32:32
投稿者: Nubo

イメージされたのを修正案でコードを書き換えました。
 
実行すると
以下で「実行時エラー9 インデックスが有効範囲にありません。」がでます。
JC = WorksheetFunction.CountIf(.Columns("B"), "*" & 検索文字(i) & "*")
 
 
Option Explicit
 
Sub test()
Dim 検索文字
Dim i As Long, J As Long, JC As Long, JM As Long
 
検索文字 = Sheets("削除文字候補").Columns("A")
 
    With Sheets("DATA")
        .Columns("B") = .Columns("A")
        For i = LBound(検索文字) To UBound(検索文字)
            JC = WorksheetFunction.CountIf(.Columns("B"), "*" & 検索文字(i) & "*")
            For J = 1 To JC
                JM = WorksheetFunction.match("*" & 検索文字(i) & "*", .Columns("B"), 0)
                .Cells(JM, "B").Value = Replace(.Cells(JM, "B").Value, 検索文字(i), "")
            Next
        Next
    End With
End Sub

回答
投稿日時: 24/03/12 19:55:17
投稿者: Suzu

ローカルウィンドにて確認すれば判りますが、

検索文字 = Sheets("削除文字候補").Columns("A")

 
このような方法で、配列にセルの値を代入した場合、配列は、2次元配列になります。
 
その場合
 
引用:
以下で「実行時エラー9 インデックスが有効範囲にありません。」がでます。
JC = WorksheetFunction.CountIf(.Columns("B"), "*" & 検索文字(i) & "*")

 
配列内の1列目の値の指定は
検索文字(i) ではなくて、検索文字(i,1) の様にする必要があります。
 
それと、
取得の段階で、Sheets("削除文字候補").Columns("A") とすると、
A列の最終行 1048576 行目まで 取得されます。
 
データがそこまで入っている事はないでしょうから
元々のコードでも指定していた lastRow2 の 行までの値を取得するようにしましょう。
 
 
どうせ配列を使うのであれば、
書き込み時に、シート1 の 各セルの値を参照し 1セルづつ書き込むより
被検索対象の セルの値も、配列に入れてしまい
書き込み時に、その配列の値を一気に代入した方が速度的に有利です。
 
Sub test()
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet

  Dim lastRow1 As Long
  Dim lastRow2 As Long

  Dim wd1 As Variant
  Dim wd2 As Variant

  Dim i As Long
  Dim J As Long

  Set ws1 = Worksheets("Sheet1")
  Set ws2 = Worksheets("Sheet2")

  lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
  lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row

  wd1 = ws1.Range("A1").Resize(lastRow1, 1).Value
  wd2 = ws2.Range("A1").Resize(lastRow2, 1).Value

  For i = 1 To UBound(wd1, 1)
    For J = 1 To UBound(wd2, 1)
      wd1(i, 1) = Replace(wd1(i, 1), wd2(J, 1), "", 1, -1, vbTextCompare)
    Next J
  Next i

  ws1.Range("B1").Resize(lastRow1, 1).Value = wd1
End Sub

回答
投稿日時: 24/03/12 20:58:27
投稿者: WinArrow

[quote]
以下で「実行時エラー9 インデックスが有効範囲にありません。」がでます。
JC = WorksheetFunction.CountIf(.Columns("B"), "*" & 検索文字(i)
/quote]
 
2次元に修正してください
誤:検索文字(i)
正:検索文字(i, 1)
 
修正個所は2ヶ所です。

回答
投稿日時: 24/03/12 21:47:12
投稿者: WinArrow

引用:

検索文字 = Sheets("削除文字候補").Columns("A")

 
ここは、Suzuさんのご指摘通り、データのあるだけにした方がよいですね。
 
検索文字 = Sheets("削除文字候補").Range("A1").CurrentRegion.Columns("A")
 

投稿日時: 24/03/13 08:51:45
投稿者: Nubo

Suzuさん、WinArrowさん ご指導ありがとうございます。
 
お二人のアドバイスで以下のコードを書いてみました。
これで問題なく処理できるか不安が残りますがどうでしょうか ?
 
 
 
Option Explicit
Sub test()
       
      Dim ws1 As Worksheet
      Dim ws2 As Worksheet
       
      Set ws1 = Worksheets("DATA")
      Set ws2 = Worksheets("削除文字候補")
       
       
      Dim lc1 As Long, lc2 As Long
      lc1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得
      lc2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得
       
      Dim 検索文字, i As Long, J As Long, JC As Long, JM As Long
 
      '検索文字 = ws2.Range("A1").CurrentRegion.Columns("A")
      検索文字 = ws2.Range("A1:A" & lc2)
       
      With ws1
            '元DATA退避
            For i = 1 To lc1
                  .Cells(i, "B") = .Cells(i, "A")
            Next
             
            '削除文字候補を元に削除
            For i = LBound(検索文字) To UBound(検索文字)
                  'WorksheetFunction.CountIf(セル範囲, 条件)
                  JC = WorksheetFunction.CountIf(.Range("A1:A" & lc1), "*" & 検索文字(i, 1) & "*")
                   
                  For J = 1 To JC
                        '検査範囲内でで検査値に合致する位置を返す :
                              'WorksheetFunction.Match(検査値,検査範囲,0) 0:検査値に完全一致する値
                        JM = WorksheetFunction.match("*" & 検索文字(i, 1) & "*", .Range("A1:A" & lc1), 0)
                        'Replace (文字列 , 検索文字列 , 置換文字列)
                        .Cells(JM, "A").Value = Replace(.Cells(JM, "A").Value, 検索文字(i, 1), "")
                  Next j
            Next i
      End With
End Sub
 

回答
投稿日時: 24/03/13 09:40:04
投稿者: WinArrow

何回もレスの中で話題になっているが伝わっていないようですね・・・
 

引用:

 .Cells(JM, "A").Value = Replace(.Cells(JM, "A").Value, 検索文字(i, 1), "")

  
これがあなたのやりたいことですか?
それとも仕様が変わったのかしら?
たしか、最初は、「B列セルに代入する」では?

回答
投稿日時: 24/03/13 09:42:25
投稿者: WinArrow

引用:
これで問題なく処理できるか不安が残りますがどうでしょうか ?

デバッグを回答者に依頼してはいけません。

投稿日時: 24/03/13 11:02:06
投稿者: Nubo

WinArrowさんには、
 どうも私のやりたいことを説明したのですが伝わっていないようです。
 
もう一度、suzuさん当てに記載した以前の回答を以下に再掲載します。
 
  >前提仕様が違う。A列ではなく、B列に出すのでは?
 
  A列にあるオリジナルを削除文字候補が含まれていれば削除して同じA列の同行に書き出す。
  変更された文字列(又はオリジナル文字列)を次の削除候補が含まれるか?と順番に判断することで
  最初の「複数候補にも対応するように」に対応できるように考えたので最初の仕様と変更しました。
  (この説明で理解できますか?)
 
最初の質問では、B列に書き出すでしたが
 それでは、すべての削除文字候補をチェックせずにExit Forしてしまうので
 Exit forせずに変更をA列に書き出した後も同じ行で他の削除候補文字をチェックしてあれば削除すると言う事です。
 
>デバッグを回答者に依頼してはいけません。
 
  コードのデバックでは無く、このコードで個人的にはやりたいことが出来ると感じたのですが
  他人様からの意見を問いました。
 
  これはNGと言うのであれば、これ以上は求めません。

回答
投稿日時: 24/03/13 11:54:57
投稿者: Suzu

回答者の立場の視点からですと、デバックを求められると
「知識を得たいと言うよりは、動けば良い」と考えていると感じてしまいますよ。
パット見、問題は無さそうに拝見します。
 
 
回答者としては、もともとのコード をなるべく残す様にします。
それは、質問者さんが、考えたことを尊重したいからでもあります。
 
単に動けば良いと言うことであれば、
元々のコードにとらわれずに、
Excelの機能としての、置換を行う事を選択します。
 
 
対象 Rangeオブジェクトに対し、Replaceメソッドを実行します。
 

With ws1
  .Range("B1:B" & lc1).Value = .Range("A1:A" & lc1).Value
  For i = LBound(検索文字) To UBound(検索文字)
   ws1.Columns(1).Replace _
           What:=検索文字(i, 1), _
           Replacement:="", _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           MatchCase:=False, _
           SearchFormat:=False, _
           ReplaceFormat:=False
  Next i
End With

回答
投稿日時: 24/03/13 14:06:25
投稿者: sk

sk さんの引用:
留意すべき点としては、[シート2]の A 列のセルを先頭の行から順に参照して
置換処理が実行している関係上、より上の行にあるセルの値が優先されるため、
場合によっては期待した通りの結果にならない可能性が残っている、ということ。

シート1
A1: 豚肉野菜炒めおいしい
  
シート2
A1: 野菜
A2: 豚肉炒め
 
--------------------------------------------------------
 
のような状態になっている場合、削除候補となる文字列ごとに
Replace 関数による文字列置換を繰り返すと次のような結果となります。
 
--------------------------------------------------------
 
1 回目のループ:
   対象文字列: 豚肉野菜炒めおいしい
   検索文字列: 野菜
 
   豚肉野菜炒めおいしい -> 豚肉炒めおいしい
 
2 回目のループ:
   対象文字列: 豚肉炒めおいしい
   検索文字列: 豚肉炒め
 
   豚肉炒めおいしい -> おいしい
 
最終的な置換結果: おいしい
 
--------------------------------------------------------
 
上記と同様の置換処理が実行されてもよいのであれば、
特に申し上げることはありません。
 
しかし、対象文字列(この場合は[シート1]の A 列の各セルの値)を
左側から走査し、削除候補リストのいずれかの検索文字列と
マッチする箇所が見つかったらその位置にある文字列を空文字列に置換し、
その次の位置から再び残りの対象文字列の走査を再開する
という方式を採るなら、次のような結果とならなければなりません。
 
--------------------------------------------------------
 
1 回目の走査:
  対象文字列: 豚肉野菜炒めおいしい
  パターン条件: (野菜|豚肉炒め)
  結果: "野菜"がヒット
 
   豚肉野菜炒めおいしい -> 豚肉炒めおいしい
 
2 回目の走査:
  対象文字列: 炒めおいしい
  パターン条件: (野菜|豚肉炒め)
  結果: ヒットせず
 
   豚肉炒めおいしい -> 豚肉炒めおいしい
 
最終的な置換結果: 豚肉炒めおいしい
 
--------------------------------------------------------
 
この場合、正規表現によるマッチングか、それに近いアルゴリズムで
文字列の検索と置換を繰り返す手法に変えないとダメでしょう。

投稿日時: 24/03/13 15:35:21
投稿者: Nubo

>デバックを求められると
 
又、デバックと言う言葉が出ました。
私の中ではデバックでは無いのですが伝わらないようなので
 これ以上の回答は求めない事にします。
 
お付き合い願いありがとうございます。
 
skさん、
 
確かに深読みするとそのような事は考えられますね。
正規表現(パターン)の利用は、
 とても難解なので私には理解できそうにありません。
 
付け焼刃の今回のコードを利用したいと思います。