左の表を入力したら右の表を自動で生成出来るようにしたいです。
・右の表の見出しは手動入力でも問題無し
・各当番は最高3人までで0人ということはありません
・こんご新たな当番が増える可能性有り
・出来れば作業用の表を作ったりせずシンプルに済ませたい
よろしくおねがいします。
とりあえず、VBA での実装で例です。
左のデータがあるシートのシートタブを右クリックし、「コードの表示」で下記コードを貼り付け、
実行してみてください。
Sub makeTable() Dim dstWS As Worksheet Set dstWS = Worksheets.Add(After:=Worksheets(Worksheets.Count)) Dim wd As Long Dim lastLine As Long Dim i As Long '--- とりあえず、曜日数だけ処理 For wd = 1 To 7 If Cells(2, wd + 1) = "" Then Exit For dstWS.Cells(3 * wd - 1, 1).Value = wd '--- 各曜日の最終行まで処理 lastLine = Cells(65535, wd).End(xlUp).Row For i = 3 To lastLine If Cells(i, wd + 1).Value <> "" Then addList dstWS, wd, Cells(i, wd + 1).Value, Cells(i, "A").Value End If Next Next '--- データ範囲に罫線を記入 Dim lastRow As Long lastRow = dstWS.Range("IV1").End(xlToLeft).Column For i = wd - 1 To 1 Step -1 With dstWS.Cells(3 * i - 1, 1) .Value = i .Resize(1, lastRow).Borders(xlEdgeTop).LineStyle = xlContinuous .Resize(1, lastRow).Borders(xlEdgeTop).Weight = xlMedium End With Next End Sub Sub addList(dstWS As Worksheet, wd As Long, title As String, member As String) Dim tt As Long tt = 2 '--- データ列を検索 Do While dstWS.Cells(1, tt) <> title tt = tt + 1 If dstWS.Cells(1, tt) = "" Then dstWS.Cells(1, tt) = title Exit Do End If Loop '--- データ行を検索 For dn = 3 * wd - 1 To 3 * wd + 1 If dstWS.Cells(dn, tt) = "" Then dstWS.Cells(dn, tt) = member Exit Sub End If Next '--- 4人目はエラー MsgBox title & "の" & wd & "はすでに3人います。" & vbNewLine & member & "は登録されません。" End Sub
http://www2s.biglobe.ne.jp/~iryo/kabu/tool/vba/kabuvba/kabuvba1....
まじめにVBAスクリプトを書かないと行けないような気がします。
この程度だとソフトメーカーに頼むのは手間がかかる(たぶん請けてくれない)ので,SOHOかIT系の学生さんに発注してみてはいかがでしょう?
とりあえず、VBA での実装で例です。
左のデータがあるシートのシートタブを右クリックし、「コードの表示」で下記コードを貼り付け、
実行してみてください。
Sub makeTable() Dim dstWS As Worksheet Set dstWS = Worksheets.Add(After:=Worksheets(Worksheets.Count)) Dim wd As Long Dim lastLine As Long Dim i As Long '--- とりあえず、曜日数だけ処理 For wd = 1 To 7 If Cells(2, wd + 1) = "" Then Exit For dstWS.Cells(3 * wd - 1, 1).Value = wd '--- 各曜日の最終行まで処理 lastLine = Cells(65535, wd).End(xlUp).Row For i = 3 To lastLine If Cells(i, wd + 1).Value <> "" Then addList dstWS, wd, Cells(i, wd + 1).Value, Cells(i, "A").Value End If Next Next '--- データ範囲に罫線を記入 Dim lastRow As Long lastRow = dstWS.Range("IV1").End(xlToLeft).Column For i = wd - 1 To 1 Step -1 With dstWS.Cells(3 * i - 1, 1) .Value = i .Resize(1, lastRow).Borders(xlEdgeTop).LineStyle = xlContinuous .Resize(1, lastRow).Borders(xlEdgeTop).Weight = xlMedium End With Next End Sub Sub addList(dstWS As Worksheet, wd As Long, title As String, member As String) Dim tt As Long tt = 2 '--- データ列を検索 Do While dstWS.Cells(1, tt) <> title tt = tt + 1 If dstWS.Cells(1, tt) = "" Then dstWS.Cells(1, tt) = title Exit Do End If Loop '--- データ行を検索 For dn = 3 * wd - 1 To 3 * wd + 1 If dstWS.Cells(dn, tt) = "" Then dstWS.Cells(dn, tt) = member Exit Sub End If Next '--- 4人目はエラー MsgBox title & "の" & wd & "はすでに3人います。" & vbNewLine & member & "は登録されません。" End Sub
http://www2s.biglobe.ne.jp/~iryo/kabu/tool/vba/kabuvba/kabuvba1....
式で実現しようとしましたが,3人目で断念。
一人目のMATCHの結果分だけ、OFFSET関数で二人目のマッチの検索範囲をずらしてやれば、
一人目を除外することができるので,やってみましたが,3人目のネストが深すぎて断念。
多分もっと簡単にできますよね。
下の例では$B$2は"早番"などが入ります。
NameListは名前定義されたAさんBさんなどのリストです。
List1は月曜日の早番、遅番などが定義された範囲です。
一人目
=INDEX(NameList,MATCH($B$2,List1,0),1)
二人目
=INDEX(OFFSET(NameList,MATCH($B$2,List1,0),0),MATCH($B$2,OFFSET(List1,MATCH($B$2,List1,0),0),0),0)
三人目
断念!!!
コメント(0件)