【Excel】 ワイルドカード文字について詳解

#Tips「Excelで使えるワイルドカード表現」

便利だけど分かり辛いワイルドカード表現の使い方について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/7b11bff2-7f52-5b5e-986f-2dca084df57f.png)

## ワイルドカード文字の意味

公式リファレンスでは以下のように説明されている
但し、かなり分かりづらく、誤解を招く書き方である
> 検索条件 には、半角の疑問符 (`?`) または半角のアスタリスク (`*`) をワイルドカード文字として使うことができます。ワイルドカード文字の**疑問符**は**任意の 1 文字**を表し、**アスタリスク**は 1 文字以上の任意の**文字列**を表します。ワイルドカード文字ではなく、通常の文字として疑問符やアスタリスクを検索する場合は、その文字の前に、`"~*"` のように半角のチルダ (`~`) を付けます。
> https://support.office.com/ja-jp/article/SUMIF-%E9%96%A2%E6%95%B0-169b8c99-c05c-4483-a712-1697a653039b

**ワイルドカード文字の意味（数式中での挙動）**
実際の挙動から解釈するに、以下のように覚えるのが正しい

|ワイルドカード文字|意味|
|:--|:--|
|`*`|0文字以上の「任意の**文字列**」を表す（"空文字"を含む。未入力のセルは含まない）|
|`?`|「任意の**文字列**」であり、かつ「**文字数が1文字**の文字列」を表す|

※空文字については後述

***********

##ワイルドカード文字を理解するための前提

数式中において、ワイルドカード文字が表すものはあくまで**文字列**である
対象セルのデータが文字列であれば反応するが、**数値や真偽値(TRUE,FALSE)には反応しない**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/c4b8821e-3fcf-238f-8205-409ea1977709.png)

###ワイルドカードを使用した[CONUTIF関数](https://support.office.com/ja-jp/article/COUNTIF-%E9%96%A2%E6%95%B0-e0de10c6-f885-4e71-abb4-1f464816df34?ui=ja-JP&rs=ja-JP&ad=JP)の検索条件に様々な値を入れたときの挙動

ワイルドカード文字`?`の動作が「任意の**文字列**であり、かつ**文字数が1文字**の文字列」であることを分かりやすくするため、対象の文字数を調べることができる[LEN関数](https://support.office.com/ja-jp/article/LEN-%E9%96%A2%E6%95%B0%E3%80%81LENB-%E9%96%A2%E6%95%B0-29236f94-cedc-429d-affd-b5e33d2c67cb)の動作も参考のために示す。
`=COUNTIF(●●,"*")`の計算結果が1以上であり、かつ`=LEN(●●)`の計算結果が1になる行のみ、`=COUNTIF(●●,"?")`の計算結果も1になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/c7f34b98-bdec-a99c-c29d-cfe47a7dbd49.png)


####文字列の例
セルの内容が以下のような値や数式であったとき、そのデータは原則的に文字列である
`a` `aaa01` `="aaa01"` ` =""` `="100"` `-` `}` `="TRUE"`

**注）**
`""`は空文字を表しており、**文字数が0文字の文字列**である
空文字はIF文で条件に合わなかったときに何も表示したくないときによく使われる

```:IF関数内での空文字の使用例
=IF($A2>5,"条件にヒットしました","")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/f4c1199a-c1bb-b21f-f927-02c1bf48df77.png)

未入力のセルとは見た目が同じでも意味や挙動が異なるため注意

####文字列でないものの例
セルの内容が以下のような値や数式であったとき、そのデータは文字列以外（数値や真偽値）であり、ワイルドカード文字が反応しない
`100` `=100` `-1`  `=TRUE` `=TODAY()` `=NOW()`

また、**未入力のセル**には文字列どころかデータが存在しないため、こちらにも反応しない

***********

##ワイルドカード文字の使いどころ

### ①一部の関数内

ワイルドカード文字は、以下のような関数内の**検索条件**として有効である

- COUNTIFなどのIF系集計関数/COUNTIFSなどのIFS系関数（[CONUTIF](https://support.office.com/ja-jp/article/COUNTIF-%E9%96%A2%E6%95%B0-e0de10c6-f885-4e71-abb4-1f464816df34?ui=ja-JP&rs=ja-JP&ad=JP), [SUMIF](https://support.office.com/ja-jp/article/SUMIF-%E9%96%A2%E6%95%B0-169b8c99-c05c-4483-a712-1697a653039b?ui=ja-JP&rs=ja-JP&ad=JP), [SUMIFS](https://support.office.com/ja-jp/article/SUMIFS-%E9%96%A2%E6%95%B0-c9e748f5-7ea7-455d-9406-611cebce642b?ui=ja-JP&rs=ja-JP&ad=JP), [AVERAGEIFS](https://support.office.com/ja-jp/article/AVERAGEIFS-%E9%96%A2%E6%95%B0-48910c45-1fc0-4389-a028-f7c5c3001690), …）
- [SEARCH](https://support.office.com/ja-jp/article/SEARCH-%E9%96%A2%E6%95%B0%E3%80%81SEARCHB-%E9%96%A2%E6%95%B0-9ab04538-0e55-4719-a72e-b6f54513b495), [MATCH](http://qiita.com/AQRiL_1132/items/c1dccb1ac756501926a1), [VLOOKUP](https://support.office.com/ja-jp/article/VLOOKUP-%E9%96%A2%E6%95%B0-0bbc8083-26fe-4963-8ab8-93a18ad188a1), [HLOOKUP](https://support.office.com/ja-jp/article/HLOOKUP-%E9%96%A2%E6%95%B0-a3034eec-b719-4ba3-bb65-e1ad662ed95f)

```:A1セルがcで始まってtで終わることを判定する数式_1
A1:current
B1:=NOT(NOT(COUNTIF($A$1,"c*t")))
   =NOT(NOT(1))
   =NOT(FALSE)
   =TRUE
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/d4efe78e-a69f-9487-9e4e-4c85468f0e1a.png)

IF文内の条件として利用するときは上の数式のNOT()をすべて外した状態でも動く

```:A1セルがcで始まってtで終わることを判定する数式_2
A1:current
B1:=IF(COUNTIF($A$1,"c*t"),"●","×")
   =IF(1,"●","×")
   =IF(TRUE,"●","×")
   ="●"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/c5ff451e-ac11-59b5-3d95-7b46ce39a09e.png)

▼理由
→ [【Excel】IF文の条件判定について(truthyとfalsy)](http://qiita.com/AQRiL_1132/items/f895fa87df99b0582d12)


また、以下のようにアスタリスクのみで`COUNTIF`を行えば、**対象セルに文字列データが入っていることを判定**できる

```:A1からA30セル中で文字列が入っているセルの数をカウントする数式
=COUNTIF($A$1:$A$30,"*")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/0d3327b2-0aa7-04e6-a524-d831b37393bd.png)

```:A1セルに文字列が入っていることを判定する数式
=IF(COUNTIF($A$1,"*"),"●","×")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/d288d488-dd22-d85e-a0de-516fb416fb59.png)

### ②検索機能

「Ctrl F」によって呼び出す**検索機能**や「Ctrl H」によって呼び出す**置換機能**中の検索文字列内でもワイルドカード文字が使用できる

![image](https://qiita-image-store.s3.amazonaws.com/0/103957/139515e4-6c22-9591-5403-feb95bbf6dd2.png)


**注）**
「セル内容が完全に同一のものを検索する」のオプションにチェックを入れなかったとき、
「検索する文字列」の左端と右端の両方ににアスタリスク`*`が入った検索とほぼ同じ動作を行う

`cat`で「セル内容が完全に同一のものを検索する」のオプションにチェックを入れずに検索することは、
`*cat*`で「セル内容が完全に同一のものを検索する」のオプションにチェックを入れて検索することと**ほぼ**同じ（厳密には異なる）

***************

##「=(イコール)」で比較したときのワイルドカード文字のふるまい

「=(イコール)」による比較を行ったときに`*`などのワイルドカード文字を使用したとき、ワイルドカード文字はただの文字と見做されて処理される

```:example1
A1:current
B1:=$A$1="c*t"
   =FALSE
```
```:example2
A1:c*t
B1:=$A$1="c*t"
   =TRUE
```

上記のような比較でワイルドカード文字を使用したいときは、以下のような数式を使えばOK

```:
=IF(COUNTIF($A$1,"c*t"),TRUE)
```

***********

##ワイルドカード文字を使った検索結果の例
ワイルドカード文字を使った文字列の比較を関数内で行いたいときは、`COUNTIF`を使う

ワイルドカード文字を含む「`c?t`」「`c*t`」「`ct*`」「`*ct`」「`*ct*`」は文字列検索において、
以下の表の「●」が付いている文字列とマッチが成立する

```:数式
=IF(COUNTIF([[検索対象の語]], [[ワイルドカード文字を含む検索条件]]),"●","×")
```

![image](https://qiita-image-store.s3.amazonaws.com/0/103957/051530aa-0864-2349-d2dd-aedbd38b71ab.png)

**********

##文字列検索時に`*`や`?`そのものを探したい（エスケープ処理）

文字列検索時に`?`や`*`をそのままの記号として扱いたいときはチルダ記号「~」をワイルドカード文字の前に付けてあげればOK

>ワイルドカード文字ではなく、通常の文字として疑問符やアスタリスクを検索する場合は、その文字の前に、`"~*"` のように半角のチルダ (`~`) を付けます。
> https://support.office.com/ja-jp/article/SUMIF-%E9%96%A2%E6%95%B0-169b8c99-c05c-4483-a712-1697a653039b

**例**

```:URL中の?記号を含めた文字列の完全一致判定を行う
A1:http://hoge.com?q=foo
B1:=IF(COUNTIF($A$1,"http://hoge.com~?q=foo"),"●","×")
   =IF(1,"●","×")
   =IF(TRUE,"●","×")
   ="●"
```

チルダ記号を付けたとき、ワイルドカード文字はただの文字として動くので、`~?`は`?`以外の文字にはマッチしない

```:example
A1:http://hoge.comaq=foo
B1:=IF(COUNTIF($A$1,"http://hoge.com~?q=foo"),"●","×")
   =IF(0,"●","×")
   =IF(FALSE,"●","×")
   ="×"
```