VBA - добавьте 1 час диапазона

Я мог бы лаять неправильное дерево здесь, но ваше исключение, похоже, указывает на то, что ваш сервер MySQL недоступен.

Исключение в потоке «main» com.mysql.jdbc.exceptions .jdbc4.CommunicationsException: сбой связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. at ...

Что произойдет, если вы попытаетесь (из терминала)

mysql -u username -p

Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключился ли клиент mysql?

Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете запустить его при запуске.

1
задан TinMan 13 July 2018 в 14:42
поделиться

4 ответа

Поскольку @Tom предполагает, что вам может повезти с помощью вашего диапазона, поскольку DateAdd принимает дату в качестве третьего параметра, и прямо сейчас вы передаете ему Range, который является совершенно другим типом.

For Each rngCell in Range("B2:B" & LastRow)
    rngCell.value = DateAdd("h", 1, rngCell.Value)
Next rngCell

Это все еще может потерпеть неудачу, так как это bening передало string вместо date, но он может работать как есть без каких-либо дополнительных манипуляций (не тестировался).

Просто протестировано , вам почти наверняка потребуется преобразовать эту дату в дату. Вы можете использовать cdate() для этого:

For Each rngCell in Range("B2:B" & LastRow)
    rngCell.value = DateAdd("h", 1, cdate(rngCell.Value))
Next rngCell
3
ответ дан JNevill 17 August 2018 в 12:50
поделиться
  • 1
    RAM @ScottCraner кажется хорошим местом для этого, нет? Я обновился, чтобы вставить его обратно в rngCell, который кажется тем, что OP собирался в оригинале. – JNevill 13 July 2018 в 13:43

У меня есть это предложение, и он выполняет эту работу:

Dim LastRow As Long
Dim RLoop As Long
LastRow = ActiveSheet.UsedRange.Rows.Count
With Range("A2:A" & LastRow)
    .TextToColumns Destination:=Range("B2"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 1), Array(19, 9)), TrailingMinusNumbers:=True
End With
For RLoop = 2 To LastRow
If IsDate(Range("B" & RLoop).Value) Then
Range("B" & RLoop).Value = DateAdd("h", 1, Range("B" & RLoop).Value)
End If
Next RLoop

Тем не менее, мне бы хотелось узнать, могу ли я добиться того же, используя диапазон - мне гораздо удобнее с этим чем с циклом ...

0
ответ дан mikolajek 17 August 2018 в 12:50
поделиться
  • 1
    Я собирался предложить записать свойство .Formula диапазона, но это не сработает для вашего случая, так как это приведет к циклической ссылке (например, формула для B2 будет: ="B2" + Time(1,0,0) Если вы не можете использовать помощника столбец, я не уверен, что это можно сделать с диапазоном напрямую, и я думаю, вам следует избегать вставки (и удаления) дополнительных столбцов / строк на листе. Вы должны ознакомиться с петлями For, они имеют фундаментальное значение в VBA и любой язык :) – David Zemens 13 July 2018 в 13:05
  • 2
    Что случилось с циклом? – Tom 13 July 2018 в 13:05
  • 3
    Ничего плохого в цикле, мне просто не очень удобно использовать его ... Большое спасибо за все ответы! – mikolajek 13 July 2018 в 13:12

Ничего плохого в цикле, но мне нравятся массивы:

Sub CET_Time()
    Dim LastRow As Long
    LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    With ActiveSheet.Range("A2:A" & LastRow)
        .Offset(, 1).Value = ActiveSheet.Evaluate("INDEX(left(" & .Address(1, 1) & ",23)+1/24,)")
        .Offset(, 1).NumberFormat = "YYYY-MM-DD HH:MM:SS.000"
    End With
End Sub

Если вы просто хотите переписать на место, удалите оба .Offset( ,1)

1
ответ дан Scott Craner 17 August 2018 в 12:50
поделиться
0
ответ дан TinMan 17 August 2018 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: