1205765249 Excelの質問です。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/03/22 10:41:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント35pt

とりあえず、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....

その他の回答2件)

id:iu43lkjds32 No.1

回答回数18ベストアンサー獲得回数0

ポイント10pt

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

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

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

id:Mook No.2

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント35pt

とりあえず、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....

id:nave2000 No.3

回答回数26ベストアンサー獲得回数0

ポイント35pt

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

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • VBAのお勉強 表の書き出し simple blog いろいろ勉強中 2008-03-19 10:22:57
    http://q.hatena.ne.jp/1205765249 質問者さんのシート、これはシフト管理をするものなのかな? 左側のシートは、 「ある日のある人がどの当番に入っているか」 がわかる表で、これを、 「ある...
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません