我的 excel 文件中有 3 种类型的日期。这些日期包括上述内容:Q(季度)、Apr(月份的缩写或缩写名称)、April(月份的全名)。这些日期与四位数年份相结合,并在我的 Excel 文件中将年份的一部分显示为日期。现在我想在我的 excel 文件中对这 3 种类型的日期进行排序。
例如:
我需要先将所有四位年份向左移动,然后按季度或月份的全名或简称从下到上排序。
我把这个例子放在这里:
Q1 2022
2000 November
2024 Q3
Apr 2010
Q2 2022
2015 Jan
March 2005
2024 Q4
May 2010
2015 Feb
2000 October
April 2005
注意:1)我的文件中总是有这三种类型的年份划分 2)我无法手动执行此操作,因为我可能有太多文件。或者列中有许多分区
我怎样才能做到这一点?
答案1
对于真正需要根据数字的位置交换字符串中的两个单词的情况,用户定义函数 (UDF) 代码非常简单:
Function OrderWords(sWord As String) As String
Dim aTemp As Variant
OrderWords = Trim(sWord)
aTemp = Split(sWord, " ")
If UBound(aTemp) = 1 Then
If IsNumeric(aTemp(1)) Then OrderWords = aTemp(1) & " " & aTemp(0)
End If
End Function
如果要获取每一行的日期范围,那么该函数会更长一些:
Function ParsePeriods(sWord As String) As Variant
Dim aTemp As Variant
Dim nYear As Integer
Dim sPeriod As String
Dim aRes(1 To 2) As Variant
ParsePeriods = OrderWords(sWord)
aTemp = Split(Trim(sWord), " ")
If UBound(aTemp) <> 1 Then Exit Function
If IsNumeric(aTemp(1)) Then
nYear = CInt(aTemp(1))
sPeriod = Left(Trim(aTemp(0)), 3)
Else
nYear = CInt(aTemp(0))
sPeriod = Left(Trim(aTemp(1)), 3)
End If
Select Case sPeriod
Case "Q1"
aRes(1) = DateSerial(nYear, 1, 1): aRes(2) = DateSerial(nYear, 3, 31)
Case "Q2"
aRes(1) = DateSerial(nYear, 4, 1): aRes(2) = DateSerial(nYear, 6, 30)
Case "Q3"
aRes(1) = DateSerial(nYear, 7, 1): aRes(2) = DateSerial(nYear, 9, 30)
Case "Q4"
aRes(1) = DateSerial(nYear, 10, 1): aRes(2) = DateSerial(nYear, 12, 31)
Case "Jan"
aRes(1) = DateSerial(nYear, 1, 1): aRes(2) = DateSerial(nYear, 1, 31)
Case "Feb"
aRes(1) = DateSerial(nYear, 2, 1): aRes(2) = Application.WorksheetFunction.EoMonth(aRes(1), 0)
Case "Mar"
aRes(1) = DateSerial(nYear, 3, 1): aRes(2) = DateSerial(nYear, 3, 31)
Case Else
aRes(1) = "Write the rest of": aRes(2) = "the options yourself"
End Select
ParsePeriods = aRes
End Function
由于该函数返回两个值,因此您需要将其作为数组公式输入到两个相邻的单元格中,并按Ctrl+Shift+Enter
第二种选择是更好的选择,因为使用第一种选择,你将无法获得屏幕截图中显示的结果 - 在排序时2005 年 3 月将低于2005 年 4 月因为“A”小于“M”。