Excel VBA質問箱 IV

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

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


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

【71660】重複データの除去 レッズ命 12/3/24(土) 22:33 質問[未読]
【71661】Re:重複データの除去 Hirofumi 12/3/24(土) 23:09 発言[未読]
【71662】Re:重複データの除去 レッズ命 12/3/24(土) 23:32 発言[未読]
【71663】Re:重複データの除去 みそじのおじさん 12/3/25(日) 8:23 発言[未読]
【71664】Re:重複データの除去 Hirofumi 12/3/25(日) 9:04 発言[未読]
【71665】Re:重複データの除去 レッズ命 12/3/25(日) 14:10 お礼[未読]

【71660】重複データの除去
質問  レッズ命  - 12/3/24(土) 22:33 -

引用なし
パスワード
   またまた質問させていただきます。

あるシートのC列に日付が重複してあります。
それを重複を除去してコンボボックスに加えています。
が、『このキーは既にこのコレクションの要素に割り当てられています』という
エラーが出ます。

何が問題あるのか教えてください。エクセル2007です。
自分的にここがひっかかっているんではないかということをあげます。
1.J列にも同じような日付の縦列があります。
2.UserForm1とUserForm2があり、ほぼ同じマクロとなっています。
 UserForm1はC列をコンボボックスに加えています。
 UserForm2はJ列をコンボボックスに加えています。

UserForm1の中
Private Sub UserForm_Initialize()

With Worksheets("対戦表")
 Set セル範囲 = .Range(.Range("C2"), .Range("C65536").End(xlUp))
End With

For Each 各セル In セル範囲
 On Error Resume Next
 リスト.Add 各セル.Value, CStr(各セル.Value)
 If Err.Number = 0 Then
  Cmb開催日.AddItem Format(各セル.Value, "m/d")
 End If
 On Error GoTo 0
Next

Cmb開催日.ListIndex = 0
Cmb開催日.ColumnWidths = Cmb開催日.Width - 3

End Sub

【71661】Re:重複データの除去
発言  Hirofumi  - 12/3/24(土) 23:09 -

引用なし
パスワード
   これ、コレクションを使って重複取りを行っているのですか?
また、ComboBoxに登録する日付の総数は沢山在るのですか?(いくつぐらいですか?)

以前、ComboBoxのListを降順に登録するコードを提示したと思いますが?
あのコードは、降順に並べるだけで無く、重複も取っていた筈ですが
遅くて使い物に成りませんか?

【71662】Re:重複データの除去
発言  レッズ命  - 12/3/24(土) 23:32 -

引用なし
パスワード
   ▼Hirofumi さん:
>これ、コレクションを使って重複取りを行っているのですか?
>また、ComboBoxに登録する日付の総数は沢山在るのですか?(いくつぐらいですか?)

Dim リスト As New Collection
Dim セル範囲 As Range
Dim 各セル As Range
を使用しています。
数は50近くあります。
重複もたくさんあるので、行数的に420行ほどあります。
>
>以前、ComboBoxのListを降順に登録するコードを提示したと思いますが?
>あのコードは、降順に並べるだけで無く、重複も取っていた筈ですが
>遅くて使い物に成りませんか?

以前に教えてもらってものが使えますね。
ありがとうございます。
でも私が提示したものはなぜにだめなのでしょうか?
そこのところも教えていただけるとありがたいです。

With Sheets("対戦表").Columns("C")
Set c = .Find(What:="*/*", lookat:=xlPart)
If Not c Is Nothing Then
 fAddress = c.Address
 Do
  vntDate = c.Value
  For i = 0 To Cmb開催日.ListCount - 1
   If Format(vntDate, "mmdd") <= Format(CDate(Cmb開催日.List(i, 0)), "mmdd") Then
   Exit For
   End If
  Next i
  If i <= Cmb開催日.ListCount - 1 Then
   If Format(vntDate, "m/d") <> Cmb開催日.List(i, 0) Then
   Cmb開催日.AddItem Format(vntDate, "m/d"), i
   End If
  Else
   Cmb開催日.AddItem Format(vntDate, "m/d")
  End If
  Set c = .FindNext(c)
  If c.Address = fAddress Then Exit Do
 Loop
End If
End With

【71663】Re:重複データの除去
発言  みそじのおじさん  - 12/3/25(日) 8:23 -

引用なし
パスワード
   おはようございます。

nさんより
>エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください。

とありましたので、いじられていますよね。
今は「エラー発生時に中断」になっていませんか?

この設定はOn ErrorをかましていてもErrorが発生するとその場所で
止まる様になっています。

開発中にエラーの発生元を突き止めたくて、エラートラップの設定を
変えても発生元の修正が終わったら「エラー処理対象外のエラーで中断」
にしておく事をお勧めします。

戻し忘れると今回のような、On Errorが期待道理に動かなくなります。

はずしていたら、すみません^^

【71664】Re:重複データの除去
発言  Hirofumi  - 12/3/25(日) 9:04 -

引用なし
パスワード
   ▼みそじのおじさん さん:
>おはようございます。
>
>nさんより
>>エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください。
>
>とありましたので、いじられていますよね。
>今は「エラー発生時に中断」になっていませんか?
>
>この設定はOn ErrorをかましていてもErrorが発生するとその場所で
>止まる様になっています。
>
>開発中にエラーの発生元を突き止めたくて、エラートラップの設定を
>変えても発生元の修正が終わったら「エラー処理対象外のエラーで中断」
>にしておく事をお勧めします。
>
>戻し忘れると今回のような、On Errorが期待道理に動かなくなります。
>
>はずしていたら、すみません^^

みそじのおじさん さんの言われている事が正解そうですね?

Collectionは、同一のKeyが登録されるとエラーに成りますので
この、エラーを検出して重複取りを行っていると思います

因って、エラートラップの設定が合っていない様に、私も思います

【71665】Re:重複データの除去
お礼  レッズ命  - 12/3/25(日) 14:10 -

引用なし
パスワード
   ▼みそじのおじさん さん:
▼Hirofumi さん:

>nさんより
>>エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください。
>
>とありましたので、いじられていますよね。
>今は「エラー発生時に中断」になっていませんか?
>
>この設定はOn ErrorをかましていてもErrorが発生するとその場所で
>止まる様になっています。
>
ほんとその通りでございました。
今までは動いてたのになぜだろうと疑問でした。
アドバイスありがとうございました。

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