Acid Burn, для конретного случая можно синтезировать вариант из моего и Владимира. Я делал функцию которая найдет месяц из строки даже если там есть что-то лишнее. Владимир же передает в нее только название месяца и тогда можно просто сравнивать.
Код
Function GetMonth(ByVal strDate As String) As Integer
Dim i as integer
For i = 1 To 12
If StrComp(strDate, WorksheetFunction.Text(DateSerial(1900, i, 1), "[$-160429]mmmm"), vbTextCompare) = 0 Then
GetMonth = 1 + ((i + 8) Mod 12)
Exit For
End If
Next
End Function
Function GetMonth(ByVal strDate As String) As Integer
Dim i As Integer
Static arr(1 To 12) As String
If arr(1) = "" Then
For i = 1 To 12
arr(1 + (i + 8) Mod 12) = WorksheetFunction.Text(DateSerial(1900, i, 1), "[$-160429]mmmm")
Next i
End If
For i = 1 To 12
If StrComp(strDate, arr(i), vbTextCompare) = 0 Then
GetMonth = i
Exit For
End If
Next i
End Function
Function GetMonth(ByVal strDate As String) As Integer
Dim i As Integer
Static StrArr(1 To 12) As String
If StrArr(1) = "" Then
arrm = Array( _
Array(1601, 1585, 1608, 1585, 1583, 1740, 1606), _
Array(1575, 1585, 1583, 1740, 1576, 1607, 1588, 1578), _
Array(1582, 1585, 1583, 1575, 1583), _
Array(1578, 1740, 1585), _
Array(1605, 1585, 1583, 1575, 1583), _
Array(1588, 1607, 1585, 1740, 1608, 1585), _
Array(1605, 1607, 1585), _
Array(1570, 1576, 1575, 1606), _
Array(1570, 1584, 1585), _
Array(1583, 1740), _
Array(1576, 1607, 1605, 1606), _
Array(1575, 1587, 1601, 1606, 1583))
For i = 1 To 12
For j = 0 To UBound(arrm(i - 1))
StrArr(i) = StrArr(i) & ChrW(arrm(i - 1)(j))
Next
Next
End If
For i = 1 To 12
If StrComp(strDate, StrArr(i), vbTextCompare) = 0 Then
GetMonth = i
Exit For
End If
Next
End Function
sokol92 написал: будет работать для всех версий Excel при любых региональных настройках.
все верно. Мое мнение, что решение в excel должно быть самодостаточным и любая функция, что в надстройке или персональной книге - это зло. Да простят меня писатели подобных надстроек. Обратная совместимость и совместимость с различными региональными настройками , а также с Mac версией, должна быть максимальна. Предыдущая версия не работала в 2007 и хоть он и не поддерживается больше, но люди с 2003 еще не слезли.
Поскольку заполнение массива производится однократно, выяснить скорость вряд ли удастся - не хватит точности измерений. С моей точки зрения, последний вариант удобнее, именно так и генерируем код в случае необходимости. В других аналогичных офисных пакетах такой проблемы нет, так как всё хранится в UTF-8.
Игорь, я думаю искать нужно в той локации или на том языке. Просто есть вот такие ветки https://www.excelforum.com/non-english-excel/ которые для многих ни о чем не скажут, а может там все есть.
P.S. мне не помогло, я сперва все сгенерил, а потом заметил :-) , но формулисту решение с форматом было ближе, так что это я так для самоизоляции, тьфу ты , короче сегодня и так не скучно было, а тут еще и задача с практическим применением.