Excel VBA質問箱 IV

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

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


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

【20931】重複データについて 初心者 04/12/26(日) 2:37 質問[未読]
【20932】Re:重複データについて Hirofumi 04/12/26(日) 6:59 回答[未読]
【20933】Re:重複データについて Hirofumi 04/12/26(日) 8:01 回答[未読]
【20945】Re:重複データについて 初心者 04/12/27(月) 14:49 お礼[未読]
【20934】Re:重複データについて [名前なし] 04/12/26(日) 12:08 回答[未読]
【20936】Re:重複データについて [名前なし] 04/12/26(日) 15:40 発言[未読]

【20931】重複データについて
質問  初心者  - 04/12/26(日) 2:37 -

引用なし
パスワード
   いつも参考にさせて頂いています。

A列に部品番号が500行ほどあります。重複をチェックするために、EXCELの条件付書式でcountAが2以上になる場合文字色を赤に変えるように設定しました。
その後マクロでL列にA列の文字色が赤なら"1"を立てたいと思い以下の文を書きましたがうまくいきません。条件付書式の書式はVBAでは認識しないようでマニュアルで赤色にした文字の場合はちゃんと"1"が立ちます。A列の重複もマクロで文字色を変えれば良いと思うのですがそこまで知識がありません。ご指導よろしくお願いします。

Sub 重複チェック()
Dim i As Integer
Dim a As Integer

i = Range(Cells(2, 1), Cells(65536, 1).End(xlUp)).Rows.Count
For a = 2 To i

Cells(a, 12).Select
If Cells(a, 12).Offset(, -11).Font.ColorIndex = 3 Then
Cells(a, 12).Value = "1"
Else
End If

Next a

End Sub

【20932】Re:重複データについて
回答  Hirofumi  - 04/12/26(日) 6:59 -

引用なし
パスワード
   重複の2つ目以降に色を替え、Flagを立てれば善いのですね?

Option Explicit

Public Sub Repeated()

  '変更するパレット番号
  Const clngColor As Long = 3
  'Flagを立てる列(Offset値)
  Const clngCol As Long = 11
  
  Dim i As Long
  Dim dicIndex As Object
  Dim vntData As Variant
  Dim rngList As Range
  Dim lngRows As Long
  
  Application.ScreenUpdating = False
  
  'List先頭セルを設定
  Set rngList = ActiveSheet.Cells(2, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データを配列に読み込み
    vntData = .Resize(lngRows).Value
  End With
  
  'Dictionaryオブジェクトのインスタンスを作成
  Set dicIndex = CreateObject("Scripting.Dictionary")
  
  With dicIndex
    'データの先頭から最終まで繰り返し
    For i = 1 To lngRows
      'データが""で無い場合
      If vntData(i, 1) <> "" Then
        'インデックスにデータが有る場合(重複の場合)
        If .Exists(vntData(i, 1)) Then
          '重複行位置に就いて
          With rngList.Offset(i - 1)
            '重複行位置をパレット番号の色にする
            .Interior.ColorIndex = clngColor
            'L列に1を立てる
            .Offset(, clngCol).Value = 1
          End With
        Else
          'インデクスにKeyと行位置を追加
          .Add vntData(i, 1), i
        End If
      End If
    Next i
  End With
  
  Set dicIndex = Nothing
  Set rngList = Nothing
  
  Application.ScreenUpdating = True
  
  Beep
  MsgBox "処理が完了しました"
  
End Sub

【20933】Re:重複データについて
回答  Hirofumi  - 04/12/26(日) 8:01 -

引用なし
パスワード
   色を替えるのは、Fontの方だったんですね?
以下を修正して下さい

            '重複行位置をパレット番号の色にする
'            .Interior.ColorIndex = clngColor
            .Font.ColorIndex = clngColor

【20934】Re:重複データについて
回答  [名前なし]  - 04/12/26(日) 12:08 -

引用なし
パスワード
   ▼初心者 さん:
>A列に部品番号が500行ほどあります。重複をチェックするために、EXCELの条件付書式でcountAが2以上になる場合文字色を赤に変えるように設定しました。

CountIfじゃないんでしょうか?

>その後マクロでL列にA列の文字色が赤なら"1"を立てたいと思い以下の文を書きましたが

文字色でチェックしないで、CountIfの結果でチェックしたほうがいいんじゃないでしょうか。
以下の通りに修正してみてください。

>Sub 重複チェック()
Dim i As Long
Dim a As Long
Dim ItemCount As Long
>
  i = Cells(65536, 1).End(xlUp).Row
>For a = 2 To i
>
    ItemCount = Application.CountIf(Range(Cells(2, 1), Cells(a, 1)), Cells(a, 1).Value)
    Cells(a, 12).Value = IIf(ItemCount > 1, "1", "")
>
>Next a
>
>End Sub

直接L列に数式( =IF(COUNTIF(A$2:A2)>1,1,0) )を入れてもいいと思いますけど。

【20936】Re:重複データについて
発言  [名前なし]  - 04/12/26(日) 15:40 -

引用なし
パスワード
   >直接L列に数式( =IF(COUNTIF(A$2:A2)>1,1,0) )を入れてもいいと思いますけど。
あら、数式間違えてた・・・。

=IF(COUNTIF(A$2:A2,A2)>1,1,0)

ですね。

【20945】Re:重複データについて
お礼  初心者  - 04/12/27(月) 14:49 -

引用なし
パスワード
   皆様 ご指導ありがとうございます。
countAではなくcountIFでした。
両方ともちゃんと動作いたしました。
親切に対応して頂いて感激です。

▼Hirofumi さん:
>重複の2つ目以降に色を替え、Flagを立てれば善いのですね?
>
>Option Explicit
>
>Public Sub Repeated()
>
>  '変更するパレット番号
>  Const clngColor As Long = 3
>  'Flagを立てる列(Offset値)
>  Const clngCol As Long = 11
>  
>  Dim i As Long
>  Dim dicIndex As Object
>  Dim vntData As Variant
>  Dim rngList As Range
>  Dim lngRows As Long
>  
>  Application.ScreenUpdating = False
>  
>  'List先頭セルを設定
>  Set rngList = ActiveSheet.Cells(2, "A")
>  With rngList
>    'データ行数を取得
>    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
>    'データを配列に読み込み
>    vntData = .Resize(lngRows).Value
>  End With
>  
>  'Dictionaryオブジェクトのインスタンスを作成
>  Set dicIndex = CreateObject("Scripting.Dictionary")
>  
>  With dicIndex
>    'データの先頭から最終まで繰り返し
>    For i = 1 To lngRows
>      'データが""で無い場合
>      If vntData(i, 1) <> "" Then
>        'インデックスにデータが有る場合(重複の場合)
>        If .Exists(vntData(i, 1)) Then
>          '重複行位置に就いて
>          With rngList.Offset(i - 1)
>            '重複行位置をパレット番号の色にする
>            .Interior.ColorIndex = clngColor
>            'L列に1を立てる
>            .Offset(, clngCol).Value = 1
>          End With
>        Else
>          'インデクスにKeyと行位置を追加
>          .Add vntData(i, 1), i
>        End If
>      End If
>    Next i
>  End With
>  
>  Set dicIndex = Nothing
>  Set rngList = Nothing
>  
>  Application.ScreenUpdating = True
>  
>  Beep
>  MsgBox "処理が完了しました"
>  
>End Sub

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