こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

条件により表示文字数を変えたい

気象庁から取得した天気情報を使って一覧を作成していますが、2文字以上の天気の場合(「晴後曇」など)晴のみの表示にし、快晴、大雨などはそのまま表示したいです。

=IF(COUNT(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)>=3),MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,1),VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20))

現在、この状態で、快晴が快、晴後曇は晴、大雨・快晴などは最初の1文字になっています。
midの部分を2にすると快晴は快晴、晴後曇が晴後、大雨などは大雨になります。
どのようにすればよいでしょうか。
orやandを使って見ましたが、自分の知識ではうまく表示させることができませんでした。

投稿日時 - 2015-03-03 12:46:20

QNo.8928331

暇なときに回答ください

質問者が選んだベストアンサー

 前提条件を確認させて下さい。

>現在、1シートに複数月を表示しています(A6からU120程度までの範囲(約3ヶ月))

>VBAによる複数月の取得範囲が2014/12/1~2015/3/1ですと2015/1/1はA44に。1~3月ですとA7にきます。

 Sheet7に複数月が表示される場合、少なくとも「『一番下に表示されている月』以外の月」は1日~月末までのデータが表示されるものと考えておけば宜しいのでしょうか?
 つまり、例えば取得範囲が2014年12月~2015年3月の場合は、少なくとも2014/12/1~2015/2/28の範囲のデータは必ず全て表示されていて、例えば「2014年12月分が10日から始まっている」とか「2015年2月分が20日までしか表示されていない」という様な事は無いと考えておけば宜しいのでしょうか?


 後、

>取得データは
>A3に2015年1月(2015/1/1)括弧内は実際のセル内の値です。
>  A       T
>5:日  ・・・ 天気
>6:1      晴
>7:2      雨
>8:3      薄曇
>というような形になっています。

という事から考えて、

>複数月の取得範囲が2014/12/1~2015/3/1ですと2015/1/1はA44に。

の場合も、「『2015年1月』と表示されているセル」の3つ下のセルに2015/1/1の日付である事を示す数値の1が表示されていて、その「2015/1/1の日付である事を示す数値の1が表示されているセル」と同じ行のT列に「2015/1/1の天気のデータ」が入力されているものと考えておけば宜しいのでしょうか?


 もし上記の前提条件の確認事項が全てyesである場合には、Sheet1のA8セルに入力する関数を次の様なものにされると良いと思います。

=IF(ISNUMBER(1/(YEAR(AA7)>1871)),IF(ISERROR(1/(VLOOKUP(DAY(AA7),OFFSET(INDEX(Sheet7!$A:$A,MATCH(EOMONTH(AA7,-1)+1,Sheet7!$A:$A,0)),1,,DAY(EOMONTH(AA7,0))+2,21),20,FALSE)<>"")),"",LEFT(VLOOKUP(DAY(AA7),OFFSET(INDEX(Sheet7!$A:$A,MATCH(EOMONTH(AA7,-1)+1,Sheet7!$A:$A,0)),1,,33,21),20,FALSE),FIND("後",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(VLOOKUP(DAY(AA7),OFFSET(INDEX(Sheet7!$A:$A,MATCH(EOMONTH(AA7,-1)+1,Sheet7!$A:$A,0)),1,,33,21),20,FALSE),"時々","後"),"一時","後"),"、","後")&"後")-1)),"")

投稿日時 - 2015-03-15 16:14:08

補足

全てYesですので、ご呈示頂いた関数を使用させていただくと月が変わっても範囲をきりかえることなく表示できました。
現状、どうなっているのか理解が難しいので、徐々に読み解いて行きたいと思います。

ただ、12月から3月までを表示したときに、なぜか12/31だけが空白になってしまいます。取得範囲を11~2、12~3など切り替えても同じ結果になります。
その1日だけなので、不思議なのです。

投稿日時 - 2015-03-16 09:20:20

お礼

ここまでおつきあい頂き、本当にありがとうございます。

投稿日時 - 2015-03-16 09:20:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(12)

ANo.12

>12月から3月までを表示したときに、なぜか12/31だけが空白になってしまいます。

 気象庁 > 各種データ・資料 > 過去の気象データ検索 > 日ごとの値のページから、2014/12/1~2015/3/15のデータを、1月ずつ4回に分けてコピーし、こちらで試作していたExcel bookのSheet7に縦に並べて貼り付けてみましたが、同bookのSheet1には2014/12/31のデータが正常に表示されておりました。
 もしかして、質問者様の方のSheet1において、12/31の所だけ年を間違えて入力していたり、「『○○○○/12/31』という形式の日付を表す文字列」に何か余計な文字が付け加わった文字列データになっていたり、セルの書式設定の関係で「日付を表すシリアル値」ではない単なる文字列データとなっていたり、などといった事は無いでしょうか?

 後、可能性は低いと思いますが、VBAによってコピー&ペーストされたSheet7のA列のデータの内、12/31の所だけ、

31

という数値データではなく、何らかの文字列データか、或いは別の日付になってしまっているなどという事はないでしょうか?
 或いは、行がずれていて、Sheet7のT列の12/31の天気データの所が空欄になってしまっているなどという事はないでしょうか?

投稿日時 - 2015-03-16 12:31:30

お礼

設定の違いのようです。
新シートで試して見ると表示できました。
どこが違うのかまだ把握できていませんが、これから調査してみます。
この度は長い間おつきあい頂きありがとうございました。

投稿日時 - 2015-03-18 09:48:01

ANo.10

 御補足頂いたVBAを試してみましたが、Excelのバージョンの違いによるものなのか、マクロを起動させても何も起こりませんでした。
 しかしながらVBAの中に記述されているURLから、何処の情報を得ているのかは判りましたので確認致しました。
 それで判ったのですが、結局の処、晴や雨といった天気の情報が表示されるのは、1ヶ月分のみの日ごとの情報を表示させた場合のみの様です。
 そうなりますと、

>実データでは12月~3月、1月~3月など場合によって取得範囲がまちまちになる

という様な場合には、御質問内容にある天気の情報は表示されないので、複数月に亘るデータに対しては、天気を表す文字列を取得する必要は無い、つまり、本件では考慮する必要は無いと考えても宜しいのでしょうか?

 もしそうであるとした場合、次の様な関数は如何でしょうか?

=IF(ISNUMBER(1/DAY(AA7)),IF(OR(Sheet7!$A$3<>DATE(YEAR(AA7),MONTH(AA7),1),ISERROR(1/(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20,FALSE)<>""))),"",LEFT(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20,FALSE),FIND("後",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20,FALSE),"時々","後"),"一時","後"),"、","後")&"後")-1)),"")

 これは、質問者様が考えておられる様な「元の文字数に応じて取得文字数を変える」や「『みぞれ』等の様々なパターンを網羅して取得文字数を決める」というものとは違い、「○○後××」、「○○一時××」、「○○時々××」、「○○、××を伴う」といったパターンおいて、「後」、「一時」、「時々」、「、」の直前の所までの文字列を取り出す関数です。

投稿日時 - 2015-03-12 13:40:34

補足

今回もこちらの補足の仕方が悪く下記のようにしっかり記載できる説明をしなければいけなかったのを補足時にうまく言葉にできず、申し分けありません。

現在、1シートに複数月を表示しています(A6からU120程度までの範囲(約3ヶ月))
そこからSheet1のAA7と同一になる日を探してAA8に天気を表示したいです。

例えば、Shet1のAA7が2015/1/1とします。
VBAによる複数月の取得範囲が2014/12/1~2015/3/1ですと2015/1/1はA44に。1~3月ですとA7にきます。
2015/1/1がSheet7のA44でもA7でもSheet1のAA8には2015/1/1の天気を表示したいです。

こちらの説明不足がご迷惑を招いており、これ以上お手数をお掛けするのも忍びなくなっておりますので、希望することを関数で可能かどうかの可否だけの御回答だけでもご教授頂ければ幸いです。

今回教えて頂いた関数でも、Sheet7の範囲を変更すれば全て対応することができました。
わかりにくい状態をここまでご理解して頂き、本当にありがとうございます。

投稿日時 - 2015-03-14 18:51:50

お礼

ご丁寧に対応して頂きありがとうございます。

投稿日時 - 2015-03-14 18:15:59

ANo.9

>実データでは12月~3月、1月~3月など場合によって取得範囲がまちまちになる

 そうしますと、例えば12月~3月の場合では、Sheet7のA列に数値の1が入力されているセルが、12/1、1/1、2/1、3/1の4ヶ所あるという事になると思われます。
 すると、例えばAA7に2/1の日付化入力されている場合であっても、質問者様の

VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)

や私の回答No.8の

VLOOKUP(DAY($AA7),Sheet7!$A$6:$T$36,20,FALSE)

では、DAY(AA7)の部分が返す値が1となるため、Sheet7のA列において複数存在する1が入力されているセルの内、一番上に現れる12/1の天気が返されて、2/1の天気が表示されない事になります。
 この問題を解決するためには、複数月に亘るデータを取得した場合、どの様にデータが並んでいるのかを知る必要が御座いますので、その情報を質問者様から提供頂いていない現状では解決方法を提案する事は出来かねます。
 ですから、複数月に亘るデータを取得した場合、どの様にデータが並んでいるのかを御教え願います。
 特に、月が途中で変わっている所において、日付データがどの様に並んでいるのかを詳しく御教え願います。
 例えば12月~3月のデータを取得した場合において、Sheet7で
2月28日のデータがどの行に入力されているのかという事と、
3月1日のデータがどの行に入力されているのかという事や、
2月28日が入力されている行と3月1日が入力されている行の間に、2015年3月(セル内の値は2015/3/1)と入力されているセルが存在しているのかという事と、もしその様なセルが存在している場合、そのセルはどのセル番号のセルであるのかという事、
を御教え願います。

 後、私も気象庁のホームページを参照してみましたが、

A4:年月日
A5:(空欄)
A6:2015/1/1
A7:2015/1/2
A8:2015/1/3
A9:2015/1/4

という様な形で日付が並んでいるデータであれば見つける事が出来ましたが、質問者様が仰る

>取得データは
>A3に2015年1月(2015/1/1)括弧内は実際のセル内の値です。
>  A       T
>5:日  ・・・ 天気
>6:1      晴
>7:2      雨
>8:3      薄曇
>というような形になっています。

という様な、日付が1,2,3・・・という「1から始まる整数値」の形で並んでいるデータを見つける事が出来ませんでした。
 そこで再度確認したいのですが、回答No.7の所の補足欄において例示されているA6セルに入力されている実際のセル内の値は、本当に数値の1なのでしょうか? セルの書式の表示形式によって、2015/1/1が1と表示されているだけという事は無いのでしょうか?

 兎に角、情報を小出しにされる度に新たな条件が追加で出て来る様では、実際にはどの様な状況であるのかが見えて来ません。


>「Sheet7!$A$6:$T$36」の範囲の変更を手動で行えば

 範囲の変更に関しては、

Sheet7!$A$6:$T$36

の代わりに

Sheet7!$A:$T

とする方法もありますが、日付データの並び方とデータの形式によっては上手く行かない場合(例えばSheet7!A1:A5の範囲内に1と入力されているセルが存在する等の場合)も無きにしも非ずですので、その点からも実際の取得データがどうなっているのかを御教え願います。
 又、

Sheet7!$A:$T

とする以外にも、

Sheet7!$A$6:INDEX(Sheet7!$T:$T,MATCH(3E+307,Sheet7!$A:$A))

等の様に工夫次第でセル範囲の変更を自動で行う様にする術も無いとは言えません。
 只、

Sheet7!$A:$T

とした方が関数が簡単になりますから、もし

Sheet7!$A:$T

で済むのであればその方が好ましい訳です。


>「薄曇後一時晴」などになると「薄」になってしまいます。天気情報のパターンが複数有るため、全て把握して対応する必要がありそうです。

 全てと言っても「薄曇」、「快晴」、「大雨」、「大雪」、「みぞれ」、「あられ」、「霧雨」といった例外的な処理になるパターンだけ把握しておけば良く、「晴」、「雨」、「曇」といった通常の取り出し方になるパターンまで網羅したリストを考える必要はありませんし、「大雨」と「大雪」は「先頭の1文字が『大』になっている場合は2文字だけ取り出す」という具合に1つにまとめる事が出来るパターンもありますから、把握しておかねばならないパターンの数は少数で済むのではないかと思います。
 その少数のパターンのみを網羅したリストを、印刷されない範囲(例えば別シート上)に設けておき、そのリストに記載されているパターンに合致するものに関しては、そのリストの情報に基づいて取り出す文字数を調節する様な関数とすれば良いと思いますので、諦めるのは早計です。


 これら上記の問題を解決する方法も恐らくあると思われますが、何しろどの様な状況にあるのか不明なままで関数を提示しましても、後になってから状況が異なる事が判明して、提示した関数が無駄になる恐れが御座いますので、まずは

