我需要将时间值分配给变量

时间:2019-06-13 03:21:56

标签: excel vba

我需要分配一个特定单元格中的可变时间值。

我尝试以不同的方式分配值,但是每次都会给我不匹配错误:

Sub country_despatch(i)

Dim tm As Double
Dim date1 As Double

Dim lRow As Integer
Dim ws1 As Worksheet
Dim ws2 As Worksheet

lRow = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
While i < lRow

 date1 = Sheet1.Cells("B", i).Value
 display (date1)
Wend

End Sub

我需要将B2单元格的值分配给date1。如果满足条件,我们将移至下一个单元格B3并将其值分配给date1,依此类推,直到行尾为止。

2 个答案:

答案 0 :(得分:2)

您的代码中存在几个问题:

  1. 行计数变量必须为Long,因为Excel的行多于Integer不能处理的行:
    Dim lRow As Long

  2. 您的参数i未指定类型:
    Sub country_despatch(StartRow As Long)

  3. Sheet1.Cells("B", i)中,您混合了行和列,正确的语法是
    Cells(row, column)
    Sheet1.Cells(i, "B")

  4. 您使用While i < lRow … Wend,但从不增加i,因此此循环将无休止地运行。使用For iRow = StartRow To LastRow … Next iRow循环在iRow循环中自动将i递增或手动i = i + 1递增While

  5. 我强烈建议使用Option Explicit并使用有意义的变量名。如果您需要开始为变量编号,那么您所做的根本就是错误的。最糟糕的选择是ws1ws2之类的名称。例如,使用有意义的内容,例如wsSourcewsDestination。这更容易理解和维护,并且如果不混淆ws1ws2,将减少错误。

    有意义的索引变量名称也非常有用。如果仅将它们命名为i,则永远不会知道这是行增量还是列增量。如果您将其命名为iRowiColumn,它将非常清楚。

因此,您应该得到这样的结果:

Option Explicit

Sub Test()
    country_despatch StartRow:=2
End Sub

Sub country_despatch(ByVal StartRow As Long)
    Dim MyTime As Double
    Dim MyDate As Date

    Dim LastRow As Long
    LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "B").End(xlUp).Row

    Dim iRow As Long
    For iRow = StartRow To LastRow
        MyDate = Sheet1.Cells(iRow, "B").Value 'value into date format
        MyTime = CDbl(MyDate) - CLng(MyDate) 'extract only the time from a date/time

        Debug.Print "date", MyDate, CDbl(MyDate)
        Debug.Print "time part", MyTime
    Next iRow
End Sub

确保B列中的值为真实日期或时间。如果它们是字符串,则可能无法正常工作(或根本无法工作)。

答案 1 :(得分:0)

更改 this date1 = Sheet1.Cells("B", i).Valuedate1 = Sheet1.Cells(i, "B").Value

您已将行索引和列索引交换为单元格