[[20151124142046]] 『マクロにて転記作業について』(ぽぽろん) ページの最後に飛ぶ

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

 

『マクロにて転記作業について』(ぽぽろん)

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

質問ですが

D4の最終行から右に1列オフセットした位置に
D2の値を転記したいと考えております。

しかし、下記コードでは反応無く困っております。

アドバイスの程よろしくお願いします。

Range("D4").End(xlDown).Offset(rowOffset:=0, columnOffset:=-1).Value = Range("D2").Value

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


 Range("D4").End(xlDown).Offset(, 1).Value = Range("D2").Value
 ということでしょうか?
(se_9) 2015/11/24(火) 14:26

 ちなみに
 Range("D4").End(xlDown).Offset(rowOffset:=0, columnOffset:=-1).Value = Range("D2").Value
 だと右ではなく左にD2セルの値が表示されると思いますが、反応がないとはどういうことなのか・・・?
(se_9) 2015/11/24(火) 14:31

se_9さま
早速の回答ありがとうございます。
が、誠に申し訳ございません。参照先のセル番地が違っておりました(-_-)

・・・・= Range("D2").Value→= Range("B2").Value

更にもう一つよろしいでしょうか?

下記コードは、2箇所のセル及び範囲を削除するコードです。
※便宜上「選択」するコードになっております。

質問は下記コードは正常に動いておりますが、もっとシンプルにならないかと考えております。
アドバイスの程よろしくお願いいたします。

    Dim e As Variant
    Dim f As Variant
    Dim g As Variant

    e = Range("C65536").End(xlUp).Row    'C列最終行セル取得
    f = Range("C" & e).End(xlUp).Offset(rowOffset:=1, columnOffset:=1).Row    '更にC列の次の最終行から右下にoffsetセル取得
    g = Range("D" & f).End(xlDown).Row    'D列の最終行セル取得

    Range("D" & f, "D" & g).Select    'D列の選択開始f〜選択最終gのセル範囲を削除
    Range("D" & g).Offset(rowOffset:=0, columnOffset:=-1).Select    'D列の最終行から左にoffsetし削除
(ぽぽろん) 2015/11/24(火) 15:02

 横から失礼。

 >>下記コードは正常に動いておりますが

 それは結構なことですが、要件とレイアウトの条件を明確にしてはいかがですか。
 コードを読んで、やりたいことを理解してほしいということでしょうけど。

 たとえば、 C列 xlUp で求めた データ最終行から さらに xlUp。
 この最終行の上に、隙間なくデータがあって、どこかでとぎれるレイアウトと、この最終行の上には空白セルブロックがあって
 どこかに、値のあるセルが登場するレイアウトでは、取得されるセルの性格が異なってきます。

 どことどこをどうしたいか、明確な文章で説明したほうがよろしいかと。

(β) 2015/11/24(火) 15:15


βさん ありがとうございます。

全体の流れとしては、「勤務表から、公休マスタへ休み情報を転記」する流れになり、今回の質問部分に該当する処理については、休み情報を転記完了後、その休み情報を修正する場合に「転記した休み情報を削除」する部分に当たります。

シート構成ですが

シート名(公休マスタ)

(設定部分)

B1=日付(月初)
B2=日付(月末)
B3=日付(処理の基準日)
B3:AX3=帳票のデータ数を表示(関数)

(帳票部分)

A列=ナンバリング
B列=日付一覧

A4:AX4=項目行
C5:AX250=データ入力範囲

(処理内容)

スタッフの休暇管理として2列づつ使用します(例:C列・D列が一人分で、以降EF・・・と続く)

D列はスタッフが取得した休暇日が記載されており・・・
D列最終行の左側→C列にB2の値(処理月)が表示されます。

その理由は

休暇はその月に取得すべき休みが消化出来るとは限らないため、残休管理上(取り残した休みで、月を間またぐことがある)どの月に休みが取得できたのか分かるようにC列へ目印として処理月を記載しております。

また、C列に処理月を記載することは、別シートの勤務表から休み(日付)をマクロで転記した後、間違いに気づいた時に修正(前回取得分まで遡って削除)するためにも使います。

(全体の処理の流れ)

勤務表から公休マスタへ必要な休みデータを転記する処理実行

勤務表から休み(日付)を公休マスタへ転記

公休マスタのD列最終行に「当月取得した休み全てを」を転記

公休マスタのD列最終行の左C列に当月の日付であるB2の値を転記

完了

(質問の部分)

公休マスタへ転記完了後、転記した値を削除する必要がでた場合に
当月の転記範囲であるC列〜D列の最終行までの範囲の値をクリア

※最初アップしたコードから修正しました。

Sub 転記削除()

    Dim e As Variant
    Dim f As Variant
    Dim g As Variant

    Worksheets("職員公休マスタ").Select
    e = Range("C65536").End(xlUp).Row    'C列最終行セル取得
    f = Range("C" & e).End(xlUp).Offset(rowOffset:=1, columnOffset:=1).Row    '更にC列の次の最終行から右下にoffsetセル取得
    g = Range("D" & f).End(xlDown).Row    'D列の最終行セル取得

    Range("C" & f, "D" & g).Select    'C列の選択開始f〜D列選択最終gのセル範囲の値・色をクリア

End Sub

(ぽぽろん) 2015/11/24(火) 16:15


スミマセン、追記で(申し訳ございません)

できたら、現在のコードは、C列・D列のみの処理コードですが

これを C列:AX列 全てに自動で処理できたらと考えております。

C/D E/F G/H I/J K/L M/N O/P Q/R S/T U/V W/X Y/Z AA/AB AC/AD AE/AF AG/AH AI/AJ AK/AL AM/AN AO/AP AQ/AR AS/AT AU/AV AW/AX

すみませんがよろしくお願いいたします。

(ぽぽろん) 2015/11/24(火) 16:29


 >B3:AX3=帳票のデータ数を表示(関数)
 B3=日付(処理の基準日)じゃなかったの…
 >D列はスタッフが取得した休暇日が記載
 B列=日付一覧はじゃあどうして必要なの…
 C5:AX250=データ入力範囲 ってことは、A5からB250は関数かなにか?

 というように、いまいちよくわかりません

 あと、コメントに
 >ほにゃららら.Select  'ほにゃらら 削除
 とありますが、Select = 削除じゃない、のはご存じですよね?
 とりあえずコード作成中はSelectさせてるだけですよ…ね?

(___) 2015/11/24(火) 17:48


説明不足すみません。

B列=日付一覧はじゃあどうして必要なの…

D3:AX3にB列の日付リスト(休暇日一覧)を参照させ、残休数を表示させる式が入っているためです。

A3=MATCH(B3,B5:B252,0)+2
D3=IF(D4="","0",COUNTBLANK(D5:INDEX(D:D,$A$3)))

Select = 削除じゃない、のはご存じですよね?

これは、便宜上、動作確認するためにあえてselectにしているためで実際にはclearにします。

(ぽぽろん) 2015/11/24(火) 18:12


 説明を読んでも、よく理解できません。
 シートレイアウトというか、その上のデータのありようが見えませんが、コード内で選択しようとしている領域は
 以下で正しいですか?間違っていますか?

 これが正しいとすれば、あとは、横にループさせるだけです。

 Sub Test()
    Range(Range("C" & Rows.Count).End(xlUp).End(xlUp).Offset(1), Range("D" & Rows.Count).End(xlUp)).Select
 End Sub

(β) 2015/11/24(火) 19:32


こんにちは。

せっかく入力したデータをなぜ消さないといけないのですか?
消さずに済む方法を見つけられたら、複雑なコードを書かずに済みますよ。

どうしても消さないといけないとしたら、
(たぶん先月分のデータを消してらっしゃると思うので、)先月1日から末日までの
C列からAX列までの範囲を一度にさくっと消してしまってはどうでしょう。
2列ずつ消さないとやはり駄目なのでしょうか。

B2セルの値を転記するのは、削除のあとのほうがやりやすいのではないか
と思います。

( 佳 ) 2015/11/24(火) 21:00


