2016-03-28 1 views
0

Так я получаю дату в следующем формате: 201603как имитировать формулу Excel в VBA для автоматического запуска

, и она должна быть перестроена в 03/2016.

Если это находится в ячейке A1: 201603

и это находится в ячейке B1: =RIGHT(A1,2) & "/" & LEFT(A1,4)

перегруппировка будет происходить очень хорошо при использовании в качестве формулы. Проблема, с которой я сталкиваюсь, заключается в том, чтобы поместить ее в VBA, чтобы она автоматически запускалась для дампов неверно отформатированных данных.

Мой код, кажется, получает ошибку несоответствия, и я действительно не вижу проблемы.

Вся отзыв приветствуется.

Sub format() 
    initial_date = Range ("A1").Value 
    Dim Publish_date As Date 
    publish_date = DateValue(Mid(initial_date,1,4) & "/" & Mid(initial_date,5,2)) 
    Range("A1").Value = publish_date 
End Sub 

Screenshot of what i am working with

+0

код отлично работает для меня. Он не делает то, что вы говорите, что хотите сделать, но это не дает никакой ошибки. – MikeC

+1

Есть несколько причин, по которым вы получите эту ошибку, но я бы поставил на мой дом, потому что 'initial_date' является' Empty' ... и я бы поставил свою собаку в этом доме, потому что ваш активный лист не тот, на котором находятся ваши данные (http://stackoverflow.com/questions/33321586/why-am-i-not-able-to-change-worksheet-reference/33324815#33324815). – Ambie

ответ

1

Вы хотите использовать Dateserial() в VBA, а затем применить формат номера в ячейке:

Sub format() 
Dim initial_date As String 
Dim Publish_date As Date 

initial_date = Range("A1").value 
Publish_date = DateSerial(Mid(initial_date, 1, 4), Mid(initial_date, 5, 2), 1) 

Range("A1").value = Publish_date 
Range("A1").NumberFormat = "mm/yyyy" 

End Sub 

И перебирать весь столбец:

Sub format() 
Dim initial_date As String 
Dim Publish_date As Date 
Dim lastrow As Long 

With ActiveSheet 
    lastrow = .Range("A" & .Rows.count).End(xlUp).Row 
    For i = 1 To lastrow 
     If IsDate(.Cells(i, 1)) Then 
      .Cells(i, 1).NumberFormat = "mm/yyyy" 
     Else 
      initial_date = .Cells(i, 1).value 
      Publish_date = DateSerial(Mid(initial_date, 1, 4), Mid(initial_date, 5, 2), 1) 

      .Cells(i, 1).value = Publish_date 
      .Cells(i, 1).NumberFormat = "mm/yyyy" 
     End If 
    Next i 
End With 

End Sub 

Если вы убеждены в том, что вся колонна находится в том же формате yyyymm, то вы можете сделать весь сразу:

Sub format() 
Dim lastrow As Long 

With ActiveSheet 
    lastrow = .Range("A" & .Rows.count).End(xlUp).Row 
    .Range("A1:A" & lastrow) = .Evaluate("Index(DATE(Mid(A1:A" & lastrow & ",1,4),Mid(A1:A" & lastrow & ",5,2),1),)") 
    .Range("A1:A" & lastrow).NumberFormat = "mm/yyyy" 
End With 

End Sub 
Смежные вопросы