- ベストアンサー
エクセル2003又は2007 IF文
- エクセル2003又は2007のIF文を使用して、老人ホームのショートステイ(宿泊施設)で利用者さんの予約表を作成する方法についてわからない部分があります。
- 特に、「予約太郎」さんの予約に関して、8月1日から9日まではハイフンや大なり小なりの記号を入れたいと考えていますが、残りの入所退所日にも日付どおりに記号を入れたいです。
- 現在使用している命令文ではC46セルの値(入所日)のみを利用していますが、E46とG46(入所日)も考慮した命令文を作成することは可能でしょうか? また退所日も同様にD46、F46、H46の値を一つの命令文に組み込む方法があるか知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数は苦手なのですが、書いてみました。 単純なつくりなので分かりやすいかと思います。 カレンダー(シート1)の日付は、no1さんのものを使わせていただきました。(便利です) =IF(ISERROR(MATCH(C$4,Sheet2!46:46,0)),IF(OR(B5="<-",B5="-"),"-",""),IF(MOD(MATCH(C$4,Sheet2!46:46,0),2)=1,"<-","->"))
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 何とか関数で!と思って頑張ってみましたが かなり厄介になるようですので、無理やりVBAでやってみました。 ↓の画像のようにSheet2にデータを入力すると、Sheet1に表示されるようにしています。 画面左下のSheet2のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてSheet2に日付データを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Columns("C:H")) Is Nothing Or Selection.Count <> 1 Then Exit Sub Dim i As Long, j As Long, k As Long, L As Long, ws As Worksheet Set ws = Worksheets("Sheet1") '←「Sheet1」は実際のSheet名に! k = Target.Row i = WorksheetFunction.Match(Cells(k, 2), ws.Columns(1), False) ws.Rows(i).ClearContents ws.Cells(i, 1) = Cells(k, 2) For j = 3 To 33 For L = 3 To 7 Step 2 If ws.Cells(4, j) = Cells(k, L) Then With ws.Cells(i, j) .Value = "(-" .HorizontalAlignment = xlCenter End With End If Next L For L = 4 To 8 Step 2 If ws.Cells(4, j) = Cells(k, L) Then If ws.Cells(i, j) = "" Then With ws.Cells(i, j) .Value = "-)" .HorizontalAlignment = xlCenter End With Else ws.Cells(i, j) = "(-)" End If End If Next L Next j For j = 3 To 33 For L = 3 To 7 Step 2 If Cells(k, L + 1) <> "" Then If ws.Cells(4, j) > Cells(k, L) And ws.Cells(4, j) < Cells(k, L + 1) Then With ws.Cells(i, j) .Value = "-" .HorizontalAlignment = xlCenter End With End If End If Next L Next j End Sub 'この行まで 尚、Sheet1の黄色い部分(日付セル)はシリアル値にするため、 No.1のKURUMITOさんが回答されていらっしゃる通りの数式を入れておきます。 ※ 関数でないので、Sheet2のデータを削除してもSheet1には反映されません。 月替わりの場合等はデータを削除しなくてはならないと思いますので、 Sheet1のデータも一緒に削除しておきます。 (日付部分の数式はそのまま残す) ※ Sheet1に数式を入れている場合は数式ぞのものが消えて生データになってしまいますので 別Sheetで試してみてください。 関数で簡単にできる方法があればごめんなさいね。m(_ _)m
お礼
こんばんは! お返事遅くなり申し訳ありませんでした、関数だけではやはり難しいものなのですね・・・、動作確認もしてみて、使っていけそうなので凄く嬉しいです。 求めていたものでしたので、明日会社に持っていって早速試してみます、本当にありがとうございます!
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1の表で日付の1日から31日までの表示についてはC4セルに次の式を入力し、右横方向のAG4セルまでドラッグコピーします。 =IF(MONTH(DATE($B1,$B2,COLUMN(A1)))=$B2,DATE($B1,$B2,COLUMN(A1)),"") 月末での日付が表示されます。 1日のように表示を変える場合にはC4セルからAG4セルまでを範囲として選択したのちに右クリックし、「セルの書式設定」から「表示形式」で「ユーザー定義」にし、d日 と入力してOKします。 その後にC5セルには次の式を入力しAG5セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(OR($B5="",C$4=""),"",IF(OR(COUNTIF(INDEX(Sheet2!$B:$J,MATCH($B5,Sheet2!$B:$B,0),2):INDEX(Sheet2!$B:$J,MATCH($B5,Sheet2!$B:$B,0),9),C$4)>0,MOD(MATCH(C$4,INDEX(Sheet2!$B:$J,MATCH($B5,Sheet2!$B:$B,0),2):INDEX(Sheet2!$B:$J,MATCH($B5,Sheet2!$B:$B,0),0)),2)=0),"-",""))
お礼
ありがとうございます、早速試してみたのですが私のやり方が悪いのか…上手くいかずでした…。 シート1のB5セルには何か入力するようになってるみたいでしたが、あそこには何を入れたらよろしいでしょうか、申し訳ございません、私が不出来なばかりに。
お礼
苦手な関数ですのに考えていただきありがとうございます!! 他の皆様のもとてもよかったのですが、一番望んでいるものと近いものでした。 上司にVBAの話をしてみたところ、関数で使いたいといわれたのも多きく、先の回答者様方のも全て職場で使わせていただいております。 皆様をベストアンサーに選びたかったのですが、できずでした。 ですが、お三方様の協力がなければこれはできませんでした、本当にありがとうございました!