エクセル関数で特定の文字列を抽出する場合には、RIGHT関数やLEFT関数、そしてMID関数が良く使われます。今回の解説では、Power Queryでこれらの関数と同じ様に特定の文字列を抽出する方法を解説します。
また、特定の文字列の位置が不特定の場合、エクセル関数ではFIND関数やSEARCH関数が前述の関数と組み合わせて使用されます
Power Queryでは、特定の文字列の位置が不特定の場合でも一括で抽出できる裏技がありますので、そちらについても解説を行います
例えば、
下のGIF画像のように、「-」が不規則に出現する文字列の中から「左から2つ目と3つ目のハイフンの間」の文字列を抽出することもできます

では、Power Queryにて特定文字列を抽出する方法について詳細な解説をはじめます
以降の解説は、全てPower Queryエディタ(以降、エディタ)を開いた状態から解説を行います
エディタ内で使用するタブは「変換タブ」、使用メニューは「抽出」になります

目次
1.左から指定した長さの文字数を抽出
エクセル関数では、LEFT関数で行う内容です
こちらは、下の画像の「最初の文字」から抽出を行います

上の画像の「最初の文字」をクリックすると下の画像の画面が開くので、こちらで抽出する長さを指定します

OKボタンを押せば、下のGIFのように左から3文字が抽出されます

2.右から指定した長さの文字数を抽出
こちらはエクセル関数で言えば、RIGHT関数になります
下の画像にある「最後の文字」から指定します

1.の「左から指定した長さの文字数を抽出」と同じ様に、「最後の文字」をクリックした後に開くダイアログボックスにて抽出する長さを指定します

後の処理は、1.と同じです
3.位置を指定して文字列の途中から指定した長さを抽出
こちらは、エクセル関数でいえばMID関数の内容になります
こちらは、下の画面の箇所から指定を行います

「範囲」をクリックした後、次の画像の画面で「①開始インデックス」「②文字数」を指定します

①開始インデックス・・・抽出を開始する位置(0から指定可)
②文字数・・・抽出文字数の長さ
上の①②を指定して右下のOKボタンを押せば、①開始インデックスの位置から②の文字数が抽出されます

上のGIF画像では①は「3」、②は「2」を指定しています

MID関数とは違い、指定した「開始インデックス」の「数字」に+1した位置から文字が抽出されます
下の図のように、MID関数では「4」の位置が、Power Queryの開始インデックス「3」に相当します

この関数との違いは、Power Queryでは「0」から指定ができるようになっていることに起因していますので、注意が必要です
4.特定の文字列の前後の文字を抽出
①特定の文字列の前の文字を抽出
4.の①では、下の文字から、「ABC」の前の文字を抽出します

抽出は下の画像の「区切り記号の前のテキスト」を指定します

「区切り記号の前のテキスト」をクリックすると、下の画像のようにダイアログボックスが開くので、こちらで「特定の文字列」の「ABC」を指定します

特定の文字列を指定し、ダイアログボックス右下のOKボタンを押せば、「ABC」の前の文字が抽出されます

② 特定の文字列の後の文字を抽出
①と基本的に方法は一緒ですが、今回は2つ特殊な方法を付け加えます
ⅰ)繰返し「特定の文字列」が出現する場合には、位置(〇番目)を指定
ⅱ)「特定の文字列」を読み込む方向を指定
では、下の文字列から「ハイフン/-」を特定文字列としてⅱ)入力末尾から、ⅰ)「ハイフン/-」が2回目に出現した「後」の文字列を抽出します

「特定文字列の後」の文字列を抽出するには、下の画像の「区切り記号の後のテキスト」をクリックします

次に開いたダイアログボックスではまず、「詳細設定オプション」をクリックします

次に、詳細設定オプションにて2つの箇所を指定をします

詳細設定オプションでは、前述のⅱ)の通り、入力末尾からを指定します
そして、「スキップする区切り記号の数」については、2つ目を指定しますので、1つ目の「ハイフン/-」はスキップします

5.「特定の文字列の間」の文字を抽出
5.では下の文字列から、記事の冒頭のGIF画像と同じ様に、文頭から2つ目と3つ目の「ハイフン/-」の間の文字列を抽出します

今回、使用するメニューは下の画像の黄色の箇所になります

「区切り記号の間のテキスト」をクリックした後に開いたダイアログボックスにて、まずは「開始区切り記号」と「終了区切り記号」を指定します

こちらは両方とも「ハイフン/-」を指定します
次に、下の画像のように詳細設定オプションを指定します

まず、上の画像 (詳細設定オプション) の1番目の黄色の箇所「開始区切り記号(特定文字列)のスキャン」と3番目の「終了区切り記号のスキャン」の2つを指定します
こちらの2つの箇所では、特定文字列の読み込む方向を「文字列の先頭から」にするのか、それとも「末尾」からにするのかを指定します
こちらはそれぞれ、1番目は「入力の先頭から」、3番目は「開始区切り記号から入力の末尾方向へ」を指定して、読み込む方向を2つとも一致させます
そして、上の画像(詳細設定オプション)の2番目「スキップする開始区切り記号の数」は「1」を指定することで、2つ目の「ハイフン/-」を特定文字列の対象にします
もし、1つスキップせずに「0」を指定した場合には、前述のように1つ目の「ハイフン/-」が特定文字列の対象になります
次に、 上の画像の最後「スキップする終了区切り記号の数」 については、デフォルトの「0」のままにします
もし、「スキップする終了区切り記号の数」を 「1」で指定した場合には文頭から3つ目ではなく、4つ目の「ハイフン/-」が特定文字列(開始ではなく終了側)として指定されます
では、詳細設定オプションの指定が終了したら、右下のOKボタンを押します

すると、2つ目と3つ目の「ハイフン/-」の間の文字列が抽出されています

<まとめ>
今回は、次の内容について解説を行いました
1.文字列の左から指定した長さ分の文字列を抽出
2.文字列の右から指定した長さ分の文字列を抽出
3.位置を指定して文字列の途中から指定した長さを抽出
4.文字列の中から「特定の文字列」の前後を抽出
5.文字列の途中から2つの特定文字列間の文字列を抽出
上の内容の内、特に下から2つの内容については、「スキップ」や「読み込み方向」などを指定することで、高度な「抽出」が行えるようになっています
うまく「スキップ」「読み込み方向」を組み合わせて、Power Queryをより有効に活用していきましょう!
今回は以上です
参考までに今回使用したエクセルファイルを添付します
尚、クエリの読込先は全て「接続専用」になっています
最後まで長文にお付き合い頂き誠にありがとうございました
次回は文字列の置換、追加について解説します


パワークエリ利用時にエクセルのMID関数に相当するものはあるが、MIDB関数に相当する関数または同じ動作ができる手法はないでしょうか?文字数で抽出すると文字の数で分割される位置がずれるため。
テツ様、MIDB関数に相当するものはございませんので、①複数分割+②列のマージで対応できないでしょうか?
外部データの取り込みや区切り位置に利用時に分割で利用するスペースによっての固定長フィールドのデータの線を入れて区切る機能と同等の機能はないんでしょうか?
立て続けに質問して申し訳ございません。
外部データ取り込み利用(分割)→テーブルからパワークエリなら理想の動きにできますが、2段階式にすると自分以外のものが利用するとき困るので