Excel VBA質問箱 IV

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

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


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

【49390】特定の行のみ削除する方法がわかりません。 とっきぃ 07/6/3(日) 19:25 質問[未読]
【49391】Re:特定の行のみ削除する方法 かみちゃん 07/6/3(日) 19:31 発言[未読]
【49392】Re:特定の行のみ削除する方法 とっきぃ 07/6/3(日) 19:42 発言[未読]
【49395】Re:特定の行のみ削除する方法 かみちゃん 07/6/3(日) 21:41 発言[未読]
【49414】Re:特定の行のみ削除する方法 とっきぃ 07/6/4(月) 18:49 質問[未読]
【49470】Re:特定の行のみ削除する方法 Hirofumi 07/6/5(火) 23:02 回答[未読]
【49501】Re:特定の行のみ削除する方法 とっきぃ 07/6/7(木) 12:18 お礼[未読]
【49393】Re:特定の行のみ削除する方法がわかりませ... Hirofumi 07/6/3(日) 19:54 回答[未読]
【49394】Re:特定の行のみ削除する方法がわかりませ... とっきぃ 07/6/3(日) 20:02 発言[未読]
【49517】Re:特定の行のみ削除する方法がわかりませ... とっきぃ 07/6/8(金) 14:43 質問[未読]
【49521】Re:特定の行のみ削除する方法がわかりませ... Hirofumi 07/6/8(金) 16:17 回答[未読]
【49522】Re:特定の行のみ削除する方法がわかりませ... とっきぃ 07/6/8(金) 16:34 質問[未読]
【49533】Re:特定の行のみ削除する方法がわかりませ... Hirofumi 07/6/8(金) 18:28 回答[未読]
【49534】Re:特定の行のみ削除する方法がわかりませ... とっきぃ 07/6/8(金) 19:40 お礼[未読]

【49390】特定の行のみ削除する方法がわかりません...
質問  とっきぃ  - 07/6/3(日) 19:25 -

引用なし
パスワード
   不特定な数の行(たとえば重複検索をして選ばれた行)などを何かの変数のような物に入れて、その行を削除する事は可能なのでしょうか?

【49391】Re:特定の行のみ削除する方法
発言  かみちゃん  - 07/6/3(日) 19:31 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>不特定な数の行(たとえば重複検索をして選ばれた行)などを何かの変数のよう
>な物に入れて、その行を削除する事は可能なのでしょうか?

質問が具体的ではないので、「可能です」とだけコメントさせていただきます。
とえば、こんな感じです。
Range("A1,A3,A5").EntireRow.Delete

【49392】Re:特定の行のみ削除する方法
発言  とっきぃ  - 07/6/3(日) 19:42 -

引用なし
パスワード
   >質問が具体的ではないので、「可能です」とだけコメントさせていただきます。
>とえば、こんな感じです。
>Range("A1,A3,A5").EntireRow.Delete


早い返信ありがとうございます。
自分の説明が分かりづら過ぎてすいませんでした。
今知りたい事を具体的に書くと、教えて頂いた

Range("A1,A3,A5").EntireRow.Delete

の、

"A1,A3,A5"が毎回定かでは無く、変動する場合の表記の仕方が知りたかったのです。

例えば抽出された削除対象の列を配列型の変数に入れて

Range("■変数名■").EntireRow.Delete

などでも大丈夫なのか?と言う事が知りたかったのです。

拙い説明ですが伝わりましたでしょうか…?

【49393】Re:特定の行のみ削除する方法がわかりま...
回答  Hirofumi  - 07/6/3(日) 19:54 -

引用なし
パスワード
   こんな事?

Option Explicit

Public Sub Repetition()

  'データの列数
  Const clngColumns As Long = 5
  '重複を取る列位置(基準セル位置からの列Offset)
  Const clngKey As Long = 0
  
  Dim i As Long
  Dim lngRows As Long
  Dim lngTop As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim lngNumb() As Long
  Dim strProm As String
  
  '画面更新の停止
  Application.ScreenUpdating = False
  
  'データの左上隅を基準とする
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row, clngKey).End(xlUp).Row - .Row + 1
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '復帰用Keyを作成
    ReDim lngNumb(1 To lngRows, 1 To 1)
    For i = 1 To lngRows
      lngNumb(i, 1) = i
    Next i
    '復帰用Keyを出力
    .Offset(, clngColumns).Resize(lngRows).Value = lngNumb()
    'データKeyで整列
    .Resize(lngRows, clngColumns + 1).Sort _
        Key1:=.Offset(, clngKey), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlStroke
    'Keyを配列に取得
    vntData = .Offset(, clngKey).Resize(lngRows + 1).Value
  End With

  '比較元位置を先頭に
  lngTop = 1
  'データ行数分繰り返し
  For i = 2 To lngRows
    'Keyの重複が有るなら
    If vntData(lngTop, 1) = vntData(i, 1) Then
      '削除フラグを立てる
      lngNumb(i, 1) = 1
      '削除数をカウント
      lngCount = lngCount + 1
    Else
      '比較元位置を更新
      lngTop = i
      lngNumb(i, 1) = 0
    End If
  Next i
  
  With rngList
    '削除する行が合った場合
    If lngCount > 0 Then
      '削除フラグの配列を復帰用Key列の右側に出力
      .Offset(, clngColumns + 1).Resize(lngRows).Value = lngNumb
      '削除フラグの列をKeyとして整列
      .Resize(lngRows, clngColumns + 2).Sort _
          Key1:=.Offset(, clngColumns + 1), Order1:=xlAscending, _
          Key2:=.Offset(, clngColumns), Order2:=xlAscending, _
          Header:=xlNo, OrderCustom:=1, _
          MatchCase:=False, Orientation:=xlTopToBottom, _
          SortMethod:=xlStroke
      '行削除
      .Offset(lngRows - lngCount) _
            .Resize(lngCount).EntireRow.Delete
      ''削除フラグの列を削除
      .Offset(, clngColumns).Resize(, 2).EntireColumn.Delete
    Else
      strProm = "重複行が有りません"
      GoTo Wayout
    End If
  End With

  strProm = "処理が完了しました"

Wayout:

  '画面更新の再開
  Application.ScreenUpdating = True

  Set rngList = Nothing

  MsgBox strProm, vbInformation

End Sub

【49394】Re:特定の行のみ削除する方法がわかりま...
発言  とっきぃ  - 07/6/3(日) 20:02 -

引用なし
パスワード
   ▼Hirofumi さん:
