[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『削除した行の分だけ挿入「コピー」したい』(アライ)
こんにちは 以前この学校でお世話になり改良を重ねこのような素晴らしい物が出来ました。 実際に稼動して行く内に問題が発生し解決策をご教授していただきたくまいりました。 どうぞ宜しくお願いいたします。
「請求シート」「事務処理終了シート」という2枚のシート構成になっております。 請求シートのG列に日付が入力された時、庶務の担当者が確認し以下のモジュールを実施し 事務処理終了シートにコピーし、コピー元(列)を削除しています。
Sub 納品日削除()
Sheets("請求シート").Select
Dim i As Long
For i = Range("g65536").End(xlUp).Row To 3 Step -1 If Cells(i, 7).Value <> "" Then Rows(i).Copy Worksheets("事務処理終了シート").Rows(3).Insert Shift:=xlDown Rows(i).Delete Shift:=xlUp End If Next i
Sheets("事務処理終了シート").Select Range("A3").Select End Sub
請求シートには、数式が約1000行入っていたんですが、先日確認したところ300行程度に減っていました。 庶務の担当者が事務処理をした結果このような事態が発生いたしました。 削除する行は、1列おきだったり、飛び飛びだったり、まとめて5行だったりします。 ここで教えていただきたいのは、削除した分だけ増やす事ができるのでしょうか? 5行削除された時は、数式の入ってる行が1000-5で995行残っているので 995行目を選び、その下に5行コピーペーストするというような形で 宜しいのでしょうか?どうぞ、宜しくお願いいたします。 (アライ)
コピーしても使用できる数式で最後の行にデータ入力がなければ 削除した行数をカウントしておいて、その行数だけ最終行の下に いっきにコピペ(挿入)するとできると思います。 (やっちん)
>数式が約1000行入っていたんですが、
行をカットした後フィルしているだけですが どうでしょう^^ 予め1000行まで数式をコピーして置いてください (kohe)
Sub 納品日削除()
Sheets("請求シート").Select
Dim i As Long
For i = Range("g65536").End(xlUp).Row To 3 Step -1 If Cells(i, 7).Value <> "" Then Rows(i).Cut'-----------------------変更 Worksheets("事務処理終了シート").Rows(3).Insert Shift:=xlDown Rows(i).Delete Shift:=xlUp
Rows("999:999").AutoFill Destination:= _ '追加 Rows("999:1000"), Type:=xlFillDefault '追加
End If Next i
Sheets("事務処理終了シート").Select Range("A3").Select End Sub
>Rows("999:999").AutoFill Destination:= _ Rows("999:1000"), Type:=xlFillDefault '追加
たったこれだけの記述で出来てしまうんですね この式をネットで検索し大まかには理解できました。 本当に有難う御座いました。
重ねてのお願いですいません
右の作業列にカウントするため =SUMPRODUCT(($B$3:$B$300=W1)*($F$3:$F$300=$U$2)) このような数式が入っています。 初期設定は =SUMPRODUCT(($B$3:$B$1000=W1)*($F$3:$F$1000=$U$2)) だったのですが。。。 処理を繰り返してる間に$B$1000がB$300に減少してしまいました。 勿論このような数式でなくてもかまいません 上記処理を実行した時に参照範囲が変わらない設定を 教えていただけますか? 宜しく御願い致します。 (アライ)
式を初期設定に戻すのは、最終行の前に必要な行数だけコピーで挿入すれば簡単ですね。 同じ理由でフィルではなくて挿入だったら気にする必要もなかったんですが。 (やっちん)
ちょっと自分には手が出ない領域なのですが でも、チャレンジしてみます。 >最終行の前に必要な行数だけコピー これがポイントですよね、多分 数時間、時間をください宜しく御願い致します (アライ)
オペレーションとしては、 最後の行をコピーして 必要な行数分を最後の行から下方向に行を選択して 「コピーしたセルの挿入」。 これをVBAにさせるということです。 (やっちん)
>=SUMPRODUCT(($B$3:$B$1000=W1)*($F$3:$F$1000=$U$2)) >だったのですが。。。
改良版です
Sub 納品日削除()
Sheets("請求シート").Select
Dim i As Long
For i = Range("g65536").End(xlUp).Row To 3 Step -1 If Cells(i, 7).Value <> "" Then Rows(i).Cut '-----------------------変更 Worksheets("事務処理終了シート").Rows(3).Insert Shift:=xlDown Rows(i).Delete Shift:=xlUp
'↓数式がH列の場合 Range("H3") = "=SUMPRODUCT(($B$3:$B$1000=W3)*($F$3:$F$1000=$U$2))" Range("H3").AutoFill Destination:=Range("H3:H1000") '↑数式がH列の場合 End If Next i
Sheets("事務処理終了シート").Select Range("A3").Select End Sub
行を増やす部分はいらなくなったのでしょうか?何かしら書式があったりするのかなあと思うのですが。 それと、式を入れる場合はループの外で1回で済ませた方がいいかなと。 ついでにプロパティも省略せずにFormula付けた方がいいですよ。 すいません、ちょっと気になったもので。 (やっちん)
増やす部分は相変わらず必要なんですが、、、
>Range("H3") = "=SUMPRODUCT(($B$3:$B$1000=W3)*($F$3:$F$1000=$U$2))" この数式の部分でIF処理が実際は施してある関係で上手く働きませんでしたので やっちん様の方法で頑張っていますが、いかんせん、、、
あれから今までPCにかぶりつき
Sub 納品日削除()
Sheets("請求シート").Select
Dim i As Long
For i = Range("g65536").End(xlUp).Row To 3 Step -1 If Cells(i, 7).Value <> "" Then Rows(i).Copy Worksheets("事務処理終了シート").Rows(3).Insert Shift:=xlDown Rows(i).Delete Shift:=xlUp Sheets("請求シート").Select Range("D65536").End(xlUp).Rows.Select
End If Next i
Sheets("事務処理終了シート").Select Range("A3").Select End Sub
ここまでです
最終行を取得(セル) ここに削除した分だけ挿入といけば良いのですが、、、 どうぞ宜しく御願い致します (アライ)
今まで行を削除して式の結果がおかしくなっていないのであれば これでいいのかなあ。 必ず行を削除しても2行以上残ることが前提です。 Sub 納品日削除() Dim i As Long Dim Cnt As Long Const LastRow = 1000 '<-最終行
Sheets("請求シート").Select
Cnt = 0 For i = Range("g65536").End(xlUp).Row To 3 Step -1 If Cells(i, 7).Value <> "" Then Rows(i).Copy Worksheets("事務処理終了シート").Rows(3).Insert Shift:=xlDown Rows(i).Delete Shift:=xlUp Cnt = Cnt + 1 End If Next i If Cnt > 0 Then Rows(LastRow - Cnt).Copy Rows((LastRow - Cnt) & ":" & (LastRow - 1)).Insert Shift:=xlDown Application.CutCopyMode = False End If Sheets("事務処理終了シート").Select Range("A3").Select End Sub
完璧に思い通りの結果になりました。 >必ず行を削除しても2行以上残ることが前提です。 この部分に関しては、問題なくクリアできます 行を多めに設定し この行には入力しないでください 次回請求までお待ちください等の記載で済む事ですので 早朝の時間にご教授していただき有難う御座いました このサイトの運営に携わる皆様 また回答をしてくださる諸先生方 本当に有難う御座いました 今後とも宜しく御願い致します。 失礼させて頂きます (アライ)
すいません、名前書くの忘れてました(^^; 2行以上と書きましたが、式で指定している先頭行または最終行を削除すると式がおかしくなります。 今まで行を削除して大丈夫だったところから、この2行は削除していないのでしょうね。 (やっちん)
to やっちん さん >すいません、ちょっと気になったもので。 とんでもありません ご忠告ありがたく思います >完璧です。 で舞い上がってしまいました これからも稚拙コードですが ご指導添削お願いいたします (kohe)
申し訳ありませんが、説明していただけると嬉しいのですが どうぞ宜しく御願い致します。
>Cnt = Cnt + 1
>If Cnt > 0 Then Rows(LastRow - Cnt).Copy Rows((LastRow - Cnt) & ":" & (LastRow - 1)).Insert Shift:=xlDown
(アライ)
>Cnt = Cnt + 1 は削除された行を数えています。
>If Cnt > 0 Then Rows(LastRow - Cnt).Copy Rows((LastRow - Cnt) & ":" & (LastRow - 1)).Insert Shift:=xlDown は1行以上削除された場合に最終行をコピーし 削除された行数分、最終行の前に挿入しています。 Rows()の中の値がどうなっているのかは御自分でシミュレーションしてみてください。
前にも書きましたが >オペレーションとしては、 >最後の行をコピーして >必要な行数分を最後の行から下方向に行を選択して >「コピーしたセルの挿入」。 >これをVBAにさせるということです。 まさにこれです。 同じことをマクロの記録で行うと似たようなコードができます。 私はそれにちょっと手を加えただけです。
koheさんへ。 お互いステップアップしていきましょう(^^ (やっちん)
自動記録に手を加えただけですか ゆっくり解読したいと思います 感謝いたします (アライ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.