列表框显示不在范围内的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属性是所有唯一键的数组。
我希望这有助于。