- ベストアンサー
EXCELで条件により文字列を変化させる関数
EXCELで条件により文字列を変化させる関数を使いたいのですが、うまくいかないのでアドバイスをください。 気温情報を毎日インターネットから得て加工したいのです。 具体的には、 高い北海道 変わらず京都 低い東京 などのような、気温+地名からなる文字列が得られるのですが、これらの文字列から、「高い」「変わらず」「低い」といった部分だけを消して、地名だけを残したいのです。 「高い」「変わらず」「低い」のどれが表示されるかは日によって異なるので、どれが出てもそれらを消せるような関数を作りたいのです。 たとえば、A1セルに、「高い東京」「変わらず東京」「低い東京」 のどれが入っても、結果として「東京」だけ残るようにしたければどのような関数にすればよいのでしょうか? IF関数を複数使うんだろうとは思うのですが、素人なので手が出ません。どうかよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Ifは使いませんが・・・置換えています。 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"高い",""),"変わらず",""),"低い","")
その他の回答 (4)
- KenKen_SP
- ベストアンサー率62% (785/1258)
例えば、 「東 京」のように文字間にスペースがあったり、なかったり 「北海道は高いが、京都は変わらず」のような変則的なデータ などへの対応を考えれば、この手の問題は VBA + RegExp を使った方が 手っ取り早いかも。 標準モジュールに下記コードを貼り付けた後、ワークシートのセルに = GetPref(A1) と数式を入力して下さい。 ' // 都道府県名抽出 Public Function GetPref(ByVal sTarget As String) As String Const PREF = "(北海道|" _ & "青森|岩手|秋田|宮城|山形|福島|" _ & "東京|神奈川|埼玉|千葉|茨城|栃木|群馬|山梨|" _ & "新潟|長野|" _ & "富山|石川|福井|" _ & "愛知|岐阜|静岡|三重|" _ & "大阪|兵庫|京都|滋賀|奈良|和歌山|" _ & "鳥取|島根|岡山|広島|山口|" _ & "徳島|香川|愛媛|高知|" _ & "福岡|佐賀|長崎|熊本|大分|宮崎|鹿児島|" _ & "沖縄)" GetPref = GetKeyword(sTarget, PREF) End Function ' // 正規表現パターン sPattern にマッチするキーワードを抽出する ' // 複数マッチした場合はカンマで連結 Public Function GetKeyword( _ ByVal sTarget As String, _ ByVal sPattern As String _ ) As String Dim MC As Object ' MatchCollection Dim m As Object ' Match Dim sBuf As String sTarget = Replace$(sTarget, " ", "") sTarget = Replace$(sTarget, " ", "") With CreateObject("VBScript.RegExp") .Pattern = sPattern .IgnoreCase = False .Global = True Set MC = .Execute(sTarget) End With If MC.Count > 0 Then For Each m In MC sBuf = sBuf & m.Value & "," Next m GetKeyword = Left$(sBuf, Len(sBuf) - 1) End If Set MC = Nothing End Function
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 関数ではありませんが、マクロでやれば簡単です。 標準モジュールに登録してください。 最初に、以下の設定範囲の部分を書き換えてください。一列でも、複数列でも可能です。 Private Const PREFECT_LIST = "北海道,青森,岩手,秋田,宮城,山形,福島,新潟,富山,石川,福井,長野,茨城,栃木,群馬,埼玉,千葉,神奈川,山梨,東京,岐阜,静岡,愛知,三重," & _ "滋賀,京都,兵庫,奈良,和歌山,大阪,鳥取,島根,岡山,広島,山口,徳島,香川,愛媛,高知,福岡,佐賀,長崎,熊本,大分,宮崎,鹿児島,沖縄" Private PreFect_Lists As Variant Sub PickupPrefecture() Dim i As Integer Dim buf As String Dim sFind As Variant Dim rng As Range Set rng = Range("A1:A100") '設定範囲 'リストの生成 If Not IsArray(PreFect_Lists) Then Do buf = Replace(PREFECT_LIST, " ", "", , , vbTextCompare) Loop While i > InStr(buf, " ") PreFect_Lists = Split(buf, ",") End If Application.ScreenUpdating = False For Each sFind In PreFect_Lists With rng .Replace _ What:="*" & sFind & "*", _ Replacement:=sFind, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows End With Next Application.ScreenUpdating = True End Sub
- bluechip05
- ベストアンサー率22% (50/225)
A1セルに"~東京"と入っているとして =IF(LEFT(A1,4)="変わらず",RIGHT(A1,LEN(A1)-4),IF(LEFT(A1,2)="高い",RIGHT(A1,LEN(A1)-2),IF(LEFT(A1,2)="低い",RIGHT(A1,LEN(A1)-2),A1))) これで"変わらず東京"でも"高い東京"でも”低い東京"でも東京になります。 意味としては left(A1,4)は、left関数はA1のセルから左4文字を取る len(A1)は、A1セルの文字列の長さを取得する right(A1,LEN(A1)-4)は、A1セルの右側からA1セルの文字列-4を引いた文字数分だけ抜き出す(4を引くのは"変わらず"の文字数でA1の文字数から"変わらず"の文字数を引いた文字数:この場合残りは2文字で東京) ifは、if(条件式,条件を満たすならこの値が入る,条件を満たさないならこの値が入る) です。 例ではifの関数が入れ子になっていて判りにくいですが、すべて条件を満たさないときは次の条件となってます) かなりわかりにくいけど、応用は効くと思います。
- maron--5
- ベストアンサー率36% (321/877)
◆いろんな方法があるでしょうが、一例です =REPLACE(A1,1,LOOKUP(10^10,1/(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<10000)*ROW(INDIRECT("1:"&LEN(A1)))),)