>気象庁から取得した天気情報

とはどの様なデータであるのかを確認する事を優先し、その確認が済むまでは関数を提示する事はなるべく差し控えたいと思います。

投稿日時 - 2015-03-08 04:27:05

補足

丁寧に対応して頂きありがとうございます。
こちらの説明不足と理解不足でご迷惑をおかけして申し分けありません。

当方の環境下(Win8.1 Excel2013)では外部データの取り込みが不可能な為、VBAで取得しています。

以下、使用しているVBAです。
Dim a As Long 'モジュール変数
Sub Main1()
Dim FirstDay As Variant
Dim EndDay As Variant
Dim mTitle As Variant
Dim n As Integer, i As Long, j As Long, h As Long
Dim yy As Long, mo As Long, da As Long
Dim mDate As Date
Dim ws As Worksheet
Dim wsCount As Integer
n = 3 '開始Sheet番号
a = 0 '初期化
'IEを開いて非表示
Set ws = Worksheets(n)
With ws
.UsedRange.Offset(1).ClearFormats '画面の初期化
FirstDay = .Range("C1").Value 'yy/mm/dd
EndDay = .Range("D1").Value 'yy/mm/dd
j = DateDiff("m", FirstDay, EndDay)
.Range("A3").Resize(1, 21).Value = Split(",,,,,,,,,,,,,,,,,雪,,天気概況,", ",")
.Range("A4").Resize(1, 21).Value = Split(",気圧,,降水量,,,気温(℃),,,湿度(%),,,最大風速,,最大瞬間風速,,日照時間,降雪,最深積雪,昼,夜,", ",")
.Range("A5").Resize(1, 21).Value = Split("日,現地(平均),海面(平均),合計,1時間,10分間,平均,最高,最低,平均,最小,平均風速,風速,風向,風速,風向,,合計,値,(06:00-18:00),(18:00-翌日06:00)", ",")
If j <= 0 Then Exit Sub
For i = 0 To j
yy = Year(FirstDay)
mo = Month(FirstDay)
da = Day(FirstDay)

mDate = DateSerial(yy, mo + i, da)
yy = Year(mDate)
mo = Month(mDate)
da = Day(mDate)
.Cells(3 + a, 1).Value = yy & "年" & mo & "月"
Dim x As Long '列の管理
Dim y As Long '行の管理

Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
Application.ScreenUpdating = False '画面更新禁止
'指定URLへ移動する
objIE.Navigate " http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=74&block_no=47893&year=" & yy & "&month=" & mo & "&day=" & da & "&view="
'Debug.Print "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=74&block_no=47893&year=" & yy & "&month=" & mo & "&day=" & da & "&view="
'表示完了を待つ .readyState と .Busy を見る
While objIE.readyState <> 4 Or objIE.Busy = True 'IEがBusyの間 待つ
DoEvents
Wend
DoEvents
'表示待ちここまで
'Tableタグを抜き出す
Dim objT As Object 'テーブルオブジェクトの格納用
Set objT = objIE.document.All("tablefix1") '.all("id名前")でテーブルタグを抜く
If objT Is Nothing Then '↑上で見つかったか?
MsgBox "err 表が見つかりません、 IDを確認してください。"
End 'エラーなので抜ける。 '**変更
End If
For y = 0 To objT.Rows.Length - 1 '行のループ
For x = 0 To objT.Rows(y).Cells.Length - 1 '列数分ループ
h = a + y + 2
If h >= a + 6 Then
ws.Cells(h + 1, x + 1) = objT.Rows(y).Cells(x).innertext
'↑y+1 1行目から書き出す、11行目にするには y+1+10に変更する
End If
Next
Next
a = a + y + 3 '連続
'objIE.ExecWB 17, 0 'OLECMDID_SELECTALL = 17 全てを選択
'objIE.ExecWB 12, 0 'OLECMDID_COPY = 12 コピー
'Range("A1").Select
'ActiveSheet.PasteSpecial Format:="HTML" 'HTML形式で貼り付ける
objIE.Quit '.QuitでIEを閉じる
'使用したオブジェクト変数を空に。
Set objT = Nothing
Set objIE = Nothing '一旦オブジェクトを開放しないといけない模様
Application.ScreenUpdating = True '画面更新
Next i
End With

