Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1508 / 13645 ツリー ←次へ | 前へ→

【73930】行の削除につきまして maimai 13/3/22(金) 20:01 質問[未読]
【73931】Re:行の削除につきまして maimai 13/3/22(金) 20:27 質問[未読]
【73932】Re:行の削除につきまして UO3 13/3/22(金) 21:38 発言[未読]
【73954】Re:行の削除につきまして maimai 13/3/25(月) 9:59 お礼[未読]
【73934】Re:行の削除につきまして kanabun 13/3/22(金) 21:55 発言[未読]
【73955】Re:行の削除につきまして maimai 13/3/25(月) 10:00 お礼[未読]
【73935】Re:行の削除につきまして UO3 13/3/22(金) 22:08 発言[未読]
【73956】Re:行の削除につきまして maimai 13/3/25(月) 10:01 お礼[未読]
【73958】Re:行の削除につきまして maimai 13/3/25(月) 10:22 お礼[未読]
【73937】Re:行の削除につきまして kanabun 13/3/22(金) 22:15 質問[未読]
【73946】Re:行の削除につきまして UO3 13/3/23(土) 7:20 発言[未読]
【73948】Re:行の削除につきまして kanabun 13/3/23(土) 8:40 発言[未読]
【73949】Re:行の削除につきまして kanabun 13/3/23(土) 9:25 発言[未読]
【73957】Re:行の削除につきまして maimai 13/3/25(月) 10:07 お礼[未読]
【73959】Re:行の削除につきまして maimai 13/3/25(月) 10:24 お礼[未読]

【73930】行の削除につきまして
質問  maimai  - 13/3/22(金) 20:01 -

引用なし
パスワード
   はじめまして。まいまいと申します。
営業をしているものです。

エクセルで必要じゃないデータ(行)を削除したいのですが、
8000件と膨大にあり四苦八苦しております。

決まった法則に1〜7行縦に並んでおりまして、
それが、行数で8000件ございます。

必要な行は、2番目の行と6番目の行のみとなり、
それ以外を削除したいのですが、何とかご教示頂けないでしょうか。

何卒宜しくお願い申し上げます。

まいまい

【73931】Re:行の削除につきまして
質問  maimai  - 13/3/22(金) 20:27 -

引用なし
パスワード
   ▼maimai さん:
>決まった法則に1〜7行縦に並んでおりまして、
>それが、行数で8000件ございます。

読み返してみると全く意味がわからなかったので、
言葉足らずで申し訳ございません。 追記致します。

1〜7行縦に並んでいるデータがワンセットとなっております。
従いまして、次のデータは8行目から14行目となり、それが
8000行続いているとイメージしていただけると幸いです。

2番目と6番目のみが必要なデータとなりますので、
次のデータの場合は、9番目と13番目が必要なデータとなり、
それを最後まで続けて削除したいのです!

宜しくお願い致します><

まいまい

【73932】Re:行の削除につきまして
発言  UO3  - 13/3/22(金) 21:38 -

引用なし
パスワード
   ▼maimai さん:

結構、時計マークが長くでて、エクセルが固まってしまったように感じるかもしれません。
もしかしたら、不要なものを削除するより、必要なものを残した方がよかったかも。

Sub Sample()
  Dim r As Range
  Dim i As Long
  Dim a As Range
  
  Set r = Union(Range("A1"), Range("A3:A5"), Range("A7"))
  
  For i = 1 To Range("A" & Rows.Count).End(xlUp).Row Step 7
    Set a = Union(Range("A" & i), Range("A" & i + 2 & ":A" & i + 4), Range("A" & i + 6))
    If r Is Nothing Then
      Set r = a
    Else
      Set r = Union(r, a)
    End If
  Next
  
  r.EntireRow.Delete
  
End Sub

【73934】Re:行の削除につきまして
発言  kanabun  - 13/3/22(金) 21:55 -

引用なし
パスワード
   ▼maimai さん:

折しも別板で同様の質問があり、そこで使った処理方法です。

Sub try3() '作業列としてZ列を使う
 Dim n As Long

  n = Cells(Rows.Count, 1).End(xlUp).Row
  With Range("Z1").Resize(n)
    .Item(2).Value = 2
    .Item(6).Value = 6
    .Resize(7).AutoFill Destination:=.Cells
    .SpecialCells(xlBlanks).EntireRow.Delete
  End With
  Columns("Z").Delete
  
End Sub

【73935】Re:行の削除につきまして
発言  UO3  - 13/3/22(金) 22:08 -

引用なし
パスワード
   ▼maimai さん:

残すべきものを残すコードです。
こちらのほうが、同じ時計マークでも処理時間は短いと思います。
Sheet1からSheet2に転記しています。

Sub Sample2()
  Dim r As Range
  Dim i As Long
  Dim wSh As Worksheet
 
  Application.ScreenUpdating = False
  
  Set wSh = Sheets("Sheet2") '転記シート
  wSh.Cells.ClearContents
  
  With Sheets("Sheet1")    '元シート
  
    For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 7
      Cells(i, 1).ClearContents
      Cells(i + 2, 1).Resize(3).ClearContents
      Cells(i + 6, 1).ClearContents
    Next
    
    Set r = Columns("A").SpecialCells(xlCellTypeConstants)
    r.EntireRow.Copy wSh.Range("A1")
    
  End With
  
  wSh.Select
  Application.ScreenUpdating = True
  
End Sub

【73937】Re:行の削除につきまして
質問  kanabun  - 13/3/22(金) 22:15 -

引用なし
パスワード
   ▼maimai さん:

SpecialCellsメソッドでは遅いばあいは、
同じく作業列を使って 削除したい行を空白にして
その作業列をキーにしてソートをかけると、空白セルが下に集まりますから
一気に行削除できます。

Sub Try4()
  Dim n As Long

  n = Cells(Rows.Count, 1).End(xlUp).Row
  With Range("Z1").Resize(n)
    .Item(2).Value = 2
    .Item(6).Value = 6
    .Resize(7).AutoFill Destination:=.Cells
    .Sort Key1:=.Columns(1), Header:=xlNo
    Range(Cells(n, "Z"), _
     Cells(Rows.Count, "Z").End(xlUp).Offset(1)) _
      .EntireRow.Delete
  End With
  Columns("Z").Delete

End Sub

ExcelのSortは速いことを利用した方法です。

【73946】Re:行の削除につきまして
発言  UO3  - 13/3/23(土) 7:20 -

引用なし
パスワード
   ▼kanabun さん:

おはようございます。
私もソート利用に一票ですが
このコードだとZ列だけが並び替えされませんか?
あと、DeleteのかわりにClearないしはCleaContentsでもいいかもしれませんね。

【73948】Re:行の削除につきまして
発言  kanabun  - 13/3/23(土) 8:40 -

引用なし
パスワード
   ▼UO3 さん:

>私もソート利用に一票ですが
>このコードだとZ列だけが並び替えされませんか?
>あと、DeleteのかわりにClearないしはCleaContentsでもいいかもしれませんね。

ああ、すみません。おっしゃるとおり、データ全体を(作業列zをキーに
して)並び替えないといけなかったです。
どうも、失礼 m(_ _)m

【73949】Re:行の削除につきまして
発言  kanabun  - 13/3/23(土) 9:25 -

引用なし
パスワード
   いちおうTry4() 修正版です

Sub Try4b()
  Const m = 4 '表全体の列数【適宜変更してください】
  Dim n As Long
  
  n = Cells(Rows.Count, 1).End(xlUp).Row
  Columns(1).Insert '作業列挿入
  With Range("A1").Resize(n)
    .Item(2).Value = 2
    .Item(6).Value = 6
    .Resize(7).AutoFill Destination:=.Cells
    .Resize(, m + 1).Sort Key1:=.Columns(1), Header:=xlNo
    Range(Cells(n, 1), _
     Cells(Rows.Count, 1).End(xlUp).Offset(1)) _
      .EntireRow.Clear
  End With
  Columns(1).Delete '作業列削除

End Sub

【73954】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 9:59 -

引用なし
パスワード
   ▼UO3 さん:
早速のご返信ありがとうございます。
以下、確認させて頂きます!

>▼maimai さん:
>
>結構、時計マークが長くでて、エクセルが固まってしまったように感じるかもしれません。
>もしかしたら、不要なものを削除するより、必要なものを残した方がよかったかも。
>
>Sub Sample()
>  Dim r As Range
>  Dim i As Long
>  Dim a As Range
>  
>  Set r = Union(Range("A1"), Range("A3:A5"), Range("A7"))
>  
>  For i = 1 To Range("A" & Rows.Count).End(xlUp).Row Step 7
>    Set a = Union(Range("A" & i), Range("A" & i + 2 & ":A" & i + 4), Range("A" & i + 6))
>    If r Is Nothing Then
>      Set r = a
>    Else
>      Set r = Union(r, a)
>    End If
>  Next
>  
>  r.EntireRow.Delete
>  
>End Sub

【73955】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 10:00 -

引用なし
パスワード
   ▼kanabun さん:
ご返信ありがとうございます!
皆様いろいろとノウハウがあり、安心して拝見させて頂きます。
宜しくお願い申し上げます。

>▼maimai さん:
>
>折しも別板で同様の質問があり、そこで使った処理方法です。
>
>Sub try3() '作業列としてZ列を使う
> Dim n As Long
>
>  n = Cells(Rows.Count, 1).End(xlUp).Row
>  With Range("Z1").Resize(n)
>    .Item(2).Value = 2
>    .Item(6).Value = 6
>    .Resize(7).AutoFill Destination:=.Cells
>    .SpecialCells(xlBlanks).EntireRow.Delete
>  End With
>  Columns("Z").Delete
>  
>End Sub

【73956】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 10:01 -

引用なし
パスワード
   ▼UO3 さん:
本当に何から何まですいません。。。
週末はパソコン見てなかったのですが、
こんなに早く・・・色々とありがとうございます!

