【发布时间】:2018-03-23 14:28:25
【问题描述】:
我编写了一个 Sub 来使用 Application.WorksheetFunction 对日期进行排序。它从工作表的第一列获取日期并将它们写入第二列。之后,它将它们划分为年份并从中生成一个字符串,该字符串写入单元(1,3)。除了第二列中的第一个日期始终为“30-12-1899”外,所有工作正常。怎么可能?
Function dzien(data As String) As String
Select Case Day(data)
Case Is < 10
dzien = "0" & CStr(Day(data))
Case Is >= 10
dzien = CStr(Day(data))
End Select
End Function
Function miesiac(data As String) As String
Select Case Month(data)
Case Is < 10
miesiac = "0" & CStr(Month(data))
Case Is >= 10
miesiac = CStr(Month(data))
End Select
End Function
Sub Sortuj_daty()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = wb.Worksheets(1)
Dim i As Long
Dim j As Long
Dim k As Long
Dim daty() As String
Dim daty_int() As Long
Dim daty_uporzadkowane() As String
Dim daty_calk As String
Dim wiersz As Integer
wiersz = 0
Do
wiersz = wiersz + 1
ReDim daty(wiersz)
ReDim daty_int(wiersz)
ReDim daty_uporzadkowane(wiersz)
Loop Until ws.Cells(wiersz + 1, 1).Value = "" Or ws.Cells(wiersz + 1, 1).Value = 0
ReDim daty_uporzadkowane(wiersz + 1)
daty_calk = ""
For i = 0 To UBound(daty) - 1
daty(i) = ws.Cells(i + 1, 1).Value
daty_int(i) = CDbl(CDate(Format(daty(i), "yyyy-mm-dd")))
Next i
For j = 0 To UBound(daty) - 1
daty_uporzadkowane(j) = CDate(Application.WorksheetFunction.Small(daty_int, j + 1))
ws.Cells(j + 1, 2) = daty_uporzadkowane(j)
Next j
k = 0
daty_uporzadkowane(UBound(daty_uporzadkowane) - 1) = #1/1/1900#
Do
Do
k = k + 1
If k = 1 Then k = k - 1
End If
daty_calk = daty_calk & CStr(dzien(daty_uporzadkowane(k))) & "-" & miesiac(daty_uporzadkowane(k)) & "/"
Loop Until Year(CDate(daty_uporzadkowane(k))) < Year(CDate(daty_uporzadkowane(k + 1))) Or k = UBound(daty) - 1
daty_calk = Left(daty_calk, Len(daty_calk) - 1) & "-"
daty_calk = daty_calk & Year(daty_uporzadkowane(k)) & " / "
Loop Until k = UBound(daty) - 1
daty_calk = Left(daty_calk, Len(daty_calk) - 3)
ws.Cells(1,3).Value = daty_calk
End Sub
【问题讨论】: