人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelの質問です。
左の表を入力したら右の表を自動で生成出来るようにしたいです。
・右の表の見出しは手動入力でも問題無し
・各当番は最高3人までで0人ということはありません
・こんご新たな当番が増える可能性有り
・出来れば作業用の表を作ったりせずシンプルに済ませたい
よろしくおねがいします。

1205765249
●拡大する

●質問者: psycho24
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:Excel シンプル 入力 自動 見出し
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● iu43lkjds32
●10ポイント

まじめにVBAスクリプトを書かないと行けないような気がします。

この程度だとソフトメーカーに頼むのは手間がかかる(たぶん請けてくれない)ので,SOHOかIT系の学生さんに発注してみてはいかがでしょう?

http://www.sohovillage.com/classads/helpwanted


2 ● Mook
●35ポイント ベストアンサー

とりあえず、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 ● nave2000
●35ポイント

式で実現しようとしましたが,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)

三人目

断念!!!


http://pc.nikkeibp.co.jp/pc21/special/hr/index.shtml

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