2014-10-21 35 views
1

我遇到了我的問題列表框。當我第一次運行下面的代碼時,它總是運行顯示只有一個日期,這是30/12/1899。我所指定的範圍只包含6個日期,分別是2014年8月1日,2014年9月1日,2014年14月1日,2014年24月1日,2014年24月1日和2014年2月2日 。 一旦我停止表單並再次運行,所有需要的日期都會顯示出來。列表框顯示不在範圍內的日期

我剛開始在Excel上學習VBA,所以我仍然在努力理解這些概念。 有什麼我失蹤?沒有重複的原因是我無法顯示2日期(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 

回答

1

Set AllCells = Range("A2:A7")將引用活動工作表可以是或可以不是wksJobDetail

第二次運行時,wksJobDetail已被激活。

嘗試把Set AllCells = Range("A2:A7")語句後:

設置wksJobDetail = Application.Workbooks( 「xxxxx.xlsm」)工作表( 「JobSchedule」) wksJobDetail.Activate

1

我認爲這事做以及如何在Excel中格式化數據以及引用源範圍的正確方法。

試試這個: 首先,檢查日期正確的日期在Excel中像下面輸入。

enter image description here

然後使這條線明確:

Set AllCells = Range("A2:A7") 

,並改成這樣:

Set AllCells = Sheets("JobSchedule").Range("A2:A7") 

現在,運行代碼,我已經重寫下面添加對錯誤轉到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 

而這應該給你你想要的結果。此外,我建議使用初始化事件而不是激活
每次使用OERN時,不要忘記使用OEG0重置錯誤處理。
否則,您將無法捕獲與收藏中添加現有項目無關的其他錯誤。

獎勵:

另一種方式做,這是使用字典來代替。您需要添加對微軟腳本運行時間的引用。我重寫了一部分代碼,它們的效果相同。詞典的優點是它提供了其他有用的屬性,您可以使用它。

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 

正如你所看到的,我們通過使用屬性是所有獨特的按鍵陣列刪除一個循環。
我希望這有助於。