Excel。文字列の任意の位置から文字を取り出せるのが、MID関数です。
<関数辞典:MID関数>
MID関数
読み方: ミッド
分類: 文字列操作
MID(文字列,開始位置,文字数)
文字列の任意の位置から文字を取り出す
【Excel・Word・PowerPoint・Access】あなたの「困った」を解決!10年以上の経験が詰まった、現場の疑問から生まれた実践テクニック集。作業効率を劇的に上げるOffice活用術をお届けします。
MID関数
読み方: ミッド
分類: 文字列操作
MID(文字列,開始位置,文字数)
文字列の任意の位置から文字を取り出す
銀行の入出金用紙などで、口座番号を一桁ずつ右から埋めていくわけですね。
次の表のように、Excelで手早くやるにはどうしたらいいのでしょうか。
これを、SEQUENCE関数を中心とした、一つの数式で、手早く処理することができます。
C2には、
=MID(TEXT(A2,"00000"),SEQUENCE(1,LEN(TEXT(A2,"00000"))),1)
という数式を設定します。
あとは、オートフィルで数式をコピーします。
MID+SEQUENCE+LEN関数の組み合わせで、1つのセルに1文字ずつわりふることができます。
=MID(A2,SEQUENCE(1,LEN(A2)),1)
とすれば、文字列の場合ならば、対応できるのですが、数値だと、次のように、左側から割り振ってしまいます。
数式を確認しておきましょう。
最初のMID関数は、指定の位置から文字列を抽出することができる関数です。
最初の引数が「文字列」なので、A2を設定します。
ただ、桁が足らない場合、「0(ゼロ)」を表示したいので、TEXT関数をつかって、5桁にするようにします。
なので、最初の引数は、「TEXT(A2,"00000")」と設定します。
2つ目の引数が「開始位置」です。
ここに、SEQUENCE関数をつかいます。
SEQUENCE関数の説明は後にしまして、MID関数の3つ目の引数は「文字数」です。何文字抽出するかということなので1文字ずつなので「1」と設定します。
さて、SEQUENCE関数の説明ですが、
SEQUENCE関数の最初の引数は、「行」です。複数行にまたがることはありませんので「1」と設定します。
2つ目の引数は、「列」です。何列必要なのかという、列数を設定することで、スピル機能によって、自動的に2文字目3文字目と表示してくれます。
そこで、LEN関数をつかって、文字数=列数を設定することができますので、LEN(TEXT(A2,"00000"))とします。
あとの引数は省略できますので、省略。
これで、数値の場合対応することができるというわけです。
SEQUENCE関数の登場で、今までは複雑な数式、あるいは、中間結果を算出してから結果を求めるなどしていた数式を、シンプルな数式にすることができます。
今回は、SEQUENCE関数をつかって、手早く、文字列をセルに1文字ずつに分けて表示する方法をご紹介します。
文字数はバラバラ。
A5は、「立花 宗茂」と入力してあって、苗字と名前の間に半角スペースが入力されています。
C2に、SEQUENCE関数をつかった数式を設定します。
=MID(A2,SEQUENCE(1,LEN(A2)),1)
あとは、C5まで、オートフィルで数式をコピーするだけで、文字列をセルに1文字ずつに分けて表示することができました。
数式を確認しておきましょう。
最初のMID関数は、指定の位置から文字列を抽出することができる関数です。
最初の引数が「文字列」なので、A2を設定します。
2つ目の引数が「開始位置」です。
ここに、SEQUENCE関数をつかいます。
SEQUENCE関数の説明は後にしまして、MID関数の3つ目の引数は「文字数」です。
何文字抽出するかということなので1文字ずつなので「1」と設定します。
さて、SEQUENCE関数の説明ですが、
SEQUENCE関数の最初の引数は、「行」です。
複数行にまたがることはありませんので「1」と設定します。
2つ目の引数は、「列」です。
何列必要なのかという、列数を設定することで、スピル機能によって、自動的に2文字目3文字目と表示してくれます。
そこで、LEN関数をつかって、文字数=列数を設定することができますので、LEN(A2)とします。
あとの引数は省略できますので、省略。
これで、文字列をセルに1文字ずつに分けて表示することができるというわけです。
データを読み込んでみたら、時間のデータが、なんと数値になっていた。
しかも、0~9時台は、5桁の数値。
それ以降は6桁の数値として、入力されていることがわかりました。
C2に設定した数式は、下記のようになります。
=TEXT(TIME(MID(TEXT(A2,"000000"),1,2),MID(TEXT(A2,"000000"),3,2),MID(TEXT(A2,"000000"),5,2)),"h:mm:ss")
数式自体は、長いのですが、やっていることは、同じようなことをやっていますので、一つずつ確認していきます。
MID関数は、指定した文字列から指定した文字数目から、指定の文字数を抽出する関数です。
MID関数の引数に、TEXT(A2,"000000") とTEXT関数をつかっているのは、5桁の場合、つまり0時台~9時台までの場合、頭に「0(ゼロ)」をついかしたいわけです。
数値の前に「0」を付けることはできませんので、表示形式のTEXT関数をつかって、5桁の場合0を付ける作業をしています。
6桁はそのままです。
これで、5桁のデータも6桁にすることができましたので、時・分・秒のデータを抽出しますので、MID関数をつかうというわけです。
あとは、TIME関数で、時・分・秒のデータを結合させれば、完成です。
ただ、今回その外側にTEXT関数を設定しているのは、AM/PM表示になってしまいます。
h:mm:ss形式で表示したかったので、TEXT関数をつかって、表示形式を整えてみました。
そもそも、時間として入力されていればいいわけですが、もし数値だった場合は、手間がかかってしまいます。
都道府県から建物名まで、一つのセル内に入力されている場合、都道府県だけを別のセルに抽出したい場合、残念ながら簡単に抽出することができません。
やはり、関数をつかって抽出するのが、簡単なようです。
上記の表のように、B列に住所が入力されていて、C列に都道府県を抽出する場合、C2には、次の数式を設定するだけで、抽出することができます。
=LEFT(B2,(MID(B2,4,1)="県")+3)
たったこれだけで、あとは、オートフィルで数式をコピーすると都道府県を住所から抽出することができます。
なんとなくIF関数を使うイメージがありますが、IF関数をつかわなくても、LEFT関数とMID関数を組み合わせてつかうだけで、抽出することができます。
さて、そもそも、住所から都道府県を抽出することが面倒なのかというと、「神奈川県・和歌山県・鹿児島県」問題があるからです。
要するに、この3県だけが、県まで含めて4文字なわけです。
北海道も京都府や大阪府。
そして東京都も3文字です。
全部が3文字ならば、LEFF関数をつかって、左から3文字まで抽出とすればいいのですが、そういうわけにはいきません。
なので、左から4文字目が「県」だったら、左から4文字を抽出して、それ以外は左から3文字を抽出する数式を作るわけです。
そのため、IF関数をつかって数式をつくってもいいわけですが、さらに簡単な数式にしたのが、今回のLEFT+MID関数の方法というわけです。
では、数式を確認しておきましょう。
=LEFT(B2,(MID(B2,4,1)="県")+3)
LEFT関数は、左から引数内で指定された文字数を抽出する関数です。
1つ目の引数「B2」は対象となるセル番地なので、B2ですね。
2つ目の引数が、左から何文字目まで抽出するのか指示するわけです。
そこで、MID関数をつかうことで、4文字目が「県」かどうかを判定さえています。
それが、
MID(B2,4,1)="県"
です。
そして、最後に「+3」しているわけですが、この+3も含めて、LEFT関数の2つ目の引数内です。
なぜ、+3をしているのかというと、先程の「MID(B2,4,1)="県"」が、県の場合、このMID関数の式が成立しているので「TRUE」なわけです。
Excelでは「TRUE」を「1」としていますので、「1」+「3」で「4」と算出されるので、左から4文字目が「県」ならば、左から4文字を抽出するというわけです。
「県」でなければ、成立していないので「FALSE」となり、Excelでは「FALSE」を「0」としています。
「0」+「3」で「3」と算出されるため、IF関数をつかわなくても、住所から都道府県を抽出することができるというわけです。
「TRUE」と「FALSE」を考えに入れると、数式がコンパクトになる可能性がありますので、色々試してみるといいかもしれませんね。
なんでそんなことしちゃったのという、Excelの帳票をみることがあります。
例えば、数値をセルごとに分割してある帳票。
このような場合、一の位で合算して、繰り上がったら…なんてやっていたら、桁数が増えたら大変というか、数式を考えるだけでも大変です。
最初にやることは、結合して1つのセルにまとめて数値にします。
A6に次の数式を作り、交通費を一つのセルにまとめます。
A6に設定した数式は、
=CONCAT(B2:G2)
同じように、A7に、宿泊費を一つのセルにまとめます。
=SUM(A6:A7)
ところが、「0」と算出されてしまいました。
原因は、よくみると、A6とA7は、左揃えになっています。
これは文字型になっていることを表しています。
CONCAT関数は、文字結合をする関数なので、算出されたものは、文字になっていて数値ではないわけです。
そこで、A6とA7の数式のうしろに「*1」を追加します。
こうすると、文字型は文字型でも、数値文字型に変わるので、合算値を算出することができます。
あとは、どうやって、一つずつのセルに分割して表示させる数式を考えていきます。
=IFERROR(MID($A$8,LEN($A$8)-COUNT(C1:$G$1),1)*1,"")
あとは、この数式をG4まで、オートフィルで数式をコピーすれば完成です。
数式が長くなったので、説明していきます。
B1:G1までの見出し行は、「十万・一万…一」と表示してますが、元は、普通の数値が入力してあって、表示形式をつかって、漢数字にしています。
別に直接、漢数字で入力しても問題はありません。
最初の「IFERROR関数」は、数値がない場合、#VALUEというエラーが発生するので、エラーならば空白にするようにしています。
MIDはセル内の文字列を指定の場所にある、指定した文字数分だけ抽出する関数です。
先程、合算値を算出したA8を指定します。
オートフィルで数式をコピーしますので、絶対参照を忘れずに設定します。
何文字目の文字なのかを指定します。
「LEN($A$8)-COUNT(C1:$G$1)」
LEN関数は、文字数を算出する関数です。これで合算値が何桁なのかを算出します。
その値から、C1:G1の数値の個数を算出した値を減算します。
桁数をずらす必要があるので、終点のみを絶対参照に設定しておきます。
今回の例としては、
LEN($A$8)は、「5」
COUNT(C1:$G$1)は、「5」
5-5=0なので、0文字目を抽出ということになるのですが、0文字目を抽出というのは、おかしいので、エラーが表示されるわけですね。
このように、ちょっと複雑な数式になっていますね。
帳票上の必要があるかもしれませんが、基本的には、数値を一つずつ、一つのセルごとに分割する場合には、アレコレ、アイディアが必要になりますね。
見た目、日付とわかるからという感じで、何も考えないで入力している場合、Excelの機能を使えないということが、ちょこちょこあります。
例えば、次のような日付計算。
C4には、C3-C3という数式が設定してあります。
B4には、#VALUE!というエラーが表示されていますが、C4は、普通に減算された結果が算出しています。
何が違うのかというと、B列の日付は、「.(ピリオド)」で区切られた日付になっています。
「.(ピリオド)」で区切られいる日付は、見た目が日付なだけで、Excelとしては、日付と認識していません。
「文字」として認識されているので、#VALUE!というエラーが表示されてしまっているのです。
最初から「/(スラッシュ)」で区切っていれば、問題はなかったのです。
今回のように、2件程度のデータならば、入力し直すことも容易ですが、件数が多い場合は、絶望的な作業となってしまいます。
そこで、「.(ピリオド)」を「/(スラッシュ)」に変換する方法を紹介していきます。
とても単純ですが、現場レベルとしては重要な作業です。
C2には、次の数式を設定してあります。
=DATE(LEFT(B2,4),MID(B2,6,2),RIGHT(B2,2))
年月日を別々のセルに算出するならば、YEAR関数やMONTH関数などをつかって、抽出するわけです。
ところが、「.(ピリオド)」で区切ってしまっていると文字型になってしまっているので、YEAR関数などの日付系の関数を使うことができません。
文字型のデータならば、LEFT関数・MID関数・RIGHT関数をつかうことで、対応することができます。
そして、DATE関数をつかうことで、日付にすることができます。
DATE関数の最初の引数は、「年」の設定です。
左から4文字が年ですから、
LEFT(B2,4)
と設定することで、「年」を抽出することができます。
次の引数ですが、左から6文字目からの2文字を抽出する必要があります。
文字列の途中の文字を抽出したいので、MID関数を使います。
MID(B2,6,2)
と設定することで、「月」を抽出することができます。
最後の引数ですが、MID関数を使うよりも、右から数えた方が簡単なので、RIGHT関数を使います。
RIGHT(B2,2)
と設定することで、「日」を抽出することができます。
あとは、オートフィルで数式をコピーしています。
ただし、日付にはなるのですが、「0(ゼロ付)」の日付になっていません。
なお、TEXT関数をつかってしまうと、「0(ゼロ付)」の日付にすることはできるのですが、日付文字型になってしまうので、注意が必要です。
入力するという作業では、今回のように、もったいないというか、あとで、面倒な作業が発生することもありますので、ちょっと気を遣う必要がありますね。
今回は、MEDIAN関数~MINIFS関数までをご紹介しております。
MEDIAN関数
メディアン
中央値を算出します。
MEDIAN(数値1,[数値2]…)
MID関数
ミッド
文字列の任意の位置から文字を取り出す
MID(文字列,開始位置,文字数)
MIDB関数
ミッドビー
文字列の任意の位置から指定バイト数の文字を返す
MIDB(文字列,開始位置,バイト数)
MIN関数
ミニマム
最小値を算出します。
MIN(数値1,[数値2]…)
MINA関数
ミニマムエー
数値・文字列・論理値を含む最小値を算出します。
MINA(値1,[値2]…)
MINIFS関数
ミニマムイフズ(ミニマムイフエス)
条件により指定した範囲内の最小値を算出
MINIFS(最小範囲,条件範囲1,条件1,…)
あるアンケート結果の表があります。
例えば、NO1の「54132」は、問1を「5」問2を「4」というように答えています。
しかしながら、結果を連結してしまっているので、データとして使い勝手が悪いので、次のように、セルごとに結果を表示させたいわけです。
当然、自力でコツコツと入力するとしたら、膨大な時間を費やしてしまうのは明らかです。
Excel VBAでマクロを作ってとか思いがちですが、ちょっとした関数を使えば、比較的容易に、セルごとに文字を入力することができます。
文字列を指定された位置から、指定された文字を抽出したいわけですね。
このような時には、『MID関数』がオススメです。
では、C2に次のような数式を設定します。
=MID($B2,COLUMN(A1),1)
数式をオートフィルでコピーすれば、完成します。
では、簡単にMID関数でつくった数式の説明をします。
最初の引数。
「$B2」。
元の文字列はB列にあります。
オートフィルでコピーするので、複合参照にしています。
2番目の引数には、「COLUMN(A1)」と設定しました。
この2番目の引数は、開始位置を設定するわけですが、C2の数式は、一文字目ですが、D2は、二文字目を抽出させるようにする必要があります。
要するに、開始位置をずらさないといけません。
どうにか、1・2・3…とオートフィルでコピーした時にずれてほしい。
列番号を使えば対応することができそうです。
列番号を算出するには、「COLUMN関数」を使うことで、算出できます。
3番目の引数は、何文字、抽出するの?ということですから「1」と設定すればいいわけです。
これで、セル内の文字を、一文字ずつセルに入力することができます。
さて、今度は逆で、セルごとに一文字ずつ入力されているのを、一つのセルにまとめるには、どうしたらいいのでしょうか?
今回のようにセルの文字を結合させるのに便利な関数があります。
それが「CONCAT関数」。
このCONCAT関数は新しく登場した関数で、CONCATENATE関数が進化した関数です。
では、B2に次の数式を設定して、オートフィルでコピーしてみましょう。
B2の数式は、
=CONCAT(C2:G2)
たったこれだけです。
CONCATENATE関数では、この範囲選択で文字接続をすることができなかったので、少々面倒でした。