- 締切済み
左右に並んだ表のチェックをする方法をしりたいのですが
今、同じシート上に下記のような表を自分でチェックして手作業でセルに色をつけています。自動で色がつくようにしたいのですが、誰か教えて下さい。 A B C D E…Q R T U V W…AY 5 日 曜日 A氏 B氏 C氏… 日 曜日 X店 Y店 Z店… 6 1 月 X店 Y店 1 月 A氏 B氏 7 2 火 Y店 Z店 2 火 A氏 C氏 8 3 水 Z店 休 3 水 B氏 始めは右表に人を入れる必要があるセルに薄い黄色をつけ、左表に入店する店舗を入れます。その時、右表にも入店する人を入力するのですが、その時入力が合っていれば(C6とH6のセルが薄い水色になるように)色がつくようにしたいのです。あとは出来るなら違う場合赤く色が付くと、とても良いのですが、そんな方法があれば教えて下さい。 "休"と空欄のセルには色が付かないようにも出来るのでしょうか? 内容が分かりにくかったらすみません。宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
すいません。 A No.3のものです。 追記です。 -------------------------------- 前提 シート「Input」セルA1から、下記のデータを入れます。 date shop name 2007/01/01 09:00 X店 A氏 2007/01/02 09:00 Y店 A氏 2007/01/01 09:00 Y店 B氏 2007/01/03 09:00 Z店 B氏 2007/01/02 09:00 Z店 C氏 2007/01/03 09:00 休 C氏 セル A1には、"date" セル B1には、"shop" セル C1には、"name" セル A2には、2007/01/01 09:00 と入れます。 くれぐれも、注意していただきたいのは、 セルA2への入力は、2007/01/01スペース09:00であることです。 書式設定、ユーザー定義にて、 mm/dd (aaa) hh:mm と入れてください。 この書式設定で、 date shop name 01/01 (月) 09:00 X店 A氏 01/02 (火) 09:00 Y店 A氏 01/01 (月) 09:00 Y店 B氏 01/03 (水) 09:00 Z店 B氏 01/02 (火) 09:00 Z店 C氏 01/03 (水) 09:00 休 C氏 このように見えます。 VBAは、あくまでも、dateの書式を前提に作られていますので、 きちんと、「2007/01/01スペース09:00」と入れてないと、うごきません。
原理的に、2つの表は、同じものだと思います。そこで、両者に共通のレベルで割り当て表(データベースのフォーマット)を 作成することを提案します。例えば、下記のようなものです。 date shop name 01/01 (月) 09:00 X店 A氏 01/02 (火) 09:00 Y店 A氏 01/01 (月) 09:00 Y店 B氏 01/03 (水) 09:00 Z店 B氏 01/02 (火) 09:00 Z店 C氏 01/03 (水) 09:00 休 C氏 3つの列を使います。 dateは、実入力は、2007/01/01 9:00 です。 書式を使って、曜日を表示しています。 お店と、人の配置は、この表で、やります。 次に示します、VBAで「お店ベースの表」と、「人ベースの表」を作成します。 「お店ベースの表」、「人ベースの表」は、単なる結果の表現の違いです。 ---------------------------------------------- 前提: データベースフォーマットの入力をするシートのシート名は「Input」 「Table」と言う名称のシートが存在すること ---------------------------------------------- Sub CreatingTables() Dim myDate(50) As Date Dim myShop(50) As String Dim myName(50) As String Dim myArray As Variant With Worksheets("Input") E_rowpos = .Cells(1, 1).End(xlDown).Row E_colpos = .Cells(1, 1).End(xlToRight).Column hani = .Range(.Cells(1, 1), .Cells(E_rowpos, E_colpos)).Address myArray = .Range(hani).Value r = UBound(myArray, 1) '対象エリヤの行の数 c = UBound(myArray, 2) '対象エリヤの列の数 ' -------------------------- Date調査---------------------------------------- .Range(hani).Sort _ Key1:=.Columns("A"), Order1:=xlAscending, Header:=xlYes rowpos = 2 myCount = 0 myDate(0) = .Cells(2, 1).Value Do While .Cells(rowpos, 1).Value <> "" If .Cells(rowpos, 1).Value <> myDate(myCount) Then myCount = myCount + 1 myDate(myCount) = .Cells(rowpos, 1).Value End If rowpos = rowpos + 1 Loop myDateCount = myCount ' -------------------------- Shop調査---------------------------------------- .Range(hani).Sort _ Key1:=.Columns("B"), Order1:=xlAscending, Header:=xlYes rowpos = 2 myCount = 0 myShop(0) = .Cells(2, 2).Value Do While .Cells(rowpos, 1).Value <> "" If .Cells(rowpos, 2).Value <> myShop(myCount) Then myCount = myCount + 1 myShop(myCount) = .Cells(rowpos, 2).Value End If rowpos = rowpos + 1 Loop myShopCount = myCount ' -------------------------- Name調査---------------------------------------- .Range(hani).Sort _ Key1:=.Columns("C"), Order1:=xlAscending, Header:=xlYes rowpos = 2 myCount = 0 myName(0) = .Cells(2, 3).Value Do While .Cells(rowpos, 1).Value <> "" If .Cells(rowpos, 3).Value <> myName(myCount) Then myCount = myCount + 1 myName(myCount) = .Cells(rowpos, 3).Value End If rowpos = rowpos + 1 Loop myNameCount = myCount End With '--------------Nameの表の作成------------------------------------------------ With Worksheets("Table") .Cells.Clear For i = 2 To myDateCount + 2 .Cells(i, 1).Value = myDate(i - 2) .Cells(i, 1).NumberFormat = "mm/dd (aaa) hh:mm" Next For j = 2 To myNameCount + 2 .Cells(1, j).Value = myName(j - 2) Next For j = 2 To r tempDate = myArray(j, 1) tempShop = myArray(j, 2) tempName = myArray(j, 3) For xi = 0 To myDateCount If tempDate = myDate(xi) Then myPositionY = xi + 2: Exit For Next For xi = 0 To myNameCount If tempName = myName(xi) Then myPositionX = xi + 2: Exit For Next .Cells(myPositionY, myPositionX).Value = tempShop Next End With '--------------shopの表の作成------------------------------------------------ With Worksheets("Table") For i = 2 To myDateCount + 2 .Cells(i, 1).Offset(myDateCount + 2 + 2, 0).Value = myDate(i - 2) .Cells(i, 1).Offset(myDateCount + 2 + 2, 0).NumberFormat = "mm/dd (aaa) hh:mm" Next For j = 2 To myShopCount + 2 .Cells(1, j).Offset(myDateCount + 2 + 2, 0).Value = myShop(j - 2) Next For j = 2 To r tempDate = myArray(j, 1) tempShop = myArray(j, 2) tempName = myArray(j, 3) For xi = 0 To myDateCount If tempDate = myDate(xi) Then myPositionY = xi + 2: Exit For Next For xi = 0 To myShopCount If tempShop = myShop(xi) Then myPositionX = xi + 2: Exit For Next .Cells(myPositionY, myPositionX).Offset(myDateCount + 2 + 2, 0).Value = tempName Next End With End Sub
- gucchi-you
- ベストアンサー率51% (54/105)
chie65536さんのおっしゃる通りです。 U6のセルに、 =IF(ISERROR(INDEX($C$5:$Q$5,MATCH(U$5,$C6:$Q6,0)))=FALSE,INDEX($C$5:$Q$5,MATCH(U$5,$C6:$Q6,0)),"") と入れて、残りの右と下の範囲にコピーしてあげればご希望のものができるかと思います。試してみて下さい。
- chie65536
- ベストアンサー率41% (2512/6032)
「左の表に店名を入れたら、右の表が自動で埋まって行く」と言う作りにした方が早いんじゃない? 右と左の両方を手入力するから、左右で合ってるかチェックが必要になっちゃう訳で。片方に入れて両方埋まるならチェック不要になっちゃう。 片方を入れればもう片方が勝手に埋まる、片方に入れようとした時にもう片方が既に埋まっていれば入れられない、と言う仕掛けを作れば済むと思いますよ。
補足
いい感じなのですが、右の表に1度ここに人を入れたいというデータ、例えば"9-19時"のような感じで使いたいので、これをVBEに入れることって出来ますか? 左の表に入れると右が埋まっていくのはとても良いです。