βさん、ありがとうございます。一行のコードで一発でヒットしました。

佳さん
説明不足で困惑させてしまいすみません。どうしても2列づつ消す必要がありましてこのような仕様にしております。
(ぽぽろん) 2015/11/24(火) 21:11


 必要性があるとして、ループさせるには Range(  ) の かっこないの Range を Cells にすれば書きやすいですね。

 Sub TestLoop()
    Dim x As Long

    For x = Columns("C").Column To Columns("AW").Column Step 2
        Range(Cells(Rows.Count, x).End(xlUp).End(xlUp).Offset(1), Cells(Rows.Count, x + 1).End(xlUp)).Select
        MsgBox "確認してください"
    Next

 End Sub

(β) 2015/11/25(水) 09:02


βさん 朝よりありがとうございます。

丁度、作業を進めているところで・・・

For i = 3 To 50 Step 2 で、ループ処理のところまではできたのですが

指定範囲処理の組込み方が分からずアドバイスもらおうとしているところでした。

提示のコード試したらバッチリ、横にループ&処理出来ることが確認できました。

ワクワクしながら処理確認していると、欲がでてしまいました^^;スミマセン

追加質問です・・・

Range(Cells(Rows.Count, x).End(xlUp).End(xlUp).Offset(1), Cells(Rows.Count, x + 1).End(xlUp)).Select

上記で、単純に最終行を取得しながら処理するのですが、途中の列に「項目名のみでデータが存在しない」ケースがあります。

例:Cさんのケース

Aさん・・・Cさん・・・Fさん
あ・・・・・・・・・・・あ
い・・・・・・・・・・・い
う・・・・・・・・・・・う
え・・・・・・・・・・・え
お・・・・・・・・・・・お
・・・・・・・・・・・・か

この場合に

項目行下の5行目までEnd(xlUp)してデータがなければ、次に移るという処理をしたいのですが、どのようにすればよろしいのでしょうか?

(ぽぽろん) 2015/11/25(水) 10:45


すみません。こんな感じで組んでみました。

(流れは)

For Each myr In Cells(x, 5).Next で x列の5行目にデータ有無で実行するか判断しています。

結果:途中まで処理は順調に処理していましたが、残り数列残して終了してしまいます。

→Cells(x, 5).Next ここが怪しいと思うのですが原因が分からず困っております。

アドバイスの程よろしくお願いいたします。

Sub 横方向へのループ()

    Dim x As Long    '処理範囲
    Dim myr As Range

    For x = Columns("C").Column To Columns("AW").Column Step 2    '2列おきに処理

        For Each myr In Cells(x, 5).Next    '変数x列5行目の右隣りに・・・

            If myr.Value <> "" Then    '値があれば処理

                MsgBox "データあり"

                Range(Cells(Rows.Count, x).End(xlUp).End(xlUp).Offset(1), Cells(Rows.Count, x + 1).End(xlUp)).Select

            End If

        Next myr
    Next
    MsgBox "データがなし終了"
    Exit Sub

End Sub
(ぽぽろん) 2015/11/25(水) 13:11


 スキップすべき要件を誤解しているかもしれませんが、C,E,G,・・・の各列のデータ最終セルが5行目未満ならスキップするコードです。

 Sub TestLoop()
    Dim x As Long

    For x = Columns("C").Column To Columns("AW").Column Step 2
        If Cells(Rows.Count, x).End(xlUp).Row >= 5 Then
            Range(Cells(Rows.Count, x).End(xlUp).End(xlUp).Offset(1), Cells(Rows.Count, x + 1).End(xlUp)).Select
            MsgBox "確認してください"
        End If
    Next

 End Sub

(β) 2015/11/25(水) 14:05


βさん

ありがとうございます。
流石に、簡潔なコードです。

動作はきちんと5行目にデータ有無をチェックしながら処理されていました。

おかげさまで解決です(^^)
今後ともご指導よろしくお願いいたします。

(ぽぽろん) 2015/11/25(水) 15:45


コメント返信:

[ 一覧(最新更新順) ]


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