>こんな事?
>
>Option Explicit
>
>Public Sub Repetition()
>
>  'データの列数
>  Const clngColumns As Long = 5
>  '重複を取る列位置(基準セル位置からの列Offset)
>  Const clngKey As Long = 0
>  
>  Dim i As Long
>  Dim lngRows As Long
>  Dim lngTop As Long
>  Dim lngCount As Long
>  Dim rngList As Range
>  Dim vntData As Variant
>  Dim lngNumb() As Long
>  Dim strProm As String
>  
>  '画面更新の停止
>  Application.ScreenUpdating = False
>  
>  'データの左上隅を基準とする
>  Set rngList = ActiveSheet.Cells(1, "A")
>  With rngList
>    'データ行数を取得
>    lngRows = .Offset(65536 - .Row, clngKey).End(xlUp).Row - .Row + 1
>    If lngRows <= 1 And .Value = "" Then
>      strProm = "データが有りません"
>      GoTo Wayout
>    End If
>    '復帰用Keyを作成
>    ReDim lngNumb(1 To lngRows, 1 To 1)
>    For i = 1 To lngRows
>      lngNumb(i, 1) = i
>    Next i
>    '復帰用Keyを出力
>    .Offset(, clngColumns).Resize(lngRows).Value = lngNumb()
>    'データKeyで整列
>    .Resize(lngRows, clngColumns + 1).Sort _
>        Key1:=.Offset(, clngKey), Order1:=xlAscending, _
>        Header:=xlNo, OrderCustom:=1, _
>        MatchCase:=False, Orientation:=xlTopToBottom, _
>        SortMethod:=xlStroke
>    'Keyを配列に取得
>    vntData = .Offset(, clngKey).Resize(lngRows + 1).Value
>  End With
>
>  '比較元位置を先頭に
>  lngTop = 1
>  'データ行数分繰り返し
>  For i = 2 To lngRows
>    'Keyの重複が有るなら
>    If vntData(lngTop, 1) = vntData(i, 1) Then
>      '削除フラグを立てる
>      lngNumb(i, 1) = 1
>      '削除数をカウント
>      lngCount = lngCount + 1
>    Else
>      '比較元位置を更新
>      lngTop = i
>      lngNumb(i, 1) = 0
>    End If
>  Next i
>  
>  With rngList
>    '削除する行が合った場合
>    If lngCount > 0 Then
>      '削除フラグの配列を復帰用Key列の右側に出力
>      .Offset(, clngColumns + 1).Resize(lngRows).Value = lngNumb
>      '削除フラグの列をKeyとして整列
>      .Resize(lngRows, clngColumns + 2).Sort _
>          Key1:=.Offset(, clngColumns + 1), Order1:=xlAscending, _
>          Key2:=.Offset(, clngColumns), Order2:=xlAscending, _
>          Header:=xlNo, OrderCustom:=1, _
>          MatchCase:=False, Orientation:=xlTopToBottom, _
>          SortMethod:=xlStroke
>      '行削除
>      .Offset(lngRows - lngCount) _
>            .Resize(lngCount).EntireRow.Delete
>      ''削除フラグの列を削除
>      .Offset(, clngColumns).Resize(, 2).EntireColumn.Delete
>    Else
>      strProm = "重複行が有りません"
>      GoTo Wayout
>    End If
>  End With
>
>  strProm = "処理が完了しました"
>
>Wayout:
>
>  '画面更新の再開
>  Application.ScreenUpdating = True
>
>  Set rngList = Nothing
>
>  MsgBox strProm, vbInformation
>
>End Sub


返信ありがとうございます。

実はまだVBAははじめたばかりで関数等が理解できていない部分があり、このソースでも読めない所が多々あります。

とりあえずこのソースを調べながら解読してみます。

【49395】Re:特定の行のみ削除する方法
発言  かみちゃん  - 07/6/3(日) 21:41 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>"A1,A3,A5"が毎回定かでは無く、変動する場合の表記の仕方が知りたかったのです。
>
>例えば抽出された削除対象の列を配列型の変数に入れて

「VBAははじめたばかり」という割には、考えることが高度すぎませんか?
変動する基準が明らかになれば、もっと簡単に考えられるのですが・・・

たとえば、作業列に数式を設定しておいて、ある特定の値の行だけ削除対象に
するとか・・・(ここの常連のKeinさんがよく使われる手法です)

【49414】Re:特定の行のみ削除する方法
質問  とっきぃ  - 07/6/4(月) 18:49 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>"A1,A3,A5"が毎回定かでは無く、変動する場合の表記の仕方が知りたかったのです。
>>
>>例えば抽出された削除対象の列を配列型の変数に入れて
>
>「VBAははじめたばかり」という割には、考えることが高度すぎませんか?
>変動する基準が明らかになれば、もっと簡単に考えられるのですが・・・
>
>たとえば、作業列に数式を設定しておいて、ある特定の値の行だけ削除対象に
>するとか・・・(ここの常連のKeinさんがよく使われる手法です)


返信が遅れてしまってすいませんでした。

確かに高度なのかな…とも思いましたが、一応C言語の経験はあります。

VBAで出来る事が良く判らないのでここでお聞きしてみました。

自分が今作ろうとしてるプログラムを細かく書くと、

A列・B列・C列にあるデータをA列のデータのみを基準にして重複削除。と言うプログラムです。

自分なりに考えた流れは…

A列をソート

繰り返し文の中で、

If Range("A(i)") = Range("A(i)").Offset(1).Value Then

何かまとめる(配列?)変数=A(i).Offset(1).Value

