【エクセルVBA】VBA初心者です。

Listboxに「重複データを除いた」A3:A3000のデータを表示したいのですが、うまくいきません。
以下のようなコードだとエラーになります。
変数i(行番号を表しています)より上のデータにi行と同じデータが無いかvlookupで検索して、vlookupがfalseならListboxに表示、trueなら何もしないで1つ下の行に行く。というようなことをしようとしています。
どう直せばいいのか教えて下さい。
また、他の方法があれば、それでも構いません。
重複データは飛び飛びで入力されています。
並び替えはしません。
Private Sub UserForm_Initialize()
Dim i As Integer
Dim LastRow As Long
With Worksheets("卸在庫DB")
LastRow = .Range("A65536").End(xlUp).Row

For i = 3 To LastRow
If WorksheetFunction.VLookup(Cells(i, 1), Range(Cells(1, 1), Cells(i - 1, 2)), 1, 0) = False Then
ListBox5.AddItem .Cells(i, 1)
End If
Next i
End With
End Sub

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/08/10 10:01:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gong1971 No.4

回答回数451ベストアンサー獲得回数70

ポイント50pt

VBAでVLOOKUP関数を求めた場合、該当の値が無いとエラーになってしまいます。

If WorksheetFunction.VLookup(Cells(i, 1), Range(Cells(1, 1), Cells(i - 1, 2)), 1, 0) = False Then

上記の部分を下記の通り変更する事で正常に動作するかと思います。

If WorksheetFunction.CountIf(Range(Cells(3, 1), Cells(i, 1)), Cells(i, 1)) = 1 Then

ちなみにリストに入力するデータはA3からで間違いないですか?

もし1行目や2行目からであれば、赤太字で記した 3 の部分を、

1 や 2 に変更してください。

For i = 3 To LastRow
id:maashi

ありがとうございます!!

できました!!

これで終了したいと思います。

今後も多分、色々と質問することが出てくると思いますので、そのときはよろしくまたよろしくお願いします。

2006/08/10 09:58:46

その他の回答3件)

id:jyarisan No.1

回答回数236ベストアンサー獲得回数4

ポイント25pt

http://www2a.biglobe.ne.jp/~irb_pln/aa5lbox.html

リストBOX作成時に指定ができるようです

私は、Vb.Netなのですが、作成後オプション設定が可能です。

id:maashi

ありがとうございます。

ただ、私にはイマイチよくわかりませんでした。

2006/08/10 09:56:36
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント25pt

もし可能であるならば、一列追加してその列に

=COUNTIF(A$3:A3,A3)

とやってそれをコピーして 行数分貼り付けたらいいでしょう。

で その値が 1のものだけを リストボックスに追加したらいかがでしょうか?

id:maashi

ありがとうございます。

データベースなので、できればワークシート自体は、いじりたくないです。

他に方法がなければ、やってみます。

今後も多分、色々と質問することが出てくると思いますので、そのときはよろしくまたよろしくお願いします。

2006/08/10 09:59:05
id:amadeous No.3

回答回数144ベストアンサー獲得回数3

ポイント40pt

ワークシート関数vlookupを使うと、期待したような動作をしませんでしたので、以下のように書き換えてみました。

Private Sub UserForm_Initialize()

Dim i As Integer

Dim x As Integer '重複フラグ(重複したら1、していなければ0)

Dim LastRow As Long

With Worksheets("卸在庫DB")

LastRow = .Range("A65536").End(xlUp).Row

For i = 3 To LastRow

x = 0 'フラグのリセット

For j = 0 To ListBox5.ListCount - 1 'リストボックスの項目数だけ繰り返し

If (Cells(i, 1) = ListBox5.List(j)) Then

x = 1 'i行目のセル内容がリストボックスに登録済みならフラグを1に

End If

Next j

If x = 0 Then

ListBox5.AddItem .Cells(i, 1) 'フラグが0ならi行目の項目を登録

End If

Next i

End With

End Sub

動作速度の面で問題がないこともありませんが、いかがでしょうか?

id:maashi

ありがとうございます。

できました!!

ただ、おっしゃるとおり、動作速度がちょっと問題ですね。

今後も多分、色々と質問することが出てくると思いますので、そのときはよろしくまたよろしくお願いします。

2006/08/10 09:58:54
id:gong1971 No.4

回答回数451ベストアンサー獲得回数70ここでベストアンサー

ポイント50pt

VBAでVLOOKUP関数を求めた場合、該当の値が無いとエラーになってしまいます。

If WorksheetFunction.VLookup(Cells(i, 1), Range(Cells(1, 1), Cells(i - 1, 2)), 1, 0) = False Then

上記の部分を下記の通り変更する事で正常に動作するかと思います。

If WorksheetFunction.CountIf(Range(Cells(3, 1), Cells(i, 1)), Cells(i, 1)) = 1 Then

ちなみにリストに入力するデータはA3からで間違いないですか?

もし1行目や2行目からであれば、赤太字で記した 3 の部分を、

1 や 2 に変更してください。

For i = 3 To LastRow
id:maashi

ありがとうございます!!

できました!!

これで終了したいと思います。

今後も多分、色々と質問することが出てくると思いますので、そのときはよろしくまたよろしくお願いします。

2006/08/10 09:58:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません