Excel VBA質問箱 IV

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

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


8279 / 13646 ツリー ←次へ | 前へ→

【34183】重複しているデータだけ残したい まろにゃ 06/1/27(金) 21:50 質問[未読]
【34184】Re:重複しているデータだけ残したい kobasan 06/1/27(金) 22:13 回答[未読]
【34185】Re:重複しているデータだけ残したい ponpon 06/1/27(金) 22:29 発言[未読]
【34195】Re:重複しているデータだけ残したい ichinose 06/1/28(土) 11:06 発言[未読]
【34198】Re:重複しているデータだけ残したい まろにゃ 06/1/28(土) 15:26 質問[未読]
【34200】Re:重複しているデータだけ残したい ponpon 06/1/28(土) 18:30 発言[未読]
【34208】Re:重複しているデータだけ残したい kobasan 06/1/28(土) 20:32 発言[未読]
【34209】Re:重複しているデータだけ残したい ponpon 06/1/28(土) 20:45 お礼[未読]
【34241】Re:重複しているデータだけ残したい まろにゃ 06/1/29(日) 17:33 お礼[未読]

【34183】重複しているデータだけ残したい
質問  まろにゃ  - 06/1/27(金) 21:50 -

引用なし
パスワード
   すみません、質問です。

A列に以下のように住所が入力されています。

A1.東京都埼玉区1-1-1
A2.東京都埼玉区1-1-2
A3.東京都埼玉区1-1-2
A4.東京都埼玉区1-1-2
A5.東京都埼玉区1-1-2
A6.東京都埼玉区1-1-3
A7.東京都埼玉区1-1-3
A8.東京都埼玉区1-1-4

上から順に検索をかけ、重複しているデータを残し、していないデータを(これで言えばA1とA8)の行ごとで削除したいのですが、どのようにすれば良いでしょうか。

【34184】Re:重複しているデータだけ残したい
回答  kobasan  - 06/1/27(金) 22:13 -

引用なし
パスワード
   ▼まろにゃ さん今晩は。

これでできます。

Sub test()
Dim rng As Range, r As Range, urng As Range
  Set rng = Range("A1", Range("A65536").End(xlUp))
  For Each r In rng
    If Application.CountIf(rng, r.Value) = 1 Then
      If urng Is Nothing Then
        Set urng = r
      Else
        Set urng = Union(r, urng)
      End If
    End If
  Next
  urng.EntireRow.Delete
  Set urng = Nothing
  Set rng = Nothing
End Sub

>
>A列に以下のように住所が入力されています。
>
>A1.東京都埼玉区1-1-1
>A2.東京都埼玉区1-1-2
>A3.東京都埼玉区1-1-2
>A4.東京都埼玉区1-1-2
>A5.東京都埼玉区1-1-2
>A6.東京都埼玉区1-1-3
>A7.東京都埼玉区1-1-3
>A8.東京都埼玉区1-1-4
>
>上から順に検索をかけ、重複しているデータを残し、していないデータを(これで言えばA1とA8)の行ごとで削除したいのですが、どのようにすれば良いでしょうか。

【34185】Re:重複しているデータだけ残したい
発言  ponpon  - 06/1/27(金) 22:29 -

引用なし
パスワード
   こんばんは。
こんなんではどうでしょう?

Sub test1()
  Dim myR As Range
  
  Set myR = Range("A1", Range("A65536").End(xlUp))
    With myR.Offset(, 26)
      .Value = "=IF(COUNTIF(" & myR.Address & ",A1)>1,"""",1)"
      On Error Resume Next
      .SpecialCells(xlCellTypeFormulas, xlNumbers).EntireRow.Delete
      If Err.Number <> 0 Then
       MsgBox "重複セルはありません"
       Err.Clear
      End If
      On Error GoTo 0
      .ClearContents
    End With
   Set myR = Nothing

End Sub

【34195】Re:重複しているデータだけ残したい
発言  ichinose  - 06/1/28(土) 11:06 -

引用なし
パスワード
   おはようございます。
既に正解投稿がありますので
参考程度に試してみて下さい。
'===================================================
Sub main()
  Dim rng As Range
  Dim radd As String
  Dim ans As Variant
  Set rng = Range("A1", Range("A65536").End(xlUp))
  If rng.Count > 1 Then
    radd = rng.Address
    ans = Join(Filter(Evaluate("=transpose(IF(COUNTIF(" & _
              radd & "," & radd & ")=1,ROW(" & _
              radd & ")&"":""&ROW(" & radd & "),""NG""))") _
          , "NG", False), ",")
    '仮にデータがセルA1:A8に入っていた場合は↓の式を評価します
    '  =Transpose(IF(COUNTIF($A$1:$A$8,$A$1:$A$8)=1, _
             ROW($A$1:$A$8)&":"&ROW($A$1:$A$8), _
             "NG"))
  Else
    ans = rng.Address
    End If
  If ans <> "" Then
    Range(ans).Delete
    End If
End Sub

【34198】Re:重複しているデータだけ残したい
質問  まろにゃ  - 06/1/28(土) 15:26 -

引用なし
パスワード
   kobasanさん、 ponponさん、ichinoseさん
ありがとうございました。
うまく行きました。

たいへん心苦しいのですが、もう一つ良いでしょうか?

前回の質問と同じく、まず重複しているデータのみを残します。
次に重複しているデータの件数と、B列の合計を出します。
最後に重複しているデータを一行のみ残し、住所 件数 合計値 になるようにします。
※最後に残す行は、どれでもかまいません。

ちなみに私はVBAにチャレンジしたのですが、結局習得できませんでした。
まず単語の読み方が分からなくて・・・・・。
読み方がカタカナで書かれているサイトなどありましたら、教えていただけると助かります。

元々のデータ

   A列       B列    
東京都埼玉区1-1-1  1500
東京都埼玉区1-1-2   500
東京都埼玉区1-1-2  1000
東京都埼玉区1-1-2  1000
東京都埼玉区1-1-2  1500
東京都埼玉区1-1-3  1000
東京都埼玉区1-1-3  2000
東京都埼玉区1-1-4  1000

第2段階

   A列       B列  C列   D列
東京都埼玉区1-1-2   500   4件  1500
東京都埼玉区1-1-2  1000
東京都埼玉区1-1-2  1000
東京都埼玉区1-1-2  1500
東京都埼玉区1-1-3  1000   2件  3000
東京都埼玉区1-1-3  2000

最終段階
   A列      B列   C列
東京都埼玉区1-1-2  4件  1500
東京都埼玉区1-1-3  2件  3000

【34200】Re:重複しているデータだけ残したい
発言  ponpon  - 06/1/28(土) 18:30 -

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

覚え立てのDictionaryを使って、合計までは出せたのですが、
件数をどこで取得したらいいかわかりません。情けない。
識者の回答をお待ちください。

Sub test2()
  Dim myR As Range
  Dim myVAl As Variant
  Dim myDic As Object
  Dim myKey As Variant
  Dim i As Long
  
  With Worksheets("Sheet1")
    Set myR = .Range("A1", .Range("A65536").End(xlUp))
    With myR.Offset(, 26)
     .Value = "=IF(COUNTIF(" & myR.Address & ",A1)>1,"""",1)"
     On Error Resume Next
     .SpecialCells(xlCellTypeFormulas, xlNumbers).EntireRow.Delete
     If Err.Number <> 0 Then
       MsgBox "重複セルはありません"
       Err.Clear
     End If
     On Error GoTo 0
     .ClearContents
    End With
    myVAl = myR.Resize(, 2).Value
    Set myDic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(myVAl, 1)
     myKey = myVAl(i, 1)
     myDic.Item(myKey) = myDic.Item(myKey) + myVAl(i, 2)
    Next
