我正在为我的 Excel 电子表格编写一个自定义排序过程,该电子表格至少有 3 个工作表。在第一个位置,我放置了名为“摘要”的工作表,在第二个位置放置了“数据”,其余的是名称为日期的工作表,例如“17.03.2011”、“20.03.2011”等。这些需要按时间顺序排序。
到目前为止,这是我所拥有的,脚本因 DateDiff() 出现“需要对象”错误而停止,我不知道为什么:
更正下面的代码后,我仍然无法按正确的顺序排序。谁能建议一种比较和移动床单的方法?
Public Sub ssort()
sSummary.Move before:=Worksheets.Item(1)
sData.Move after:=sSummary
Dim i, n As Integer
Dim diff As Long
Dim current, other As Worksheet
For i = 1 To Worksheets.Count
Set current = Worksheets.Item(i)
If current.Name <> sData.Name And current.Name <> sSummary.Name Then
For n = i + 1 To Worksheets.Count
Set other = Worksheets.Item(n)
diff = DateDiff(DateInterval.day, Format(current.Name, "dd.mm.yyyy"), Format(other.Name, "dd.mm.yyyy"))
If diff > 0 Then
current.Move before:=other
Debug.Print "Moving " & current.Name & " before " & other.Name
ElseIf diff < 0 Then
current.Move after:=other
Debug.Print "Moving " & current.Name & " after " & other.Name
End If
Next n
End If
Next i
End Sub
我想我要么不理解 DateDiff() 要么 Format(),有人能解释一下吗?
从这里的在线示例修改代码后http://www.vbaexpress.com/kb/getarticle.php?kb_id=72为了使用 datediff 进行比较,我想出了这个按预期工作的解决方案:
Sub sort2()
sSummary.Move before:=Worksheets.Item(1)
sData.Move after:=sSummary
Dim n As Integer
Dim M As Integer
Dim dsEnd, lowest As Integer
Dim dCurrent() As String
Dim dOther() As String
Dim diff As Long
dsStart = 3
dsEnd = Worksheets.Count
For M = dsStart To dsEnd
For n = M To dsEnd
If Worksheets(n).Name <> "Summary" And Worksheets(n).Name <> "Data" And Worksheets(M).Name <> "Summary" And Worksheets(M).Name <> "Data" Then
dCurrent = Split(CStr(Worksheets(n).Name), ".")
dOther = Split(CStr(Worksheets(M).Name), ".")
diff = DateDiff("d", DateSerial(dCurrent(2), dCurrent(1), dCurrent(0)), DateSerial(dOther(2), dOther(1), dOther(0)))
If diff > 0 Then
Worksheets(n).Move before:=Worksheets(M)
End If
End If
Next n
Next M
End Sub
最佳答案
DateDiff
函数要求两个日期参数为 Variant (Date)
类型。相反,你给它两个 String
参数,这就是 Format
函数返回。
您需要将每个字符串转换为 Variant (Date)
.这可以这样做:
strDate = current.Name ' String: "20.03.2011"
aintDateElements = Split(strDate, ".") ' Array: {2001, 03, 20}
varDate = DateSerial(aintDateElements(2), aintDateElements(1),
aintDateElements(0)) ' Variant (Date)
还有其他方法可以进行这种转换,但我发现这是最不常产生意外结果的方法!
关于excel - 使用 VBA 使用名称作为日期对 Excel 中的工作表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5435499/