Я мог бы лаять неправильное дерево здесь, но ваше исключение, похоже, указывает на то, что ваш сервер MySQL недоступен.
Исключение в потоке «main» com.mysql.jdbc.exceptions .jdbc4.CommunicationsException: сбой связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. at ...
blockquote>Что произойдет, если вы попытаетесь (из терминала)
mysql -u username -p
Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключился ли клиент mysql?
Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете запустить его при запуске.
Поскольку @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
У меня есть это предложение, и он выполняет эту работу:
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
Тем не менее, мне бы хотелось узнать, могу ли я добиться того же, используя диапазон - мне гораздо удобнее с этим чем с циклом ...
.Formula
диапазона, но это не сработает для вашего случая, так как это приведет к циклической ссылке (например, формула для B2 будет: ="B2" + Time(1,0,0)
Если вы не можете использовать помощника столбец, я не уверен, что это можно сделать с диапазоном напрямую, и я думаю, вам следует избегать вставки (и удаления) дополнительных столбцов / строк на листе. Вы должны ознакомиться с петлями For
, они имеют фундаментальное значение в VBA и любой язык :)
– David Zemens
13 July 2018 в 13:05
Ничего плохого в цикле, но мне нравятся массивы:
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)
rngCell
, который кажется тем, что OP собирался в оригинале. – JNevill 13 July 2018 в 13:43