列表框显示不在范围内的date
我的列表框有问题。 当我第一次运行下面的代码时,它总是运行显示只有一个date是30/12/1899 。 我所指定的范围仅包含2014年8月1日,2014年9月1日,2014年1月14日,2014年24月1日,2014年24月1日和2014年2月2日的 6个date。 一旦我停止了表格并再次运行,所有需要的date显示出来。
我刚刚开始在Excel上学习VBA,所以我仍然在努力理解这些概念。 有什么我失踪? 没有重复的原因是我不能显示2date(24/01/2014)。
Private Sub UserForm_Activate() Dim AllCells As Range, Cell As Range Dim NoDupes As New Collection Dim i As Integer, j As Integer Dim Swap1, Swap2, Item Dim wksJobDetail As Worksheet 'The items are in A2:A7 Set AllCells = Range("A2:A7") 'Point the variable to JobSchedule worksheet Set wksJobDetail = Application.Workbooks("xxxxx.xlsm").Worksheets("JobSchedule") wksJobDetail.Activate 'Statement ignores any errors regarding duplicates and duplicate dates aren't added On Error Resume Next For Each Cell In AllCells NoDupes.Add Format(CDate(Cell.Value), "dd/mm/yyyy"), _ CStr(Format(CDate(Cell.Value), "dd/mm/yyyy")) Next Cell 'Add non-duplicated items into lstDate For Each Item In NoDupes JobDetail.lstDate.AddItem Item Next Item End Sub
Set AllCells = Range("A2:A7")
将引用活动工作表,可能或可能不是wksJobDetail
。
第二次运行时,wksJobDetail已被激活。
尝试将Set AllCells = Range("A2:A7")
语句放在以下位置之后:
设置wksJobDetail = Application.Workbooks(“xxxxx.xlsm”)。工作表(“JobSchedule”)wksJobDetail.Activate
我认为这与您如何在Excel中格式化数据以及引用源范围的正确方式有关。
试试这个:首先,检查date是否正确inputExcel中的date,如下所示。
然后明确这一行:
Set AllCells = Range("A2:A7")
并改变为:
Set AllCells = Sheets("JobSchedule").Range("A2:A7")
现在,运行你的代码,我已经重写下面添加On Error Goto 0 。
Dim AllCells As Range, Cell As Range, Item Dim NoDupes As New Collection Set AllCells = Sheets("JobSchedule").Range("A2:A7") On Error Resume Next '~~> Ignore Error starting here For Each Cell In AllCells NoDupes.Add Format(CDate(Cell.Value), "dd/mm/yyyy"), _ CStr(Format(CDate(Cell.Value), "dd/mm/yyyy")) Next Cell On Error GoTo 0 '~~> Stops ignoring error For Each Item In NoDupes JobDetail.lstDate.AddItem Item Next Item
这应该给你你想要的结果。 另外,我build议使用Initialize Event而不是Activate 。
每次使用OERN时 ,不要忘记使用OEG0来重置error handling。
否则,您将无法捕获与Collection中添加现有项目无关的其他错误。
奖金:
另一种方法是使用字典来代替。 您需要添加对Microsoft脚本运行时的引用。 我重写了你的代码的一部分,将有相同的效果。 字典的优点是它提供了其他有用的属性,您可以使用。
Private Sub UserForm_Initialize() Dim AllCells As Range, Cell As Range Dim d As Dictionary Set AllCells = Sheets("Sheet1").Range("A2:A7") Set d = New Dictionary For Each Cell In AllCells d.Item(Format(CDate(Cell.Value), "dd/mm/yyyy")) = _ CStr(Format(CDate(Cell.Value), "dd/mm/yyyy")) Next Cell JobDetail.lstDate.List = d.Keys End Sub
正如你所看到的,我们通过使用Keys属性来删除一个Loop,这个Keys属性是所有唯一键的数组。
我希望这有助于。