Excel VBA質問箱 IV

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

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


9167 / 13644 ツリー ←次へ | 前へ→

【28949】日々のデータを1件だけ残して、それ以外... haru 05/9/19(月) 14:10 質問[未読]
【28950】Re:日々のデータを1件だけ残して、それ以外... Statis 05/9/19(月) 14:22 回答[未読]
【28951】Re:日々のデータを1件だけ残して、それ以外... haru 05/9/19(月) 14:28 質問[未読]
【28953】Re:日々のデータを1件だけ残して、それ以外... Statis 05/9/19(月) 15:45 回答[未読]
【28985】Re:日々のデータを1件だけ残して、それ以外... haru 05/9/20(火) 13:32 お礼[未読]
【28955】Re:日々のデータを1件だけ残して、それ以外... Hirofumi 05/9/19(月) 16:15 回答[未読]
【28986】Re:日々のデータを1件だけ残して、それ以外... haru 05/9/20(火) 13:33 お礼[未読]

【28949】日々のデータを1件だけ残して、それ以外...
質問  haru  - 05/9/19(月) 14:10 -

引用なし
パスワード
    1列目に日付、14列目に不良率が入っています。その間の列は別
のデータで埋まっています。
 上記データを日付の降順>不良率の昇順でソートしました。
 各日付の最初のデータ(毎日の不良率の最大値)のみを抽出した
いのですが、何か良い方法があれば、教えていただければ、と思い
ます。
 ソートの降順、昇順は上記データが抜きで出せれば、どちらでも
構いません。
 1日のデータは、約100件位あります。できれば、まとめて行削除
したいのですが。
 よろしくお願いします。

【28950】Re:日々のデータを1件だけ残して、それ以...
回答  Statis  - 05/9/19(月) 14:22 -

引用なし
パスワード
   こんにちは


>各日付の最初のデータ(毎日の不良率の最大値)のみを抽出した
各日付とは、1日、約100件のデータでいくつもの日付があるのかな?
としたら、日付ごとの最大値の行を残すのかな?
また、最大値に該当する行が複数あった場合はどうしますか?

【28951】Re:日々のデータを1件だけ残して、それ以...
質問  haru  - 05/9/19(月) 14:28 -

引用なし
パスワード
   ▼Statis さん:こんにちは

>>各日付の最初のデータ(毎日の不良率の最大値)のみを抽出した
>各日付とは、1日、約100件のデータでいくつもの日付があるのかな?
 はい、そうです。

>としたら、日付ごとの最大値の行を残すのかな?
 はい、そうです。

>また、最大値に該当する行が複数あった場合はどうしますか?
 まず、そういうことはありません。
 万が一あったら、その中のどれか1件残せれば、それで構いません。
 よろしくお願いします。

【28953】Re:日々のデータを1件だけ残して、それ以...
回答  Statis  - 05/9/19(月) 15:45 -

引用なし
パスワード
   こんにちは
>まず、そういうことはありません。
と考えて
お試しを(Errの処理はしていません)
該当シートを「Sheet1」としています。

Sub Test()
Dim R As Range, C As Range, Ro As Long
Ro = 2
Application.ScreenUpdating = False
With Worksheets("Sheet1")
  .Range("A1").Sort Key1:=.Range("A2"), Order1:=xlAscending, Key3:=.Range("N2") _
    , Order3:=xlAscending, Header:=xlGuess
   .Range("A1").Subtotal GroupBy:=1, Function:=xlMax, TotalList:=Array(14), _
    Replace:=True, PageBreaks:=False, SummaryBelowData:=True
   Set R = .Range("M2:M" & .Range("N65536").End(xlUp).Row - 1).SpecialCells(xlCellTypeBlanks)
   For Each C In R
     .Cells(Ro, 15).Resize(C.Row - Ro).Formula = _
     "=IF(" & C.Offset(, 1).Address & "=" & "N" & Ro & ","""",1)"
     .Cells(Ro, 15).Resize(C.Row - Ro).Value = .Cells(Ro, 15).Resize(C.Row - Ro).Value
     Ro = C.Row + 1
   Next C
   .Columns(15).SpecialCells(xlCellTypeConstants).EntireRow.Delete
   .Range("A1").RemoveSubtotal
   Set R = Nothing
End With
Application.ScreenUpdating = True
End Sub

【28955】Re:日々のデータを1件だけ残して、それ以...
回答  Hirofumi  - 05/9/19(月) 16:15 -

引用なし
パスワード
   こんなかな?
ActiveSheetの該当条件データ行を削除しますので
必ずBuckUpを取ってから試して下さい

Option Explicit

Public Sub RowsDelete()

  'Listの列数
  Const clngColumns As Long = 14
  '日付の有る列位置(Listの左端からの列Offset値)
  Const clngDate As Long = 0
  '不良率の有る列位置(Listの左端からの列Offset値)
  Const clngReject As Long = 13
  
  Dim i As Long
  Dim rngList As Range
  Dim lngResult() As Long
  Dim lngRows As Long
  Dim lngCount As Long
  Dim vntDate As Variant
  Dim strProm As String
  
  'Listの左上隅を基準とする(列見出しがある物とします)
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row
    If lngRows <= 1 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'Listを日付降順の不良率降順に整列
    .Offset(1).Resize(lngRows, clngColumns).Sort _
        Key1:=.Offset(1, clngDate), Order1:=xlDescending, _
        Key2:=.Offset(1, clngReject), Order2:=xlDescending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlStroke
    '日付を配列に取得
    vntDate = .Offset(1, clngDate).Resize(lngRows).Value
  End With
  
  '整列Key用配列を確保
  ReDim lngResult(1 To lngRows, 1 To 1)
  lngCount = 1
  For i = 2 To lngRows
    '日付が違ったら、整列Key用配列に1を代入
    If vntDate(i - 1, 1) = vntDate(i, 1) Then
      lngResult(i, 1) = 1
    Else
      lngCount = lngCount + 1
    End If
  Next i
  
  Application.ScreenUpdating = False
  
  With rngList
    .EntireColumn.Insert
    .Offset(1, -1).Resize(lngRows).Value = lngResult
    'Listを整列Key昇順に整列
    .Offset(1, -1).Resize(lngRows, clngColumns + 1).Sort _
        Key1:=.Offset(1, -1), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlStroke
    '必要外の行削除
    .Offset(lngCount + 1).Resize(lngRows - lngCount).EntireRow.Delete
    .Offset(1, -1).EntireColumn.Delete
  End With
  
  Application.ScreenUpdating = True
  
  strProm = "処理が完了しました"
  
Wayout:

  Set rngList = Nothing
  
  Beep
  MsgBox strProm
  
End Sub

【28985】Re:日々のデータを1件だけ残して、それ以...
お礼  haru  - 05/9/20(火) 13:32 -

引用なし
パスワード
   ▼Statis さん:こんにちは
 ありがとうございます。
 うまくいきました。

【28986】Re:日々のデータを1件だけ残して、それ以...
お礼  haru  - 05/9/20(火) 13:33 -

引用なし
パスワード
   ▼Hirofumi さん:こんにちは
 ありがとうございます。
 うまくいきました。

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