2017-01-19 3 views
4

Я пытаюсь преобразовать дату в длинный, используя скрипт VBA. Ниже приведен фрагмент кодаVBA cDate не работает на Mac excel 2011 (14.7.1)

Sub test() 
    Dim str as string 
    Dim d as variant 
    str="1/1/2016" 
    d=cdate(str) 
end sub 

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

+0

Каковы настройки вашего региона Mac/языка? – Dai

+0

Кроме того, в какой строке вы принимаете ошибку и что такое сообщение об ошибке? – Dai

+0

Он находится в настройках США –

ответ

1

Ваш код действительно работал на моей локальной машине OS X с Excel. Однако у меня разные настройки региона. Я бы предложил попробовать использовать международный формат даты («YYYY-mm-dd»).

Sub Main 
    Dim str as String 
    Dim d as Variant 
    str = "2016-01-01" 
    d = CDate(str) 
End Sub 

В качестве альтернативы, вы можете попробовать «Янв/1/2016».


PS: Вы можете увидеть ваши настройки даты & в OS X под System Preferences -> Язык & Регион -> Дополнительно -> Даты:

OS X language & region date settings

+0

Обратите внимание на ссылку, предоставленную Хэнком в комментариях выше –

+0

Проблема заключается в том, что CDate используется для covnert из странного формата, согласно [этому вопросу] (https://stackoverflow.com/questions/23990811/convert-mmm- dd-yyyy-hhmmss-am-in-excel) .... –

0

Может попробовать удаление «/ «перед конвертированием? У меня нет Mac для тестирования:

Public Sub test() 
    Dim str As String 
    Dim d As Long 'should be Date, but your question states Long 
    str = "1/1/2016" 
    d = CDate(Replace(str, "/", "")) 
    Debug.Print d 
End Sub 

Кроме того, вы пробовали проверять недостающие ссылки? Date for VBA not working in Excel 2011?

1

Ваши региональные настройки являются основной причиной.

Можете ли вы попробовать их изменить?

defaults write NSGlobalDomain AppleICUDateFormatStrings -dict 1 dd/MM/yyyy 
+0

Просто любопытно, как это можно сделать в VBA? – KyloRen

+0

Это должно быть сделано в терминале MacOS, относящемся к системным настройкам. –

+0

@ HanSoalone, любите имя !!! – KyloRen

0

Вы можете использовать функцию IsDate(), чтобы проверить, является ли это датой перед преобразованием. В противном случае используйте обходной путь:

Sub test() 
    Dim str as string 
    Dim d as variant 
    str = "1/1/2016" 

    If IsDate(str) then 
     d = CDate(str) 
    Else 
     Dim aDateParts() as String 
     aDateParts() = Split(str, "/") 

     ' DateSerial(Year, Month, Day) 
     d = DateSerial(CInt(aDateParts(2)), CInt(aDateParts(0)), CInt(aDateParts(1))) 
    End If 
end sub 
+0

До сих пор единственный ответ, обеспечивающий возможное обходное решение, однако я не уверен, что 'IsDate (str)' предотвращает проверку валидности как даты, хотя присвоение 'd' может завершиться неудачей. Кроме того, если строка даты является чем-то смешным, как «1/32/2017», мы попадаем в другую часть, где начинаются плохие вещи. –

+0

Я собирался сделать это с левым/средним/правым для дня месяца, ваш ответ лучше с функцией split. На мой взгляд, это можно было бы улучшить, поставив его в: Function ConDate (InputDate as string) в качестве даты – User632716

+0

@HanSoalone Этот код был скорее доказательством концепции, чем рабочим решением, его следует уточнить, если это приемлемое решение. Том, спасибо, кажется, хорошая идея! Какая здесь самая лучшая практика? Должен ли я продвигать ваше решение? – sebifeixler

0

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

Sub test() 
    Dim str As String 
    Dim d As Variant 
    str = "1/1/2016" 
    d = CDate(Format(str, "dd/MM/yyyy")) 
    Debug.Print d 
End Sub 
0

я не отправлял это изначально, потому что я чувствовал однако он не затрагивает корень проблемы, однако, если вы хотите обходной путь, вы можете использовать функцию ниже, аналогично тому, как вы использовали бы CDate, позвонив ConDate("12/12/2016").

Это путь, я подошел к этой проблеме:

Sub MainTest() 
    Dim InputString As String, OutputDate As Date 

    InputString = "01/12/2016" 
    OutputDate = ConDate(InputString) 

    Debug.Print OutputDate, TypeName(OutputDate) 
End Sub 

Function ConDate(ByRef InputString As String) As Date 
    Dim Day As Long, Month As Long, year As Long 
    'mmddyyyy format 
    Month = CLng(Left(InputString, InStr(1, InputString, "/", vbTextCompare) - 1)) 
    Day = CLng(Mid(InputString, InStr(1, InputString, "/", vbTextCompare) + 1, InStrRev(InputString, "/", , vbTextCompare) - InStr(1, InputString, "/", vbTextCompare) - 1)) 
    year = CLng(Right(InputString, 4)) 
    ConDate = DateSerial(year, Month, Day) 
End Function 

Не желая plagerise ответ sebifeixler, я держал свой оригинальный левый/СЧ/право отделиться день/месяц/год, но я чувствую, что это много чтобы использовать его функцию разделения для разделения даты на «/». Комбинация этих двух будет хорошим решением.

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

  • Нет связанных вопросов^_^