为什么Cdate()只用英语几个月?

时间:2017-03-07 19:04:20

标签: excel-vba vba excel

我有一个下拉框,项目取决于区域设置:

interface

稍后我在此代码中使用所选值:

Private Sub UserForm_Initialize()
Select Case Application.International(XlApplicationInternational.xlCountryCode)
   Case 1: 'English
   With ComboBox1
        .AddItem "January"
        ...etc
   End With
   Case 36: 'Hungarian
   With ComboBox1
        .AddItem "Január"
        ...etc
   End with
   Case 49: 'German
        With ComboBox1
           .AddItem "Januar"
           ...etc
   End with
End Select
End Sub

德国环境中,它工作得很完美,但我在匈牙利环境中进行了测试,每次类型不匹配时都会得到。

Cdate不接受2017-Január-1。 (擅长匈牙利语)为什么?

如果月份取决于区域设置,它应该有效...... (或者我应该将下拉框中的值转换为数字吗?)

2 个答案:

答案 0 :(得分:0)

不是自己写下所有月份(并且可能存在拼写错误的风险),而是使用以下方法来编写月份"名称"为你:

Public Sub getMonthNamesWrittenOutInDifferentLanguages()

Dim i As Integer

'Hungarian:
For i = 1 To 12
    Debug.Print Application.WorksheetFunction.Text(DateSerial(2017, i, 1), "[$-40e]MMMM")
Next i

'English:
For i = 1 To 12
    Debug.Print Application.WorksheetFunction.Text(DateSerial(2017, i, 1), "[$-809]MMMM")
Next i

'German:
For i = 1 To 12
    Debug.Print Application.WorksheetFunction.Text(DateSerial(2017, i, 1), "[$-de-DE]MMMM")
Next i

End Sub

之后,您可以使用相同的代码轻松浏览所有可能的月份名称并将其转换回日期:

strDate = "2017-Januar-05"

For i = 1 To 12
    strDate = Replace(strDate, Application.WorksheetFunction.Text(DateSerial(2017, i, 1), "[$-de-DE]MMMM"), i)
Next i

Debug.Print IsDate(strDate)
Debug.Print CDate(strDate)

答案 1 :(得分:0)

我会使用Format函数,DateSerial函数和ComboBox1.ListIndex属性。

Private Sub CommandButton1_Click()
 Year_1 = 2017 'integer
 Day_1 = 1 'integer
 Date_from_userform = DateSerial(Year_1, ComboBox1.ListIndex + 1, Day_1)
End Sub

Private Sub UserForm_Initialize()
 For i = 1 To 12
  ComboBox1.AddItem Format(DateSerial(Year(Date), i, 1), "mmmm")
 Next
End Sub