>▼maimai さん:
>
>残すべきものを残すコードです。
>こちらのほうが、同じ時計マークでも処理時間は短いと思います。
>Sheet1からSheet2に転記しています。
>
>Sub Sample2()
>  Dim r As Range
>  Dim i As Long
>  Dim wSh As Worksheet
> 
>  Application.ScreenUpdating = False
>  
>  Set wSh = Sheets("Sheet2") '転記シート
>  wSh.Cells.ClearContents
>  
>  With Sheets("Sheet1")    '元シート
>  
>    For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 7
>      Cells(i, 1).ClearContents
>      Cells(i + 2, 1).Resize(3).ClearContents
>      Cells(i + 6, 1).ClearContents
>    Next
>    
>    Set r = Columns("A").SpecialCells(xlCellTypeConstants)
>    r.EntireRow.Copy wSh.Range("A1")
>    
>  End With
>  
>  wSh.Select
>  Application.ScreenUpdating = True
>  
>End Sub

【73957】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 10:07 -

引用なし
パスワード
   ▼kanabun さん:
色々と、ありがとうございます><
早速試してみます。
また、フィードバック致します。
宜しくお願い致します。

>いちおうTry4() 修正版です
>
>Sub Try4b()
>  Const m = 4 '表全体の列数【適宜変更してください】
>  Dim n As Long
>  
>  n = Cells(Rows.Count, 1).End(xlUp).Row
>  Columns(1).Insert '作業列挿入
>  With Range("A1").Resize(n)
>    .Item(2).Value = 2
>    .Item(6).Value = 6
>    .Resize(7).AutoFill Destination:=.Cells
>    .Resize(, m + 1).Sort Key1:=.Columns(1), Header:=xlNo
>    Range(Cells(n, 1), _
>     Cells(Rows.Count, 1).End(xlUp).Offset(1)) _
>      .EntireRow.Clear
>  End With
>  Columns(1).Delete '作業列削除
>
>End Sub

【73958】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 10:22 -

引用なし
パスワード
   ▼UO3 さん:
こちらの方が時計マークが出てなくてスムーズでした!
考え方でこんなに変わるんですね。。。
残すべきものを残すと言うのは、私では考えがつきませんでした・・。
本当にありがとうございます!

>▼UO3 さん:
>本当に何から何まですいません。。。
>週末はパソコン見てなかったのですが、
>こんなに早く・・・色々とありがとうございます!
>
>>▼maimai さん:
>>
>>残すべきものを残すコードです。
>>こちらのほうが、同じ時計マークでも処理時間は短いと思います。
>>Sheet1からSheet2に転記しています。
>>
>>Sub Sample2()
>>  Dim r As Range
>>  Dim i As Long
>>  Dim wSh As Worksheet
>> 
>>  Application.ScreenUpdating = False
>>  
>>  Set wSh = Sheets("Sheet2") '転記シート
>>  wSh.Cells.ClearContents
>>  
>>  With Sheets("Sheet1")    '元シート
>>  
>>    For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 7
>>      Cells(i, 1).ClearContents
>>      Cells(i + 2, 1).Resize(3).ClearContents
>>      Cells(i + 6, 1).ClearContents
>>    Next
>>    
>>    Set r = Columns("A").SpecialCells(xlCellTypeConstants)
>>    r.EntireRow.Copy wSh.Range("A1")
>>    
>>  End With
>>  
>>  wSh.Select
>>  Application.ScreenUpdating = True
>>  
>>End Sub

【73959】Re:行の削除につきまして
お礼  maimai  - 13/3/25(月) 10:24 -

引用なし
パスワード
   ▼kanabun さん:
修正版ありがとうございました。
こちらも正常に動き、本当に時間が短縮されました。

UO3さんとkanabunさんには本当にお世話なりました。
今後の業務に今回頂いた内容を活かし、
時間的にもかなり短縮され、とても嬉しいです。
本当にありがとうございました!

宜しくお願い申し上げます。

maimai

>▼kanabun さん:
>色々と、ありがとうございます><
>早速試してみます。
>また、フィードバック致します。
>宜しくお願い致します。
>
>>いちおうTry4() 修正版です
>>
>>Sub Try4b()
>>  Const m = 4 '表全体の列数【適宜変更してください】
>>  Dim n As Long
>>  
>>  n = Cells(Rows.Count, 1).End(xlUp).Row
>>  Columns(1).Insert '作業列挿入
>>  With Range("A1").Resize(n)
>>    .Item(2).Value = 2
>>    .Item(6).Value = 6
>>    .Resize(7).AutoFill Destination:=.Cells
>>    .Resize(, m + 1).Sort Key1:=.Columns(1), Header:=xlNo
>>    Range(Cells(n, 1), _
>>     Cells(Rows.Count, 1).End(xlUp).Offset(1)) _
>>      .EntireRow.Clear
>>  End With
>>  Columns(1).Delete '作業列削除
>>
>>End Sub

1508 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free