何かまとめる(配列?)変数の中の行だけを削除

と言う流れを考えていました。

この流れでは無理でしょうか?

【49470】Re:特定の行のみ削除する方法
回答  Hirofumi  - 07/6/5(火) 23:02 -

引用なし
パスワード
   >自分なりに考えた流れは…
>A列をソート
>↓
>繰り返し文の中で、
>If Range("A(i)") = Range("A(i)").Offset(1).Value Then
>何かまとめる(配列?)変数=A(i).Offset(1).Value
>何かまとめる(配列?)変数の中の行だけを削除
>と言う流れを考えていました。
>この流れでは無理でしょうか?

この流れをコードにするとこんなかな?
ただし、Testでは、不連続な削除行数61行を超えるとエラーに成りました

Public Sub Repetition3()

  'データの列数
  '例えば、基準セル位置がA列で、データがC列まで有るなら
  Const clngColumns As Long = 3
  
  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim strDelete As String
  Dim strProm As String
  
  'データの左上隅を基準とする
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データKeyで整列
    .Resize(lngRows, clngColumns).Sort _
        Key1:=.Item(1, 1), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlStroke
  End With

  With rngList
    'データ行数分繰り返し
    For i = 1 To lngRows - 1
      '削除する行が合った場合
      If .Offset(i - 1).Value = .Offset(i).Value Then
        If strDelete <> "" Then
          strDelete = strDelete & ","
        End If
        '削除位置を記録
        strDelete = strDelete & .Offset(i).Address(False, False)
      End If
    Next i
  End With
  
  '行削除
  If strDelete <> "" Then
    rngList.Parent.Range(strDelete).EntireRow.Delete
    strProm = "削除処理が完了しました"
  Else
    strProm = "削除行が有りません"
  End If

Wayout:

  Set rngList = Nothing

  MsgBox strProm, vbInformation

End Sub

Excelは、セル1つづつに対して読み書きを行う作業は、非常に遅く成ります
また、列、行の削除、挿入を遅い作業と成ります
因って、配列を使用した読み書き、連続した範囲の一括削除を心掛けます

一番遅い部類の重複削除(1セルづつ比較して、1行づつ削除)

Public Sub Repetition4()

  'データの列数
  '例えば、基準セル位置がA列で、データがC列まで有るなら
  Const clngColumns As Long = 3
  
  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim strProm As String
  
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データKeyで整列
    .Resize(lngRows, clngColumns).Sort _
        Key1:=.Item(1, 1), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlStroke
  End With

  With rngList
    For i = lngRows - 1 To 1 Step -1
      If .Offset(i - 1).Value = .Offset(i).Value Then
        .Offset(i).EntireRow.Delete
      End If
    Next i
  End With
  
  strProm = "削除処理が完了しました"

Wayout:

  Set rngList = Nothing

  MsgBox strProm, vbInformation

End Sub

速い部類の重複削除

Public Sub Repetition2()

  Const clngColumns As Long = 3

  Const clngKeys As Long = 0
  
  Dim i As Long
  Dim lngRows As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim dicIndex As Object
  Dim lngFlags() As Long
  Dim strProm As String
  
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row, _
          clngKeys).End(xlUp).Row - .Row + 1
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'Keyを配列に取得
    vntData = .Offset(, clngKeys).Resize(lngRows + 1).Value
  End With
  ReDim lngFlags(1 To lngRows, 1 To 1)

  Set dicIndex = CreateObject("Scripting.Dictionary")

  With dicIndex
    For i = 1 To lngRows
      If .Exists(vntData(i, 1)) Then
        lngFlags(i, 1) = 1
        lngCount = lngCount + 1
      Else
        .Add vntData(i, 1), Empty
      End If
    Next i
  End With
  
  Set dicIndex = Nothing

  With rngList
    If lngCount > 0 Then
      .Offset(, clngColumns).Resize(lngRows).Value = lngFlags
      .Resize(lngRows, clngColumns + 1).Sort _
        Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlStroke
      .Offset(lngRows - lngCount) _
            .Resize(lngCount).EntireRow.Delete
      .Offset(, clngColumns).EntireColumn.ClearContents
      strProm = lngCount & "件の削除処理が完了しました"
    Else
      strProm = "重複行が有りません"
    End If
  End With

Wayout:

  Set rngList = Nothing

  MsgBox strProm, vbInformation

End Sub

これが、最悪かも?、COUNTIFは行数が増えると加速度的に遅くなります
また、SpecialCellsは、不連続な削除行が8192を超すと非常に遅く成る等の問題有るようです?
Test環境では、8192を超すと全ての行が削除されました

Public Sub Repetition5()

  Const clngColumns As Long = 3
  
  Dim lngRows As Long
  Dim rngList As Range
  Dim strProm As String
  
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
  End With

  With rngList.Offset(, clngColumns).Resize(lngRows)
    .FormulaR1C1 = "=IF(COUNTIF(R" & rngList.Row _
          & "C" & rngList.Column _
          & ":RC[-" & clngColumns & "],RC[-" _
          & clngColumns & "])>1,"""",""1"")"
    .Value = .Value
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  End With
  rngList.Offset(, clngColumns).EntireColumn.Delete
  
  strProm = "削除処理が完了しました"

Wayout:

  Set rngList = Nothing

  MsgBox strProm, vbInformation

End Sub

【49501】Re:特定の行のみ削除する方法
お礼  とっきぃ  - 07/6/7(木) 12:18 -

引用なし
パスワード
   お答えありがとうございます。

とりあえずある程度の速さで、重複行が多くても大丈夫なように組んでみます。

丁寧な解説ありがとうございました!!

【49517】Re:特定の行のみ削除する方法がわかりま...
質問  とっきぃ  - 07/6/8(金) 14:43 -

引用なし
パスワード
   質問なのですが、

    '復帰用Keyを作成
    ReDim lngNumb(1 To lngRows, 1 To 1)
    For i = 1 To lngRows
      lngNumb(i, 1) = i
    Next i

とありますが、復帰用のkeyとは何なのでしょうか?グーグルなのどで色々と調べたのですがkey自体の意味も判りませんでした。
物凄く基本的な質問だと思いますがお願いします。

【49521】Re:特定の行のみ削除する方法がわかりま...
回答  Hirofumi  - 07/6/8(金) 16:17 -

引用なし
パスワード
   >質問なのですが、
>
>    '復帰用Keyを作成
>    ReDim lngNumb(1 To lngRows, 1 To 1)
>    For i = 1 To lngRows
>      lngNumb(i, 1) = i
>    Next i
>
>とありますが、復帰用のkeyとは何なのでしょうか?グーグルなのどで色々と調べたのですがkey自体の意味も判りませんでした。
>物凄く基本的な質問だと思いますがお願いします。

「復帰用Key」は、書き様が無いので、こう書いて居ます
因って、一般的な用語では有りません?

 この元のコードは、整列が必須条件なので、先頭で整列を行います
 しかし、Listによっては、元の順位を壊したくない物も有ります
 其処で、Listに就いて、先に現在の順位をList外の列に入れて置き、
その順位ごと、整列させ重複削除の処理を行います
 最後に、最初に出力した順位をKeyとして整列し順位を元に戻しています
 ただ、実際のコードでは、重複行をListの後ろに集める為の整列と、
順位を戻す為の整列を一遍に行っています

 また、Listの順位を戻す必要が無い場合、
Listの元々のフィールドで整列できる場合は、
「復帰用Key」出力を行わなくても構いません

【49522】Re:特定の行のみ削除する方法がわかりま...
質問  とっきぃ  - 07/6/8(金) 16:34 -

引用なし
パスワード
   >「復帰用Key」は、書き様が無いので、こう書いて居ます
>因って、一般的な用語では有りません?
>
> この元のコードは、整列が必須条件なので、先頭で整列を行います
> しかし、Listによっては、元の順位を壊したくない物も有ります
> 其処で、Listに就いて、先に現在の順位をList外の列に入れて置き、
>その順位ごと、整列させ重複削除の処理を行います
> 最後に、最初に出力した順位をKeyとして整列し順位を元に戻しています
> ただ、実際のコードでは、重複行をListの後ろに集める為の整列と、
>順位を戻す為の整列を一遍に行っています
>
> また、Listの順位を戻す必要が無い場合、
>Listの元々のフィールドで整列できる場合は、
>「復帰用Key」出力を行わなくても構いません


つまり、本の並びを一時的に別の場所にコピーし、そのコピーした物で重複削除の処理をしていると言う解釈でよろしいのでしょうか?

【49533】Re:特定の行のみ削除する方法がわかりま...
回答  Hirofumi  - 07/6/8(金) 18:28 -

引用なし
パスワード
   >つまり、本の並びを一時的に別の場所にコピーし、
>そのコピーした物で重複削除の処理をしていると言う解釈でよろしいのでしょうか?

「本」?と言うのが解りませんが?
多分、イメージが違うと思います?

例として、処理するListが、A、B、C列の3列として、
重複を比較する列がA列だった場合

  A列  B列  C列
1  2   B   い
2  1   D   あ
3  2   B   い
4  4   A   え
5  4   A   え
6  4   A   え
7  5   G   お
8  3   H   う

1、D列に、先頭行を1としてデータ行分の連番を出力します

  A列  B列  C列  D列
1  2   B   い  1
2  1   D   あ  2
3  2   B   い  3
4  4   A   え  4
5  4   A   え  5
6  4   A   え  6
7  5   G   お  7
8  3   H   う  8

2、A列をKeyとして、A〜D列を昇順整列を行います

  A列  B列  C列  D列
1  1   D   あ   2
2  2   B   い   1
3  2   B   い   3
4  3   H   う   8
5  4   A   え   4
6  4   A   え   5
7  4   A   え   6
8  5   G   お   7

3、データ行数分の2元配列を確保します
 この時、配列の最初の次元が行、次の次元を列とします
 ただ、このコードでは、D列に出力する連番を作成した配列を再利用しています

4、A列(実際には処理速度を上げる為、直接セルを比較するのでは無く、
 事前に配列にA列データを取得しています)を上下で比較して、重複している場合
 lngNumbの配列に1を立て、重複していない場合0を立てます

5、lngNumbの配列をE列に出力します

  A列  B列  C列  D列  E列
1  1   D   あ   2   0
2  2   B   い   1   0
3  2   B   い   3   1
4  3   H   う   8   0
5  4   A   え   4   0
6  4   A   え   5   1
7  4   A   え   6   1
8  5   G   お   7   0

6、A〜E列までを、E列をKey1、D列をKey2として昇順整列を掛け、
 削除行をListの後ろに集め、かつListの順を元に戻します

  A列  B列  C列  D列  E列
1  2   B   い   1   0
2  1   D   あ   2   0
3  4   A   え   4   0
4  5   G   お   7   0
5  3   H   う   8   0
6  2   B   い   3   1
7  4   A   え   5   1
8  4   A   え   6   1

7、Listの後ろに集めた削除行を一括して削除します

  A列  B列  C列  D列  E列
1  2   B   い   1   0
2  1   D   あ   2   0
3  4   A   え   4   0
4  5   G   お   7   0
5  3   H   う   8   0
6
7
8

8、D、E列を削除します

  A列  B列  C列  D列  E列
1  2   B   い
2  1   D   あ
3  4   A   え
4  5   G   お
5  3   H   う
6
7
8

先ず、テスト用のデータを作成して、

  '画面更新の停止
  Application.ScreenUpdating = False

をコメントアウトして、ステップ実行して見れば解ると思いますが?

【49534】Re:特定の行のみ削除する方法がわかりま...
お礼  とっきぃ  - 07/6/8(金) 19:40 -

引用なし
パスワード
   本と言うのは元の返還間違いでした。すいません。

判りやすい説明ありがとうございます。

理解は出来ました!

長々とお付き合い頂き本当にありがとうございました!!

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