[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『飛び飛びセルのシート間への転記について』(ぽぽろん)
お世話になっております。
下記コードは、転記元のシートを開いた状態でマクロ実行し転記先(公休マスタシート)へデータを転記します。
(具体的には)
転記元シートの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列: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.