[[20180301160111]] 『500ページ位ある請求書シートで、特定の印刷不要ax(えくぼ) ページの最後に飛ぶ

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

 

『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


もこな2さん
どうもありがとうございます!!!

以下のようなものを作ったのですが、
これだと、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


>UNION関数を使って、まとめて削除ページを選択、最後に一括削除をするにはどう記述したらよいでしょうか?
答えになってるか微妙ですけど、単純に、見つかったら削除ってなってる部分を、そのままUNION関数使って、対象範囲に追加するって仕組みに置き換えればよいだけでは?
また、逐一削除するのでなければ上から見て行っても問題ないようにおもいます。
さらに、提示のコードは1行ずつ見てますけど、60行ワンセットだから、STEP数は「60」に修正したほうがよいとおもいます。
それを踏まえると、こんな感じ。

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.