'  End With          'Sheet2に書き出す場合
'  With Worksheets("Sheet2") 'Sheet2に書き出す場合
   .Cells.ClearContents
   With .Range("A1").Resize(myDic.Count)
      .Value = Application.Transpose(myDic.Keys())
      .Offset(, 1).Value = Application.Transpose(myDic.Items())
   End With
  End With
  
   Set myR = Nothing
   Set myDic = Nothing
  
End Sub

【34208】Re:重複しているデータだけ残したい
発言  kobasan  - 06/1/28(土) 20:32 -

引用なし
パスワード
   皆さん今晩は。
識者ではないですが。

>合計までは出せたのですが、
>件数をどこで取得したらいいかわかりません。

ということなので、ponpon さんの利用させてもらいました。
つづきとして、見てください。

>Sub test2()
>  Dim myR As Range
>  Dim myVAl As Variant
>  Dim myDic As Object
>  Dim myKey As Variant
>  Dim i As Long
>  
>  With Worksheets("Sheet1")
>    Set myR = .Range("A1", .Range("A65536").End(xlUp))
>    With myR.Offset(, 26)
>     .Value = "=IF(COUNTIF(" & myR.Address & ",A1)>1,"""",1)"
>     On Error Resume Next
>     .SpecialCells(xlCellTypeFormulas, xlNumbers).EntireRow.Delete
>     If Err.Number <> 0 Then
>       MsgBox "重複セルはありません"
>       Err.Clear
>     End If
>     On Error GoTo 0
>     .ClearContents
>    End With

    Dim arry
    myVAl = myR.Resize(, 2).Value
    Set myDic = CreateObject("Scripting.Dictionary")
    '
    For i = 1 To UBound(myVAl, 1)
      myKey = myVAl(i, 1)
      myDic.Item(myKey) = Array(0, 0)
    Next
    '
    For i = 1 To UBound(myVAl, 1)
      myKey = myVAl(i, 1)
      arry = myDic.Item(myKey)
      arry(0) = arry(0) + 1
      arry(1) = arry(1) + myVAl(i, 2)
      myDic.Item(myKey) = arry
    Next
  End With          'Sheet2に書き出す場合
  With Worksheets("Sheet2") 'Sheet2に書き出す場合
    .Cells.ClearContents
    With .Range("A1").Resize(myDic.Count)
      .Value = Application.Transpose(myDic.Keys())
      .Offset(, 1).Resize(, 2).Value = Application.Transpose(Application.Transpose(myDic.Items))
    End With
  End With
 
  Set myR = Nothing
  Set myDic = Nothing
 
End Sub

【34209】Re:重複しているデータだけ残したい
お礼  ponpon  - 06/1/28(土) 20:45 -

引用なし
パスワード
   kobasanさん。こんばんは。

同じものがある度にカウントアップすればよいことまでは
気づき、それを配列に入れて処理しようと努力はしたのですが・・・
この間、ichinoseさんに教えていただいたばかりなのに・・・
いろいろとDictionaryを使ってやってはいるのですが・・・くやしい!!

フォローありがとうございました。

【34241】Re:重複しているデータだけ残したい
お礼  まろにゃ  - 06/1/29(日) 17:33 -

引用なし
パスワード
   皆さん、本当にありがとうございました。
助かりました!。

私も頑張って勉強しますw。

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