Excel использует список Сепаратор символ для разделения параметров функции.
Жесткое кодирование точки с запятой или запятая, если на то пошло, в вашу формулу, делает ваш код уязвимым для изменений в региональных настройках, поскольку символ разделителя символов с жестким кодом перестанет работать, как только будут изменены настройки Windows , или если ваш код работает на компьютере с различными настройками.
Вы можете использовать некоторые Win32 API, чтобы получить правильный символ из региональных настроек, путем добавления этого кода в стандартном модуле (.BAS), который можно назвать Win32
:
Option Explicit
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
(ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function GetUserDefaultLCID% Lib "kernel32"()
Private Const LOCALE_SLIST = &HC
Public Function GetListSeparator() As String
Dim ListSeparator As String
Dim iRetVal1 As Long
Dim iRetVal2 As Long
Dim lpLCDataVar As String
Dim Position As Integer
Dim Locale As Long
Locale = GetUserDefaultLCID()
iRetVal1 = GetLocaleInfo(Locale, LOCALE_SLIST, lpLCDataVar, 0)
ListSeparator = String$(iRetVal1, 0)
iRetVal2 = GetLocaleInfo(Locale, LOCALE_SLIST, ListSeparator, iRetVal1)
Position = InStr(ListSeparator, Chr$(0))
If Position > 0 Then
ListSeparator = Left$(ListSeparator, Position - 1)
End If
GetListSeparator = ListSeparator
End Function
(адаптировано из this PCReview post)
правильный код будет таким:
Dim separator As String
separator = Win32.GetListSeparator
Sheets("Output").Range("T2").Formula = _
"=CONCATENATE(TEXT(C2" + separator + """MM/DD/JJJJ"")" + separator + """-""" + separator + "TEXT(S2" + separator + """MM/DD/JJJJ""))"
..., который является совершенно раздражает. VBA необходим правильный StringFormat
метод (I made one), так что вы можете сделать это:
Dim separator As String
separator = Win32.GetListSeparator
Dim formatString As String
formatString = "=CONCATENATE(TEXT(C2{0}\qMM/DD/JJJJ\q){0}\q-\q{0}TEXT(S2{0}\qMM/DD/JJJJ\q))"
Sheets("Output").Range("T2").Formula = StringFormat(formatString, separator)
Что делать, если вы замените ';' на ''? –
Это работает. Спасибо за быстрый ответ. – DisplayName
Я добавил ответ на сообщение. –