[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『500ページ位ある請求書シートで、特定の印刷不要のページを削除したシートを生成したい』(えくぼ)
請求書データがエクセルで出力されます。
請求書データのエクセル表構成は、1ページが60行で、45列あります。
それが、下方向に500ページ分あります。
ですが、印刷に必要なのはそのうちの300ページ位です。
印刷不要なページは、各ページの左上から1列3行目(例:1ページ目ではA3)に「請求書不要」の文字が記載されています。
不要ページのデータを削除し、新しいワークシートを生成するにはVBAでどう記述すればよろしいでしょうか?
なお、行や列の幅などの書式もそのまま保持したいと思っています。
方法としては、
ワークシートから不要ページを直接を削る方法、
もしくは
必要なページデータを新しいワークシートにコピーし、生成する方法
があるかと思いますが、良い方法はありませんでしょうか?
以上、よろしくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
1ページ目・・・A3
2ページ目・・・A63
・
・
500ページ目・・A29943
ということですよね(計算が間違ってなければ)
そして、A3が「請求書不要」ってなっていたら
「3−2行目(=1行目)」から「3+57行目(=60行目)」まで削除
A63が「請求書不要」ってなっていたら
「63−2行目(=61行目)」から「63+57行目(=120行目)」まで削除
・
・
A29943が「請求書不要」ってなっていたら
「29943−2行目(=29941行目)」から「29943+57行目(=29990行目)」まで削除
ということになるとおもうので、これを簡単にいうと、60行おきに、A?の値をみて、条件に一致した場合は、?-2行目〜?+57行目までを削除すればよいということになるとおもいます。
また、”削除”すると行が上にシフト(繰り上がる)ので、上から見ていくのではなく、最終行(29943行目)からチェックしていくようにしたほうが良いとおもいます。
なので、私がつくるとしたら、
(1)シートを丸ごとコピーして作業用シートを作成。
(2)作業用シートに対して For〜nextステートメントで -60行ずつ 「請求書不要」 ってなっているかチェックする
(3)(2)の条件を満たしたら行範囲を削除する
という感じでつくるとおもいます。
(もこな2) 2018/03/01(木) 18:17
以下のようなものを作ったのですが、
これだと、30000行近くある表をすべてチェックしていくため
処理に時間がかかります。
そこで、Union関数を使って消したいページ分(1ページ分は60行あります)
をまとめて選択し、最後に一括削除すれば処理が速くなるのではないかと思うのですが・・・
UNION関数を使って、まとめて削除ページを選択、最後に一括削除をするにはどう記述したらよいでしょうか?
以上、よろしくお願いいたします。
<以下は、単純に「請求書不要」の文字を最下行から検索し、対象ページを削除するVBAです。
これに追記したいのですが・・・>
Sub 請求書不要削除()
Dim i As Long Dim a As Long Dim b As Long Dim x As Long Dim delgyo As Range
Sheets("請求書発行").Select
Dim MaxRow As Long MaxRow = Sheets("請求書発行").Cells(Rows.Count, 1).End(xlUp).Row
For i = MaxRow To 1 Step -1 'カウンターを下→上へ
If Range("A" & i).Value = "請求書不要" Then
a = i - 2 b = i + 57
Rows(a & ":" & b).Select Selection.Delete Shift:=xlUp
End If
Next
End Sub
(えくぼ) 2018/03/02(金) 11:26
Sub 請求書不要削除_改()
'==変数の宣言とか
Dim i As Long Dim 削除範囲 As Range
'==処理
With Worksheets.Add Sheets("請求書発行").Cells.Copy .Cells For i = 3 To 3 + (499 * 60) Step 60 If .Cells(i, "A").Value = "請求書不要" Then If 削除範囲 Is Nothing Then Set 削除範囲 = Range(.Rows(i - 2), .Rows(i + 57)) Else Set 削除範囲 = Union(削除範囲, Range(.Rows(i - 2), .Rows(i + 57))) End If End If Next i
If Not 削除範囲 Is Nothing Then 削除範囲.Delete .Activate '←必要無いなら削る 'Name=名前を変えるならここに記述 MsgBox "処理完了"
End With End Sub (もこな2) 2018/03/03(土) 14:05
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.