如何在循环中将日期从一列转换到下一列?

时间:2015-09-02 19:58:32

标签: excel vba

我正在创建一个程序,显示一天中的秒数(86400),这意味着将以该格式从00:00:01到59:59:59显示86400行数据。但是我收到运行时错误:溢出。因此,我假设我需要使用多个列来收集这些数据 - 如果是这样,我该怎么做?

Private Sub mythirdlesson()
Dim wks As Worksheet
Dim s As Integer
Dim m As Integer
Dim h As Long
Dim cellrow As Integer

Set wks = ThisWorkbook.Worksheets("Library")
cellrow = 1

For h = 0 To 59
    For m = 0 To 59
        For s = 0 To 59
        wks.Cells(cellrow, 1) = h & ":" & m & ":" & s
        cellrow = cellrow + 1
        Next
    Next
Next

End Sub

4 个答案:

答案 0 :(得分:3)

问题不在于Excel行,而在于cellrow数据类型。我把它改成了很长时间,它没有问题。另请注意,您的脚本在一天中计算的设计错误为60小时而不是24小时。请考虑更正后的脚本:

Private Sub mythirdlesson()
    Dim wks As Worksheet
    Dim s As Integer
    Dim m As Integer
    Dim h As Long
    Dim cellrow As Long

    Set wks = ThisWorkbook.Worksheets("Library")
    cellrow = 1

    For h = 0 To 23
        For m = 0 To 59
            For s = 0 To 59
            wks.Cells(cellrow, 1) = h & ":" & m & ":" & s
            cellrow = cellrow + 1
            Next
        Next
    Next
End Sub

此致

答案 1 :(得分:1)

使用数组总是更快。下面的代码在我的电脑上在0.4秒内填充了86400行,而wks.Cells(cellrow, 1) = h & ":" & m & ":" & s方法则为5.3秒:

Sub TestFill86400()
    Dim filler(1 To 86400, 1 To 1) As Date
    Dim i As Long
    For i = 1 To 86400
        filler(i, 1) = (i - 1) / 86400
    Next
    With ThisWorkbook.Worksheets("Library")
        With .Range(.Cells(1, 1), .Cells(86400, 1))
            .Value = filler
            .NumberFormat = "hh:mm:ss"
        End With
    End With
End Sub

答案 2 :(得分:0)

您可以转换为.xlsx,.xlsm和.xlsb工作簿吗?它们每张纸的限制为1048576行。

此外,您必须将CellRow的数据类型更改为LONG

如果你仍然需要将它分成多个列,你可以使用模块化的opreations ......像这样:

Private Sub mythirdlesson()
Dim wks As Worksheet
Dim s As Integer
Dim m As Integer
Dim h As Long
Dim cellrow As Long

Set wks = ThisWorkbook.Worksheets("Sheet1")
cellrow = 0

For h = 0 To 24
    For m = 0 To 59
        For s = 0 To 59
            wks.Cells(cellrow Mod 65536 + 1, cellrow \ 65536 + 1) = h & ":" & m & ":" & s
            cellrow = cellrow + 1
        Next
    Next
Next

End Sub

答案 3 :(得分:0)

我意识到你正在练习练习和学习VBA。这是一个关于速度的好教训。看看写出86400时间值需要多长时间,就像你在本练习中所做的那样。

这是我怎么做的。完成需要大约十分之一秒:

Private Sub FastTimes()
    [d:d].NumberFormat = "hh:mm:ss"
    [d1:d86400] = [row(1:86400)/86400]
End Sub