web-dev-qa-db-ja.com

セル内のExcelテキスト値で文字「*」を検索して置換する方法(数式ではない)

この質問と非常によく似ています: Excelで文字「*」を見つけて置き換える方法

しかし、数式はそのままにしておく必要があります。 「*」が付いた2種類のセルがある約50枚以上のシートがあります

ケース1の内容-セルの値は次のようになります: "*** 1.43"

ケース2の内容-セルの値は次のようになります: "= 100 * B3"

アスタリスクを乗数として使用する数式を含むケース2のセルを無視して、すべてのケース1のアスタリスクを見つけて「」に置き換えたいと思います。基本的に、静的セルを変更しますが、数式でセルを変更しないでください。

ありがとう!

6
StillLearning

Excel 2013以降を使用している場合は、次のルーチンを使用できます。 ThisWorkbookモジュールにコードを配置します。 1回実行します。ブック全体で適切なセルを更新します。

Sub SetStarsBlank()

    For Each ws In ThisWorkbook.Worksheets
        For Each c In ws.UsedRange
            If Not Application.WorksheetFunction.IsFormula(c) Then
                c.Value = Replace(c.Value, "*", "")
            End If
        Next
    Next

End Sub
3
LtCdr Data

まず、問題が発生した場合に備えて、ファイルのコピーを作成します。

次に、次のVBAサブルーチンを作成します。

Sub StillLearning1()

    For Each c In Range("A1:Z100")
        If Not c.HasFormula Then
            temp = WorksheetFunction.Substitute(c.Value, "*", "")
            If Left(temp, 1) = "=" Or Left(temp, 1) = "'" Then
                temp = "'" & temp
            End If
            c.Value = temp
        End If
    Next c

End Sub

Excelおよびその他のMicrosoftOfficeアプリケーションでVBAを使用する方法の一般的な情報については、 MS OfficeでVBAを追加するにはどうすればよいですか? を参照してください。 StillLearning1は単なる任意のサブルーチン名です。好きな名前を使用してください。 A1:Z100を置換を実行する範囲に変更します。私は残りがいくぶん自明であることを願っています:

  • For Each c ... Next cは、2600回実行されるループです(A1:Z100のサンプル範囲の場合; 26列×100行)。cはすべてのセルに移動します。その範囲で。
  • c.HasFormulaは、セルcに数式が含まれているかどうかを示すブール値です。 =を含むセルは文字列(テキスト)値であるため、これは最初の文字が'===であるかどうかを確認するよりも少し信頼性がありますが、===のように見えます。 =で始まるように見えます。

    セルに数式が含まれている場合。ほっといて。 に数式が含まれていない場合、置換を行います。

  • 置換の結果をチェックして、=または'で始まるかどうかを確認します。含まれている場合、セルに直接割り当てると、Excelがその最初の文字を望ましくない方法で解釈するため、'を先頭に追加して保護します。

次に、サブルーチンを実行します。

2
Scott

必要に応じて、数式ベースのアプローチを使用できます。

これは、セル式では機能しないEVALUATE()関数に依存しますが、名前付き範囲では機能します。誰もがこれを行うことができます、Excelのすべてのバージョン。セルに「= EVALUATE(」と入力するだけで、使用できないように見えますが、名前付き範囲で正しく実行すると問題ありません。

したがって、条件ごとに1つずつ、2つの名前付き範囲を作成します。 1つの「式」を呼び出し、「参照先」ボックスにこれを使用して名前付き範囲を作成します。

_=EVALUATE(FORMULATEXT(Sheet1!A1))
_

「NotFormula」と呼ばれる別の名前付き範囲を作成し、「参照先」ボックスにこれを指定します。

_=EVALUATE(SUBSTITUTE(Sheet1!A1,"*",""))
_

(作業するセルの隣のセルを選択した場合、A1がここで想定されているため、名前付き範囲を作成するときにB1に駐車します。気が付くと、相対参照を使用します。ヘルパーの場所に基づいて、駐車する場所を選択します。列が存在します。)

次に、「ヘルパー列」を使用します(スプレッドシートの入力によって、または別のシートに、このために追加されてから削除されたものもあります。次の数式を入力します。

_=IF(ISFORMULA(A1),Formula,NotFormula)
_

IS数式の場合、Formulaが結果になります。そうでない場合、 `NotFormulaが結果になります。

FormulaFORMULATEXT()の結果を取得して評価し、それが与えるテキスト文字列を実際の数式に変換します。少なくとも「技術的に」そうでない場合は結果になります。それを達成するために私が知っている唯一の非マクロな方法です。

NotFormulaは単にSUBSTITUTE()を使用してアスタリスクを置き換えます。アスタリスクの前にチルダを付けるという_Find and Replace_要件は必要ありません。 「1.43」の前にスペースが続くため、このプロセスでは例で文字列が生成されることに注意してください。ただし、この方法では実数になります。つまり、実数です。あなたが望むものかもしれませんが、そうではないかもしれません。そうでない場合は、名前付き範囲で、関数をTEXT()関数でラップして、そのスペースを保持します。

したがって、ヘルパー列が必要です。つまり、元のデータと結果を並べて表示するのではなく、元のデータを置き換える場合は、元のデータに値をコピーして貼り付けてから、ヘルパー列を削除する必要があります。結果とオリジナルを並べて表示したい場合は、すでにゴールドです。

ただし、[〜#〜] do [〜#〜]EVALUATE()を使用できるので、セルで使用することはできません。名前付き範囲内で使用する必要があります。

また、彼らは27年間それがなくなるかもしれないと言ってきました。 「27年」の部分で将来的に安全に使用できると確信できない場合は、他のものが古いExcel 4マクロ機能に依存していること、関数自体ではなくそれらの関数の基礎となっていること、Excelでは決してできないことを示す兆候がいくつかあります。本当にそれらを取り除く。そう...

2
Jeorje