Мне нужно присвоить значение времени переменной - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно присвоить значение переменной времени, которое находится в конкретной ячейке.

Я пытался присвоить значения по-разному, но каждый раз это выдает ошибку несоответствия:

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 ]

2 голосов
/ 13 июня 2019

В вашем коде есть несколько проблем:

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

0 голосов
/ 13 июня 2019

изменение this date1 = Sheet1.Cells("B", i).Value до date1 = Sheet1.Cells(i, "B").Value

вы поменяли местами индекс строки и столбца на Cells

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...