2016-03-02 3 views
1

Я написал эту строку кода, чтобы поместить эту формулу в ячейки Т2:VBA Полная формула клетки

Sheets("Output").Range("T2").Formula = _ 
    "=CONCATENATE(TEXT(C2;""MM/DD/JJJJ"");""-"";TEXT(S2;""MM/DD/JJJJ""))" 

Но я получаю следующее сообщение об ошибке:

Run-time error '1004': Application-defined or object-definded error

формула является работая, если я скопирую его, поэтому я предполагаю, что это синтаксическая ошибка.

+2

Что делать, если вы замените ';' на ''? –

+0

Это работает. Спасибо за быстрый ответ. – DisplayName

+0

Я добавил ответ на сообщение. –

ответ

1

Правильный код:

Sheets("Output").Range("T2").Formula = _ 
    "=CONCATENATE(TEXT(C2,""MM/DD/JJJJ""),""-"",TEXT(S2,""MM/DD/JJJJ""))" 
+0

* Переход к региональным настройкам, символу разделителя списка изменений в '' 'pipe, разбивает все макросы VBA. * –

3

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) 
Смежные вопросы