End Sub
こちらのデータを使っている為、風速や降水量などで日時と同じ数字が出てきます。

不要なデータは全て消消してAが日にち、Bが気温、Cが天気にすれば簡単なのでしょうか?。
(同じデータがある等の場合うまくいかないかもという意見を頂き、実際要らないデータを削除すればいいのではないかと気がつきました)

投稿日時 - 2015-03-10 20:26:45

お礼

お世話をおかけした申し分けありません。

投稿日時 - 2015-03-10 20:27:15

ANo.8

 回答No.4,6,7です。

>取得データは
>A3に2015年1月(2015/1/1)括弧内は実際のセル内の値です。
>  A       T
>5:日  ・・・ 天気
>6:1      晴
>7:2      雨
>8:3      薄曇
>というような形になっています。

という事は、取得データは必ず1ヶ月分のみで、A3セル只1ケ所にのみ年と月が入力されているという事であり、A3以外のセルに別の年と月が入力されている様な事は無いと考えておけば宜しいのでしょうか?
 それでしたら、「『AA7に入力されている日の天気』を表示させるセル」に入力する関数を次の様なものにすると良いと思います。

=IF(ISERROR(1/DAY($AA7)),"",IF(OR(Sheet7!$A$3<>TEXT($AA7,"yyyy/m")+0,ISERROR(1/(VLOOKUP(DAY($AA7),Sheet7!$A$6:$T$36,20,FALSE)<>""))),"",LEFT(VLOOKUP(DAY($AA7),Sheet7!$A$6:$T$36,20,FALSE),IF(LEN(VLOOKUP(DAY($AA7),Sheet7!$A$6:$T$36,20,FALSE))>2,1,2))))

投稿日時 - 2015-03-06 04:52:50

補足

実データでは12月~3月、1月~3月など場合によって取得範囲がまちまちになるため、「Sheet7!$A$6:$T$36」の範囲の変更を手動で行えばと思っていた為、1月分のみのデータを出させて頂きました。

実データに当てはめさせて頂きましたが、「薄曇後一時晴」などになると「薄」になってしまいます。天気情報のパターンが複数有るため、全て把握して対応する必要がありそうです。
この度はお知恵をお貸し頂きありがとうございました。

投稿日時 - 2015-03-07 23:22:38

お礼

御回答ありがとうございます。
つたない補足ばかりで申し訳ありません。

投稿日時 - 2015-03-07 23:25:57

ANo.7

 申し訳御座いません。回答No.6を投稿した際に、どうやら寝ぼけていたらしく、VLOOKUP関数で検索する検索値として指定しているセルが、AC7になってしまっておりましたが、これはAA7の間違いです。


>「>=3」は事前に「count」をつけており、文字数を数えて3文字以上の場合にはIFという考えを持っていました。

 いえ、 質問者様の関数では

COUNT(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)>=3)

となっておりますから、それでは、

COUNT(「VLOOKUP関数の計算結果」>=3)

という形になっていますので、
「『VLOOKUP関数の結果が3以上である』のかという判定結果が、数値データであるのか」という事を判定する(という訳の解らない)式になっているだけで、
「COUNT関数の結果が3以上」かどうかを判定する式にはなっておりません。
 それに、そもそもCOUNT関数は「関数内で指定しているセル範囲、或いは配列データの中に、数値データが入力されているものが幾つあるのかをカウントする」関数なのですから、COUNT関数では文字数をカウントする事は出来ません。
 文字数を数える関数はCOUNT関数などではなく、LEN関数です。

 因みに、私の回答No.6の関数では、その中の

IF(LEN(VLOOKUP(DAY(AC7),Sheet7!$A$6:$T$36,20))>2,1,2)

の所でLEN関数を使って「『天気の情報』が何文字あるのか」という文字数を調べ、それをIF関数と組み合わせる事で、「天気の情報を表している文字列データ」の"先頭から何文字を取り出すのか"を調節しています。
 「文字列の途中から指定した文字数だけ取り出す」場合にはMID関数が使われますが、御質問の件の場合には、必ず「文字列の1文字目から指定した文字数だけ取り出す」事になるのですから、LEFT関数を使用した方が簡単です。

 それと、AA7セルに入力されている日付と同じ日付が、もしもSheet7!A6:T36の範囲内に存在していなかった場合、

