2015-07-14 7 views
2

Я работаю над книгой, которая имеет заданное количество шаблонных вычислений, которые многократно используются в объеме скопированной книги. Объект формы был создан, когда пользователь должен ввести идентификатор для каждого набора вычислений, который соответствует определенному формату. Обычно это следует за «aaa - ## 0.00», где «aaa» представляет собой строку от 1 до 3 букв. Затем у формы есть поле со списком, которое очищается и заполняется при активации, которое содержит 258 предоставленных клиентом текстовых возможностей (чтобы уменьшить вероятность ошибки пользователя) с текстовым полем рядом с ним для ввода цифр. Когда нажата кнопка «выполнить», она идентифицирует выбранные вычисления, требуемые из пользовательской формы, копирует лист (ы) шаблона в конец рабочей книги и заполняет информацию идентификатора в нижней части списка на странице «Содержание». Вот соответствующий код:NumberFormat VBA с пользовательскими данными

Dim prefix As String 
Dim LocMP As Double 

'The digits are entered in txtLocMP 
LocMP = Val(txtLocMP.Value) 

'mpPrefixLst is the combo box, with 'prefix' being the desired custom format 
prefix = mpPrefixLst.Text & "-#0.00" 

При отладке, значение, хранящемся в «LocMP» и «префикс» появляется удовлетворительно с LocMP быть числом, а «префикс» быть желаемой строкой формата. Отсюда я попробовал пару различных вариантов. Первые,

With Contents 
'Contents is type WorkSheet, locCount is the number of entries in Contents 
'including the offset for the header 
    .Unprotect 
      'Other unrelated functions 
    .Range("C" & locCount).Value = Format(LocMP, prefix) 
      'Other unrelated functions 
    .Protect 
End With 

второй,

With Contents 
      'Other unrelated functions 
    With .Range("C" & locCount) 
     .Value = LocMP 
     .NumberFormat = prefix 
    End With 
      'Other unrelated functions 
End With 

Ни один из этих вариантов, хотя оба они имеют смысл для меня, дают желаемые результаты. Например, если предоставленный текст для «mpPrefixLst» равен «SFE», тогда мое значение «префикс» показывает, что оно равно «SFE- # 0.00», которое в точности соответствует ожидаемому. Когда значение 555.44 вводится для LocMP, результат в измененной ячейке равен «36FE- # 0.00», когда желаемым результатом будет «SFE-555.44»! Я искал этот сайт (и другие) даже для приблизительного решения, которое я мог бы приспособить, а веб-сайт MSDN вообще не помогает. Любая помощь будет принята с благодарностью!

+0

Как я уже сказал в своем редактировании, добавьте обратную косую черту между каждым литералом. http://i.imgur.com/FFRZr5G.png – user1274820

ответ

2

Поставьте обратную косую черту между символами:

Sub Test() 
Cells(1, 1).NumberFormat = GetFixedPrefix("SAE-") & "#0.00" 
End Sub 

Function GetFixedPrefix(prefix as String) as String 
Dim x, fixedPrefix 
fixedPrefix = "" 
For x = 1 to Len(prefix) 
    fixedPrefix = fixedPrefix & "\" & Mid(prefix,x,1) 
Next x 
GetFixedPrefix = fixedPrefix 
End Function 

Это делает ваш NumberFormat = \S\F\E\-#0.00 который должен отображаться правильно:

Image

Read More Here

Бэкслэш. Любой символ, появляющийся после обратной косой черты \, будет отображаться как литерал, хотя он может быть зарезервирован как оператор (скажем, %). Число 0,75 с кодом формата #.00% будет отформатировать до 75.00%, но с кодом формата #.00\% он будет отформатировать до .75%, т.е. формат кода не будет использовать % как оператор, а как литерал.

+1

Это работает! Интересно, почему он не рассматривался как текстовый литерал с самого начала? –

+0

Мое предположение: 'E-, а затем по крайней мере один символ« 0 »(в формате кода), отображает номер в научной нотации' – user1274820

+0

Хм ... Мне придется немного поучаствовать в этом. –