Steveは、1万行を超えるワークシートを持っており、列Aの各セルにはファイル名が含まれています。これらの名前は2つのルールに従う必要があり、Steveはどちらの名前がいずれかのルールに違反しているかを検出する必要があります。ファイル名にダッシュが含まれている場合は、ダッシュの前後にも1つのスペースが必要です。 2番目のルールは、名前にコンマが含まれている場合、その前にスペースを入れてはならず、その後に1つのスペースを入れてください。

スティーブは、どちらか(または両方)に違反するセルをどのように強調表示できるのか疑問に思います

これらのルールの。

ワークシートで何かを「強調表示」したいと誰かが言うときはいつでも、ほとんどの人は条件付き書式を使用することを考えます。このインスタンスも例外ではありません。条件付き書式を簡単に使用して、パターン違反を強調表示できます。条件付き書式ルールを開発するための鍵は、パターンに違反した場合にTrueを返す式を考え出すことです。この式は両方の違反をチェックします:

=OR(ISNUMBER(FIND("-",SUBSTITUTE(A1," - ",""))), ISNUMBER(FIND(",",SUBSTITUTE(A1,", ",""))), ISNUMBER(FIND(" ,",A1)))

ここでは数式を3行に分割しましたが、1つの完全な数式と見なす必要があります。数式はファイル名から正しいパターン(スペース、ダッシュ、スペースとコンマ、スペース)を削除し、ダッシュまたはコンマのいずれかがファイル名に残っているかどうかを確認します。残っている場合、数式はTrueを返します。

次のように数式を使用する条件付き書式ルールを設定できます。

。チェックするすべてのファイル名を含むセルを選択します。

。リボンの[ホーム]タブが表示された状態で、[スタイル]グループの[条件付き書式]オプションをクリックします。 Excelは、条件付き書式に関連するオプションのパレットを表示します。

。 [セルのルールを強調表示]を選択し、表示されるサブメニューから[その他のルール]を選択します。 Excelは、[新しい書式設定ルール]ダイアログボックスを表示します。

(図1を参照)

。ダイアログボックスの上部にある[ルールタイプの選択]領域で、[数式を使用してフォーマットするセルを決定する]を選択します。

。 [この数式がTrueの場合の値のフォーマット]ボックスに、すでに説明した長い数式を入力します。

。 [フォーマット]をクリックして、[セルのフォーマット]ダイアログボックスを表示します。

。ダイアログボックスのコントロールを使用して、パターンに違反するセルを強調表示するために使用する形式を指定します。

。 [OK]をクリックして、[セルの書式設定]ダイアログボックスを閉じます。手順7で指定したフォーマットが、ルールのプレビュー領域に表示されます。

。 [OK]をクリックします。

手順1で選択したセルがセルA1で始まっていない場合は、最初のセルを反映するように手順5で使用した数式を変更する必要があります。 (数式内のA1の3つのインスタンスはすべて、開始セルを参照するように変更する必要があります。)

条件付き書式ルールでこの数式を使用する場合、2つの大きな「落とし穴」があります。まず、ダブルスペースを検出しません。したがって、たとえば、ファイル名に「スペース、スペース、ダッシュ、スペース」が含まれている場合、それはパターンに違反します。ただし、数式のSUBSTITUTE関数は「スペース、ダッシュ、スペース」を削除し、結果の文字列に余分なスペースを残します。この単一のスペースは、パターンの違反として検出されますが、検出されません。

これに対する解決策は、はるかに長い数式を使用するか、条件付き書式設定ルートを完全にバイパスして、ヘルパー列の使用を開始することです。これは2番目の「落とし穴」に直接フィードします。これは大きなものです:

1万行に条件付き書式を適用する(または数式を含むヘルパー列を追加する)と、ワークシートの再計算にかかる時間が大幅に増加することに気付くでしょう。ワークシートに非常に多くの数式を追加し始めると、これを回避する方法はありません。

このため、セルを強調表示するマクロを開発する方が適切な場合があります。パターンを確認するときにマクロを手動で実行できます。つまり、通常のワークシートの再計算が遅くなることはありません。

次のマクロは、選択した範囲のセルで実行されるように設計されています。

ダッシュの前に2つのスペース、ダッシュの後に2つのスペース、コンマの前に1つのスペース、またはコンマの後に2つのスペースがないことを確認します。次に、ファイル名から正しくパターン化されたダッシュとコンマを削除し、ダッシュまたはコンマが残っているかどうかを確認します。これらの条件のいずれかの違反が指摘された場合、セルは黄色でフォーマットされます。

Sub CheckFilenames1()

Dim bBad As Boolean     Dim c As Range     Dim sTemp1 As String     Dim sTemp2 As String

For Each c In Selection         bBad = False         sTemp1 = c.Text

If Instr(sTemp1, "  -") > 0 Then bBad = True         If Instr(sTemp1, "-  ") > 0 Then bBad = True         If Instr(sTemp1, " ,") > 0 Then bBad = True         If Instr(sTemp1, ",  ") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, " - ", "")

If Instr(sTemp2, "-") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, ", ", "")

If Instr(sTemp2, ",") > 0 Then bBad = True

If bBad Then             c.Interior.Color = vbYellow         Else             c.Interior.Color = xlColorIndexNone         End If     Next c End Sub

マクロの実行には時間がかかる場合がありますが、ここでも、フィールド名を確認する場合にのみ実行する必要があります。マクロでセルの書式設定を「混乱」させたくない場合は、目的のパターンに違反するファイル名の右側の列にテキストを挿入するバージョンが必要になる場合があります。

Sub CheckFilenames2()

Dim bBad As Boolean     Dim c As Range     Dim sTemp1 As String     Dim sTemp2 As String

For Each c In Selection         bBad = False         sTemp1 = c.Text

If InStr(sTemp1, "  -") > 0 Then bBad = True         If InStr(sTemp1, "-  ") > 0 Then bBad = True         If InStr(sTemp1, " ,") > 0 Then bBad = True         If InStr(sTemp1, ",  ") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, " - ", "")

If InStr(sTemp2, "-") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, ", ", "")

If InStr(sTemp2, ",") > 0 Then bBad = True

If bBad Then c.Offset(0, 1) = "BAD"

Next c End Sub

このマクロのバリエーションを実行すると、不適切なパターンのファイル名の右側のセルに「BAD」というテキストが挿入されます。その後、Excelのフィルタリング機能を使用して、テキストを含む行のみを表示できます。

もちろん、これをさらに一歩進めて、マクロが誤ってフォーマットされたファイル名を変更できるようにすることもできます。次のマクロは、選択したセルに対して機能します。これにより、各ダッシュが1つのスペースで囲まれ、各コンマの後に1つのスペースのみが続くようになります。

Sub FixFilenames()

Dim myArry() As String     Dim sTemp As String     Dim c As Range     Dim s As Variant

For Each c In Selection         myArry = Split(c, "-")

sTemp = ""

For Each s In myArry             If sTemp > "" Then                 sTemp = sTemp & " - " & Trim(s)

Else                 sTemp = Trim(s)

End If         Next s         myArry = Split(sTemp, ",")

sTemp = ""

For Each s In myArry             If sTemp > "" Then                 sTemp = sTemp & ", " & Trim(s)

Else                 sTemp = Trim(s)

End If         Next s         c = sTemp     Next c End Sub

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3015)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。