VLOOKUP(DAY(AA7),Sheet7!$A$6:$T$36,20)

はその日付よりも古い日付の中で最も新しい日付の天気データ、即ち別の日のデータが表示される事になってしまいますが、それでも宜しいのでしょうか?
 もし、それでは困るという場合には、次の様な関数にされた方が宜しいかと思います。

=IF(ISERROR(1/(VLOOKUP(DAY(AA7),Sheet7!$A$6:$T$36,20,FALSE)<>"")),"",LEFT(VLOOKUP(DAY(AA7),Sheet7!$A$6:$T$36,20,FALSE),IF(LEN(VLOOKUP(DAY(AA7),Sheet7!$A$6:$T$36,20,FALSE))>2,1,2)))


 後、少々気になっている事があります。

VLOOKUP(DAY(AA7),Sheet7!$A$6:$T$36,20)

としたのでは、AA7に入力されている日付が、例えば1月2日であろうと、6月2日であろうと、12月2日であろうと、

DAY(AA7)

が返す値は全て同じ「2」という数値になりますので、VLOOKUP関数の結果は、Sheet7!A6:A36の範囲内において、「数値の2を超える数値が最初に現れる行の1つ上の行」におけるT行の値が返されまてしまいます。
 つまり、「気象庁から取得した天気情報」の中の日付欄がもしも
1,2,3,・・・,30,31,1,2,3,・・・,27,28,・・・
のように、日のデータのみで月のデータを含んでおらず、尚且つ、複数の月にまたがったデータであった場合、AA列に入力されている日付が2日の日(例え1月2日であろうと、6月2日であろうと、12月2日であろうと)となっている全ての行において、「気象庁から取得した天気情報」の中で一番最初に書かれている月の2日の日の天気が表示されてしまう事になります。
 また逆に、「気象庁から取得した天気情報」の中の日付欄がもしも2015/1/1のような「年や月を含んだデータ」であった場合、Excelでは数値の「2」は日付の「1900年1月2日」の事を表すシリアル値データと等しい値となりますので、「気象庁から取得した天気情報」の中に1900年のデータが含まれていない場合には、エラーとなってしまいます。
 VLOOKUP関数の検索値としてDAY(AA7)を使うとこの様な問題が発生する恐れがあるのですが、それでもかまわないのでしょうか?
 もし、それが問題となる場合には、「気象庁から取得した天気情報」の中で、日付けの年や月がどの様な形で明記されているのかを御教え願います。(年と月と日がそれぞれ別のセルに入力されている場合には、年がどのセル、月がどのセル、日がどのセルに入力されているのか、といった具合)

投稿日時 - 2015-03-05 05:44:22

補足

関数の認識不足、申し分けありません。
取得データは
A3に2015年1月(2015/1/1)括弧内は実際のセル内の値です。
  A       T
5:日  ・・・ 天気
6:1      晴
7:2      雨
8:3      薄曇
というような形になっています。

投稿日時 - 2015-03-05 23:25:14

お礼

ご丁寧な回答ありがとうございます。

投稿日時 - 2015-03-05 22:40:24

ANo.6

 尚、もしも

VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)>=3

とされておられるのは単なる質問者様の間違いで、
「快晴」、「晴後曇」、「大雨」等々の天気の情報が入力されているセルが、Sheet7!T6:T36の範囲に存在しているものと仮定した場合には、次の様な関数にされると良いと思います。

=IF(ISERROR(1/(VLOOKUP(DAY(AC7),Sheet7!$A$6:$T$36,20)<>"")),"",LEFT(VLOOKUP(DAY(AC7),Sheet7!$A$6:$T$36,20),IF(LEN(VLOOKUP(DAY(AC7),Sheet7!$A$6:$T$36,20))>2,1,2)))

投稿日時 - 2015-03-03 14:04:49

補足

「AA7セルには日付が入力されていて、その日付と同じ日付の日の天気のデータを表示させたいという事」
「Sheet7!T6:T36の範囲に存在しているもの」
という仮定通りです。

わかりにくい説明で申し訳ありませんでした。

「>=3」は事前に「count」をつけており、文字数を数えて3文字以上の場合にはIFという考えを持っていました。

投稿日時 - 2015-03-04 23:39:23

お礼

御回答ありがとうございます。

