教えてください。
ユーザーフォームにリストボックス(Listbox1)があり、日付が昇順で入力されるようになっています。
ただし、この日付データは重複が多いため重複されないよう表示しようと下記のコードを記述しましたが「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」と表示されてしまいます。
これを回避し、実行させるためにはどういう風に記述を修正したらよいでしょうか?
================================================================
Private Sub UserForm_Initialize()
Dim i As Long
For i = 2 To 2000
ListBox1.AddItem Worksheets("データ").Cells(i, 1)
Dim myValue As Variant
Dim myRng As Range, myCell As Range
Set myRng = Worksheets("データ").Cells(i, 1).End(xlUp)
myValue = myRng.Value
Application.ScreenUpdating = False
myRng.Sort Worksheets("データ").Cells(i, 1), xlAscending, Header:=xlYes
With ListBox1
.Clear
For Each myCell In myRng.Resize(myRng.Rows.Count - 1).Offset(1) _
.SpecialCells(xlCellTypeVisible)
.AddItem myCell.Value
Next
.ListIndex = 0
End With
Next i
ListBox1.ListIndex = 0
End Sub
================================================================
No.4ベストアンサー
- 回答日時:
> 抽出されたデータが重複しているものが3件あるはずなのに2件しか抽出
> されません。
すみません。寝ぼけてたみたいです。#3 もおかしなコードですね...
AddItem ではなく、 List の方が楽なので変更しましたが、これで大丈夫な
はずです。きっと(´・ω・`)
Private Sub UserForm_Initialize()
Dim i As Long
Dim lngR As Long
Dim myRng As Range
Dim Buffer As Variant
With Worksheets("データ")
lngR = .Cells(65536, "A").End(xlUp).Row
Set myRng = Range(.Cells(1, "A"), .Cells(lngR, "A"))
myRng.Sort Key1:=myRng(1, 1), Order1:=xlAscending, Header:=xlYes
.Range("B:B").ClearContents
myRng.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=.Range("B1"), _
Unique:=True
lngR = .Cells(65536, "B").End(xlUp).Row
Buffer = Range(.Cells(2, "B"), .Cells(lngR, "B")).Value
End With
With ListBox1
.Clear
.List = Buffer
.ListIndex = 0
End With
End Sub
No.3
- 回答日時:
すみません。
#1 のコードはところどころで必要なピリオド抜けが多いので、バグフィックスしたものを再掲しておきます。スペース節約のため、コメント
はカットしてます。
# No.2 のコメントにも一部誤記があります。
# ×降順ソート --> ○昇順ソート
Private Sub UserForm_Initialize()
Dim i As Long
Dim lngR As Long
Dim myRng As Range
With Worksheets("データ")
lngR = .Cells(65536, "A").End(xlUp).Row
Set myRng = Range(.Cells(1, "A"), .Cells(lngR, "A"))
myRng.Sort Key1:=myRng(1, 1), Order1:=xlAscending, Header:=xlYes
.Range("B:B").ClearContents
myRng.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=.Range("B1"), _
Unique:=True
lngR = .Cells(65536, "B").End(xlUp).Row
Set myRng = Range(.Cells(2, "B"), .Cells(lngR, "B"))
End With
With ListBox1
.Clear
For i = 2 To lngR - 1
.AddItem myRng.Cells(i, 1).Value
Next i
End With
ListBox1.ListIndex = 0
End Sub
この回答への補足
解答ありがとうございます。
参考にさせていただいたのですが、抽出されたデータが重複しているものが3件あるはずなのに2件しか抽出されません。
これはどの部分を修正したらよいでしょうか?
No.2
- 回答日時:
AddItem だとちょっと「もたつく」感じがします。
配列にして List プロパティーで一気に放り込んだ方が高速です。
Range を一次元配列にする方法、配列から重複値をドロップする方法なども
あわせて書いてみました。少々難易度はあがりますが、ご参考下さい。
Private Sub UserForm_Initialize()
' イベントプロシージャ内にはあまり長いコードは書かないで
' サブプロシージャを呼び出すようにするとコードがスッキリ
' します
Call SetListbox
End Sub
' リストボックスデータセット
Private Sub SetListbox()
Dim i As Long
Dim rngDataTbl As Range
Dim lngR As Long
Dim Buffer As Variant
On Error GoTo ERROR_HANDLER
With ThisWorkbook.Worksheets("データ")
' データの最終行を求め、データ範囲を rngDataTbl に参照
lngR = .Cells(65536, "A").End(xlUp).Row
Set rngDataTbl = Range(.Cells(1, "A"), .Cells(lngR, "A"))
End With
' 見出し付きで降順ソート
rngDataTbl.Sort Key1:=rngDataTbl(1, 1), Order1:=xlAscending, Header:=xlYes
' 見出しは不要なので、データ範囲を補正
Set rngDataTbl = rngDataTbl.Offset(1).Resize(rngDataTbl.Rows.Count - 1)
' データ範囲を一次元配列に変換
Buffer = Application.Transpose(rngDataTbl.Value)
' 配列から重複データをドロップする
Call GetUniqueArray(Buffer)
' リストボックスにデータセット
With ListBox1
.List = Buffer
.ListIndex = 0
End With
Set rngDataTbl = Nothing
Exit Sub
ERROR_HANDLER:
MsgBox "ListBox にデータを追加できません.", vbExclamation
End Sub
' 重複のない配列を生成(サブプロシージャ)
Private Sub GetUniqueArray(ByRef Source As Variant)
Dim colTmp As Collection
Dim aryTmp As Variant
Dim vntElm As Variant
Dim i As Long
On Error GoTo ERROR_HANDLER
Set colTmp = New Collection
' Collection には同一値を Add できない --> On Error Resume Next
' にすると、結果として重複値はカットされる
On Error Resume Next
For Each vntElm In Source
If vntElm <> Empty Then
colTmp.Add CStr(vntElm), CStr(vntElm)
End If
Next vntElm
On Error GoTo 0
If colTmp.Count = 0 Then
Exit Sub
Else
' Collection から配列に戻す
ReDim aryTmp(colTmp.Count - 1)
For i = 1 To colTmp.Count
' 書式化しておく
aryTmp(i - 1) = Format$(CDate(colTmp.Item(i)), "yyyy/mm/dd")
Next i
Source = aryTmp
End If
Set colTmp = Nothing
Exit Sub
ERROR_HANDLER:
Err.Raise 1000, , "重複のない配列の生成に失敗しました."
End Sub
No.1
- 回答日時:
こんにちは。
KenKen_SP です。もとのコードを最大限に活用すればこんな感じ。AdvancedFilter で重複値を
カットするため、作業用に B列 を使いました。
Private Sub UserForm_Initialize()
Dim i As Long
Dim lngR As Long
Dim myRng As Range
With Worksheets("データ")
lngR = .Cells(65536, "A").End(xlUp).Row
Set myRng = Range(.Cells(1, "A"), Cells(lngR, "A"))
' 見出し付きでソート
myRng.Sort Key1:=myRng(1, 1), Order1:=xlAscending, Header:=xlYes
' 重複のない日付をB列に転記
.Range("B:B").ClearContents
myRng.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Range("B1"), _
Unique:=True
' データ範囲をB列に訂正
lngR = .Cells(65536, "B").End(xlUp).Row
Set myRng = Range(.Cells(2, "B"), Cells(lngR, "B"))
End With
With ListBox1
.Clear
For i = 2 To lngR - 1
.AddItem myRng.Cells(i, 1).Text
Next i
End With
ListBox1.ListIndex = 0
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
VBA 空白セルを削除ではない方...
-
【エクセル】測定時間がバラバ...
-
EXCELVBAでSQLserverからデータ...
-
チェックサムの実装方法について
-
ユーザーフォームのテキストボ...
-
配列でデータが入っている要素...
-
Android携帯をUSBメモリ代わりに
-
数値のみで記述されたrawデータ...
-
Excel VBAでのオートフィルター...
-
フォートランでの相互相関関数...
-
VBAを使ってOutlookメール本文...
-
CString型の文字列連結について
-
ActiveReportについて
-
アクセス2000で画像データ...
-
ハミング窓関数とFFT(高速フー...
-
エクセルVBAでもっと早く転記
-
独自データ属性に日本語は利用...
-
メモ帳(テキストデータ)をExc...
-
プログラミング python pandas ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
カンマからスラッシュに
-
VBA 円グラフ 特定条件に一致し...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
ACCESSからEXCELに出力する際、...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
モジュラス103の算出方法について
-
S9タイプからXタイプにデータ...
-
ブレーカー落ちで壊れたりしな...
おすすめ情報