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

Excel 如何在循环中将日期从一列转换到下一列?,excel,vba,Excel,Vba,我正在创建一个程序,显示一天中的秒数(86400),这意味着将有86400行数据以该格式显示,从00:00:01到59:59:59。但是,我得到一个运行时错误:溢出。因此,我假设我需要使用多个列来收集这些数据——如果是这样,我该怎么做 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 = T

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

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

您能转换成.xlsx、.xlsm和.xlsb工作簿吗?每张纸的行数限制为1048576行

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

如果您仍然需要将其拆分为多个列,则可以使用模块化操作。。。像这样:

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

问题不在于Excel行,而在于
cellrow
数据类型。我把它改成了long,它工作起来没有问题。还请注意,您的脚本在计算一天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

您好,

我知道您做这个练习是为了练习和学习VBA。关于速度,这里有一个很好的教训。看看写下你的86400时间值需要多长时间,就像你在本练习中所做的那样

我会这样做的。大约需要十分之一秒才能完成:

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

使用阵列总是更快。下面的代码在我的电脑上以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

这会解决您的问题,尽管它不会回答您的具体问题。如果要将其分成两行,可以使用
If cellrow>43200然后
语句,其中If
cellrow
或其他变量超出嵌套循环中的某个值,然后执行
wks.Cells(cellrow-43200,2)=……
写入第二列并调整行。当做