Excel VBA質問箱 IV

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

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


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

【72720】重複文字の書き出し Aoichi 12/9/8(土) 12:45 質問[未読]
【72722】Re:重複文字の書き出し UO3 12/9/8(土) 13:44 発言[未読]
【72724】Re:重複文字の書き出し UO3 12/9/8(土) 14:14 発言[未読]
【72725】Re:重複文字の書き出し kanabun 12/9/8(土) 17:08 発言[未読]
【72726】Re:重複文字の書き出し Aoichi 12/9/8(土) 22:41 お礼[未読]
【72727】Re:重複文字の書き出し kanabun 12/9/9(日) 19:56 発言[未読]

【72720】重複文字の書き出し
質問  Aoichi  - 12/9/8(土) 12:45 -

引用なし
パスワード
   以下のようなコードで重複コードを別シートに書き出したのですが
2度同じコードを書きださないようにしたい
作成したマクロでは全て書き出されてしまい
何か良い方法がありましたらご教示お願いします

商品コード
A001
A002
A004
A002
A005
A001
A007
A003
A003
A001

Sub 重複()
  Dim Rng As Range
  Dim i As Long
  Dim cnt As Long
  Dim jyufukulng As Long
  Dim Gyou As Integer
  Dim LastRow As Long
  
  Worksheets("重複Data").Activate
  Set Rng = Range("C4", Range("C65536").End(xlUp))
  Gyou = 4
  LastRow = Cells(65536, 3).End(xlUp).Row
  For i = Cells(65536, 3).End(xlUp).Row To 4 Step -1
    Worksheets("重複Data").Activate
    With Worksheets("重複Data").Range("C4")
       .AutoFilter Field:=1, Criteria1:=Cells(i, 3).Value
       jyufukulng = WorksheetFunction.CountIf(Rng, Cells(i, 3).Value)
       If jyufukulng > 1 Then
        .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets("重複一覧").Range("C" & CStr(Gyou))
         cnt = Worksheets("重複Data").UsedRange.Rows.Count
        .AutoFilter
       End If
    End With
    Worksheets("重複一覧").Activate
    Gyou = Cells(65536, 3).End(xlUp).Row + 2
  Next i
  For i = 1 To 4
    Worksheets("重複一覧").Columns(i).ColumnWidth = Worksheets("重複Data").Columns(i).ColumnWidth
  Next i
  Worksheets("重複一覧").Activate
End Sub

【72722】Re:重複文字の書き出し
発言  UO3  - 12/9/8(土) 13:44 -

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

シートレイアウトはコードから想像していますので誤解ある可能性はあります。
また、転記レイアウトもよくわかりませんでしたので、以下のコードでは
転記先のC3以下に表示しています。

Sub 重複2()
  Dim x As Long
  Dim myA As Range
  Dim myW As Range
  Dim dupV() As String
  Dim k As Long
  Dim c As Range
  
  With Sheets("重複data")
    '現在の使用領域の外側に作業域を
    x = .UsedRange.Cells(.UsedRange.Cells.Count).Column + 2
    '現在のリスト領域
    Set myA = .Range("C3", .Range("C" & .Rows.Count).End(xlUp))
    '現在のリストからフィルターオプションで重複を排除した一覧を作成
    myA.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Cells(1, x), Unique:=True
    '重複を排除した領域(タイトルを除く)
    With .Cells(1, x).CurrentRegion
      Set myW = .Offset(1).Resize(.Rows.Count - 1)
    End With
  End With
  
  ReDim dupV(1 To myW.Rows.Count, 1 To 1)   '重複リスト用配列
  
  For Each c In myW
    If WorksheetFunction.CountIf(myA, c.Value) > 1 Then
      k = k + 1
      dupV(k, 1) = c.Value
    End If
  Next
  
  If k = 0 Then
    MsgBox "重複のデータはありませんでした"
  Else
  
    With Sheets("重複一覧")
      .Range("C3:C" & .Rows.Count).ClearContents
      .Range("C3").Value = "重複データ"
      .Range("C4").Resize(k).Value = dupV
      .Select
    End With
    
    MsgBox "重複データをピックアップしました"
    
  End If
  
End Sub

【72724】Re:重複文字の書き出し
発言  UO3  - 12/9/8(土) 14:14 -

引用なし
パスワード
  
作業域の後始末を忘れていました。

  If k = 0 Then
    MsgBox "重複のデータはありませんでした"
  Else

この上に

  myW.CurrentRegion.Clear

これを追加です。

【72725】Re:重複文字の書き出し
発言  kanabun  - 12/9/8(土) 17:08 -

引用なし
パスワード
   ▼Aoichi さん:
おじゃまします

>重複コードを別シートに書き出した

Dictionaryオブジェクトを使って「商品コード」の出現回数をカウントし、
1回だけのものはDictionaryから削除して、重複アイテムをリストしました。

Sub Try1()
  Dim i As Long
  Dim v As Variant
  Dim dic As Object
  
  Set dic = CreateObject("Scripting.Dictionary")
  With Worksheets("重複Data")
    v = .Range("C4", .Cells(.Rows.Count, 3).End(xlUp)).Value2
  End With
  For i = 1 To UBound(v)     '商品コードをDictionaryに登録
    dic(v(i, 1)) = dic(v(i, 1)) + 1  '出現回数カウント
  Next
  For Each v In dic.Keys()
    Debug.Print v, dic(v)
    If dic(v) < 2 Then dic.Remove v '「重複なし」なら削除
  Next
  With Worksheets("重複一覧")
    .[C3].Value = "重複一覧"
    .[C4].Resize(dic.Count).Value2 = _
        Application.Transpose(dic.Keys)
  End With
End Sub

【72726】Re:重複文字の書き出し
お礼  Aoichi  - 12/9/8(土) 22:41 -

引用なし
パスワード
   ▼kanabun さん UO3 さん
ご両人の丁寧な解答ありがとうございました
早速自分なりにトライしてみます
また、不明な点が出ましたら
よろしくお願いいたします

【72727】Re:重複文字の書き出し
発言  kanabun  - 12/9/9(日) 19:56 -

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

Dictionaryを使うのは Try1といっしょですが、
今度は Dictionaryを2つ用意して、1回のLoopのなかで
重複して出てきたアイテムだけを dic2 に格納するように
してみました。

Sub Try2()
  Dim i As Long
  Dim v As Variant
  Dim dic As Object
  Dim dic2 As Object '重複アイテムを格納する
 
  Set dic = CreateObject("Scripting.Dictionary")
  Set dic2 = CreateObject("Scripting.Dictionary")
  With Worksheets("重複Data")
    v = .Range("C4", .Cells(.Rows.Count, 3).End(xlUp)).Value2
  End With
  For i = 1 To UBound(v)     '商品コードをDictionaryに登録
    If Not dic.Exists(v(i, 1)) Then
      dic(v(i, 1)) = Empty
    ElseIf Not dic2.Exists(v(i, 1)) Then
      dic2(v(i, 1)) = Empty
    End If
  Next
  With Worksheets("重複一覧")
    .[C3].Value = "重複一覧"
    .[C4].Resize(dic2.Count).Value2 = _
           Application.Transpose(dic2.Keys)
  End With
End Sub

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