投稿日時 - 2015-03-04 23:33:18

ANo.5

文字数が2文字の時だけ2文字取得、その他は2文字取得で良いのでは
文字列はLenで取得できます。
=IF(LEN(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20))=2,MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,2),MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,1))

投稿日時 - 2015-03-03 13:48:11

お礼

回答ありがとうございます。
やりたいことが出来ました。

投稿日時 - 2015-03-04 23:19:25

ANo.4

 御質問文の情報だけでは情報が不足しているため状況が解らず、回答する事が困難ですので、追加情報を御教え願います。


 まず、「快晴」、「晴後曇」、「大雨」等々の天気の情報が入力されているセルは、何という名前のシートの何列の、何行目から何行目にかけてのセルなのでしょうか?
 それが書かれていないのでは回答のしようがありません。
 質問者様が考えた関数の中に

 VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)>=3

という部分があるという事は、AA7セルには日付が入力されていて、その日付と同じ日付の日の天気のデータを表示させたいという事なのでしょう。
 但し、

>2文字以上の天気の場合

という御質問内容で、尚且つ、上記の部分の末尾に「>=3」が付いているという事は、Sheet7のT列に入力されているデータは数値データであり、おそらくSheet7のT列は「どこか別の所にある天気データのセルに入力されている文字数」を表示している作業列ではないかと思われ、天気の情報ではないのではないかと推測できます。
 それにもかかわらず、MID関数の中で、

MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,1)

という具合に、数値データである筈の

VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)

の中から、1文字だけ取り出しているのは何故なのでしょうか?

 兎に角、上手く行かなかった関数を提示して頂いた処で役には立ちません。
 肝心の、どこに天気の情報が入力されているのかという事を御教え願います。

投稿日時 - 2015-03-03 13:46:01

お礼

御回答ありがとうございます。
色々と説明不足で申し訳ありません。
sheet7のT行に取得したい天気データがあります。
AA7の日時の天気を取得したく、このような形にしました。

投稿日時 - 2015-03-04 23:31:10

ANo.3

IF文の条件の数式がおかしい気がする。

=VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20)
で天気の内容表示でいいんですよね。

方法1
別のシートに、天気の内容にの表示記号の対応表を作成しておいて
晴 → 晴
晴後曇 → 晴
快晴 → 快晴
雨 → 雨
大雨 → 大雨
等として
=IFERROR(VLOOKUP(IFEROOR(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),"-"),Sheet8$A$1:$B$100,2),"")

方法2
2文字になるのは、快晴、大雨、大雪など一文字目に快、大等特定の文字の場合だろうから

=IFERROR(MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,IF(ISNUMBER(FIND(LEFT(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1),"快大")),2,1)),"")

※IFERROR関数は下記URLを参照
http://www.becoolusers.com/excel/iferror-vlookup.html

投稿日時 - 2015-03-03 13:35:42

お礼

御回答ありがとうございます。
「薄曇」というようなやっかいなものも出てきましたが、方法2へ「薄」を追加させて頂くとすんなり繁栄できました。
説明不足で申し分けありませんでした。

投稿日時 - 2015-03-04 23:44:25

ANo.2

=IF(LEN(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20))>=3,MID(VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20),1,1),VLOOKUP(DAY(AA7),Sheet7!$A$6:$U$36,20))

投稿日時 - 2015-03-03 13:19:51

お礼

御回答ありがとうございます。
やりたいことが無事出来ました。

投稿日時 - 2015-03-04 23:16:18

ANo.1

晴、雨、曇、雪 などの天気を示す文字が一番最初に出てくる場所を探してそこまでの文字列を表示すれば良いのでは?
こんな感じです。
=LEFT(A1,MIN(FIND("晴",A1&"晴"),FIND("雨",A1&"雨"),FIND("曇",A1&"曇"),FIND("雪",A1&"雪")))

A1&"晴"の様に検索対象の文字を最後に付けて検索しているのは、Find関数でエラーが返ってくるのを防止の為です。

投稿日時 - 2015-03-03 13:10:53

お礼

御回答ありがとうございます。
Excelのバージョンの記載が抜かるという初歩的ミスをしましたが、2013でも関数のFINDは使えるのですね。
勉強になりました。
参考にさせて頂きます。

投稿日時 - 2015-03-04 23:07:25

あなたにオススメの質問