excel - 使用 VBA 使用名称作为日期对 Excel 中的工作表进行排序

标签 excel sorting vba excel-2007

我正在为我的 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/

相关文章:

vba - 在Vba中从多个工作表中收集平均值

excel - 有没有办法计算 VBA 枚举中的元素数量?

c# - 确定最大值的有效方法(有或没有偏移)

python - Pandas 按逻辑日期对数据框进行排序

spring - 如何在 Spring Data Rest GET 方法中使用排序

Excel VBA : referencing another worksheet using a cell value

mysql - 从多个 Excel 文件更新并添加 SQL 数据

sql - 如果键重复则返回最长的字符串

vba - Excel 2013 - VBA - 创建和访问 [超过 4 个!] 条件格式项目时出现运行时错误 9

vba - 删除行时无限循环?