我需要分配一个特定单元格中的可变时间值。
我尝试以不同的方式分配值,但是每次都会给我不匹配错误:
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
,依此类推,直到行尾为止。
答案 0 :(得分:2)
您的代码中存在几个问题:
行计数变量必须为Long
,因为Excel的行多于Integer
不能处理的行:
Dim lRow As Long
您的参数i
未指定类型:
Sub country_despatch(StartRow As Long)
在Sheet1.Cells("B", i)
中,您混合了行和列,正确的语法是
Cells(row, column)
Sheet1.Cells(i, "B")
您使用While i < lRow … Wend
,但从不增加i
,因此此循环将无休止地运行。使用For iRow = StartRow To LastRow … Next iRow
循环在iRow
循环中自动将i
递增或手动i = i + 1
递增While
。
我强烈建议使用Option Explicit
并使用有意义的变量名。如果您需要开始为变量编号,那么您所做的根本就是错误的。最糟糕的选择是ws1
和ws2
之类的名称。例如,使用有意义的内容,例如wsSource
和wsDestination
。这更容易理解和维护,并且如果不混淆ws1
和ws2
,将减少错误。
有意义的索引变量名称也非常有用。如果仅将它们命名为i
,则永远不会知道这是行增量还是列增量。如果您将其命名为iRow
或iColumn
,它将非常清楚。
因此,您应该得到这样的结果:
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).Value
至date1 = Sheet1.Cells(i, "B").Value
您已将行索引和列索引交换为单元格