В вашем коде есть несколько проблем:
Переменные подсчета строк должны быть 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 являются реальными датами или временем.Если они являются строками, это может работать неправильно (или вообще не работать).