[[20151129031850]] 『飛び飛びセルのシート間への転記について』(ぽぽろん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『飛び飛びセルのシート間への転記について』(ぽぽろん)

お世話になっております。

下記コードは、転記元のシートを開いた状態でマクロ実行し転記先(公休マスタシート)へデータを転記します。

(具体的には)

転記元シートの9行目(D9:BL9)の範囲にある日付データを
転記先シートのD列の最終行へ転記

Sub 日付データ検索転記()

    Dim i As Range    '転記元の検索値
    Dim n As Integer    '転記先の最終行
    Dim sh As Worksheet    '転記先のシート(公休マスタ)

    Set sh = Worksheets("公休マスタ")
    n = sh.Cells(Rows.Count, "D").End(xlUp).Row + 1    '指定列の最終行+1

    For Each i In Range("D9:BL9")    '範囲内の値で
        If IsDate(i.Value) Then    '日付データと一致した場合
            sh.Range("D" & n).Value = i.Value    '指定列にデータを転記
            n = n + 1    '追記
        End If
    Next
    sh.Range("D" & n - 1).Interior.ColorIndex = 6    '最終行に着色

    '転記後、最終行の左セルにB2の日付を転記
    sh.Range("D" & n - 1).Offset(rowOffset:=0, columnOffset:=-1).Value = sh.Range("B2").Value

End Sub

(質問は)

転記元シートのデータ入力範囲をD9:BL55から2行毎に日付の値取得し

※処理単位: D9:BL9 D11:BL11 D13:BL13 ・・・・D53:BL53 D55:BL55

転記先シートのデータ転記範囲をD列:AF列の2列毎の最終行へ日付の値を転記

※処理単位:D F H・・・・・・・AR AT AV AX

すみませんが、アドバイスの程よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 D列からBL列までの61セルのデータを 

 ・D列:AF列の2列毎の・・・・ よくわかりません。具体的には、E9のデータは、転記先のどの列? F9のデータは転記先のどの列? BL9のデータは転記先のどの列?

 ・処理単位:D F H・・・・・・・AR AT AV AX   これもよくわかりません。 D列:AF列 ではないのですか?

(β) 2015/11/29(日) 07:33


 もしかして・・・・

 >>D9:BL55から2行毎
 >>D列:AF列の2列毎

 この、行という表現と列という表現、さかさまとか?

 それと、

 >>転記先シートのデータ転記範囲をD列:AF列の2列毎の最終行へ日付の値を転記 

 通常、転記先シートの最終行というと、そのシート全体の最終行をイメージします。
 で、その、同じ行に転記します。
 今回、それでいいのですか? それとも、列ごとに、転記する行は異なるのですか?
 このあたりも、具体例で説明してください。

 ★前トピの
[[20151124142046]] 『マクロにて転記作業について』(ぽぽろん)

 ここでも、アップしたコードで役に立ったようですけど、実は最後まで(今も)レイアウトと要件がわからずじまいでした。
 レイアウトと、そこでどんなことをしたいのかを、きちんと説明するのが、解決への早道ですよ。

(β) 2015/11/29(日) 07:58


すみません、シート構成についてアップします。
処理の意図が伝わると良いのですが、下記の通り説明をいたします。

下記のシートが「勤務表」シートです。

スタッフごとにBC列(結合)に名前

D列以降は2列毎に結合したセル「1日〜31日(B/C〜BL/BM)」

────B/C──D/E───F/G──────BL/BM──
──├──┼───┼───┬───┬────┬
─5-│名前│1火─.│2水─...│───│31木─..│
──├──┼───┼───┼───┼────┼
─9-│1様.│11/08・.│出勤─│───│11/29・─│
──├──┼───┼───┼───┼────┼─
─11│2様.│出勤─│11/14・.│───│出勤──│
──├──┼───┼───┼───┼────┼
─13│3様.│出勤─│出勤─│───│11/22・─│
──├──┼───┼───┼───┼────┼
──│──│───│───│───│────│
──├──┼───┼───┼───┼────┼
─55│24様│出勤─│11/14・.│───│11/28─│
──├──┼───┼───┼───┼────┼

上記表をピックアップして説明すると
下記表は、1名のスタッフに対し2行使用します(8行目と9行目の部分)

そして、実際の勤務を入力するセルは9行目に入力します。
※8行目はコメントを記載する部分で空欄です。

───B/C──D/E───F/G─────BL/BM──
──├──┼───┼───┼───┼───┼
─8-│──│空─欄│空─欄│───│空─欄│
──│名前│───│───│───│───┼
─9-│──│勤務名│勤務名│───│勤務名│
──├──┼───┼───┼───┼───┼

今回、マクロで処理をしたい部分は、勤務を入力するセルですので

行:D9:BM9、D11:BM11、D13:BM13・・・・・D55:BM55

から日付データを1人づつ取得します。

そして、「公休マスタシート」の勤務表にあるスタッフ名のセルに転記します。
 ↓
 ↓
 ↓

下記のシートが「公休マスタ」シートです

シート構成は

月初:処理開始日
月末:処理最終日
基準:処理月の最終休日(その月の最後の休日/当社は31日は休日扱いなので12/31と入力してあります)

4行目は、項目行

A列は、ナンバリング
B列は、休日リスト(2年分記載しております)

C列・5行目以降は、スタッフごとに取得した休日を転記するエリアになります。

スタッフ1名毎に、2列使用します。

C列:処理月(処理月とは、各月勤務表の締め日を記入する列になります)
D列:取得した休日を勤務表から転記する転記先の列になります

勤務表シートと公休マスタシートのデータ転記の流れを「1様」で説明すると

・勤務表シートのD9:BM9の勤務内容から休みの部分(日付)を取得

表では、11月に取得した休みは・・・「11/8、14、15,21,22,23,27,29」の8コ取得

・上記の休みデータを公休マスタシートの転記先セルである

「1様」のD列最終行セルに追記しその左隣C列に処理月(セルB2)転記

※年間で取得すべき休日は、B列に予め記載しておりますので
毎月の休日取得に間違いがなければ、B列の日付行と各スタッフの行が一致することで
休日の取りこぼしチェックに使用しています。(休みが溜まって、分からなくなるため)

────A───B───C────D────E────F────G────H───────AW────AX
──┌──┬───┐
─1-│月初│11/01..│
──├──┼───┤
─2-│月末│11/30..│
──├──┼───┤
─3-│基準│11/27..│─C────D────E────F────G────H───────AW────AX
──├──┼───┼───┬───┬────┬───┬────┬───┬───┬────┬───┐
─4-│NO。│休日─│取得日│.1様─│.取得日─│.2様─│.取得日─│.3様─│───│取得日─│24様─│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─87│─83.│11/21..│───│11/21・│────│11/21・│────│11/21・│───│────│11/21・│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─88│─84.│11/22..│───│11/22・│────│11/22・│ 11/30・・.│11/22・│───│────│11/22・│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─89│─85.│11/23..│───│11/23・│────│11/23・│────│───│───│11/30・・・│11/23・│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─90│─86.│11/28..│───│11/28・│ 11/30・・.│11/28・│────│───│11/30..│────│11/28・│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─91│─87.│11/29..│11/30・│11/29・│────│───│────│───│───│────│───│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─92│─88.│12/05..│───│───│────│───│────│───│───│────│───│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
─93│─89.│12/06..│───│───│────│───│────│───│───│────│───│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤
──│──│───│───│───│────│───│────│───│───│────│───│
──├──┼───┼───┼───┼────┼───┼────┼───┼───┼────┼───┤

(ぽぽろん) 2015/11/29(日) 14:48


 詳細レイアウトアップ、ありがとうございました。
 これから一生懸命おいかけてみますが、とりあえず、教えてください。

────B/C──D/E───F/G──────BL/BM──

 ──├──┼───┼───┬───┬────┬ 
 ─5-│名前│1火─.│2水─...│───│31木─..│ 
 ──├──┼───┼───┼───┼────┼ 
 ─9-│1様.│11/08・.│出勤─│───│11/29・─│ 
 ──├──┼───┼───┼───┼────┼─ 
 ─11│2様.│出勤─│11/14・.│───│出勤──│ 
 ──├──┼───┼───┼───┼────┼

 これを見ますと、5行目がタイトルですよね。
 で、9,10行目、11,12行目、・・と、2行単位で一人用の入力欄ですかね?
 そうすると、6行目から8行目はどうなっているのでしょうか? タイトル行が 5〜8行目の4行結合なんでしょうか?

 で、その中の説明だと理解していますが

───B/C──D/E───F/G─────BL/BM──

 ──├──┼───┼───┼───┼───┼ 
 ─8-│──│空─欄│空─欄│───│空─欄│ 
 ──│名前│───│───│───│───┼ 
 ─9-│──│勤務名│勤務名│───│勤務名│ 
 ──├──┼───┼───┼───┼───┼ 

 これって、8行目と9行目のペアで一人用?

 最初の例では、9行目と10行目のペアだったんですが?

(β) 2015/11/29(日) 15:51


βさん

コメントありがとうございます。
ご指摘の事項ですが・・・

勤務表シート

1行目〜4行目まで、タイトル・決済欄など
5行目:日にち欄
6行目:曜日欄
7行目:スケジュール記入欄

8行目〜勤務入力欄
※2行単位で一人用の入力欄です

※アップした表の例でいくと、8行目と9行目のペアで一人用になります。

(最初の例はすみません^^;)
・9行目と10行目のペアで一人用は、誤りです。

(ぽぽろん) 2015/11/29(日) 18:31


 要件理解の自信度60%ぐらいですが。

 Sub Test()
    Dim dicM As Object
    Dim dicD As Object
    Dim i As Long
    Dim j As Long
    Dim w As Variant
    Dim bDate As Variant
    Dim mCol As Long
    Set dicM = CreateObject("Scripting.Dictionary")
    Set dicD = CreateObject("Scripting.Dictionary")
    '公休マスタに登録されている個人名と、最終データ行の次の行番号,その列番号を取得
    With Sheets("公休マスタ")
        For j = 4 To .Cells(4, .Columns.Count).End(xlToLeft).Column Step 2
            dicM(.Cells(4, j).Value) = Array(.Cells(.Rows.Count, j).End(xlUp).Offset(1).Row, j)
        Next
        bDate = .Range("B3").Value
    End With

    '勤務表からの転記
    With Sheets("勤務表")
        mCol = .Cells(5, .Columns.Count).End(xlToLeft).Column
        For i = 8 To .Range("B" & Rows.Count).End(xlUp).Row Step 2
            If dicM.exists(.Range("B" & i).Value) Then
                dicD.RemoveAll
                w = dicM(.Range("B" & i).Value)
                For j = 4 To mCol Step 2
                    If IsDate(.Cells(i + 1, j).Value) Then dicD(.Cells(i + 1, j).Value) = True
                Next
                If dicD.Count > 0 Then
                    With Sheets("公休マスタ")
                        .Cells(w(0), w(1)).Resize(dicD.Count).Value = WorksheetFunction.Transpose(dicD.keys)
                        .Cells(w(0), w(1)).Offset(dicD.Count - 1).Interior.ColorIndex = 6
                        .Cells(w(0), w(1) - 1).Value = bDate
                    End With
                End If
            End If
        Next
    End With

 End Sub

(β) 2015/11/29(日) 19:09


βさん

うっかりしていました。申し訳ございません。

アドバイスのコードを参考に当方の処理を再確認し

 For i = 開始 To 終了 Step 2
という記述方法で、解決できました。

報告が遅れたことお詫び致します。
(ぽぽろん) 2015/12/05(土) 10:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.