VBA Word: как разрешить VBA игнорировать разделитель 1000 при вычислении полей формы?

Мне нужна твоя помощь с этим. У меня есть небольшой код, который суммирует значение 10 полей формы. Формат этого поля формы задается разделителем 1000. Проблема, с которой я столкнулся, заключается в том, что VBA теперь возвращает значение, подобное 1.000, как 1. Другими словами: 1 + 10 + 100 + 1.000 = 112. Как я могу настроить код так, чтобы он игнорировал разделитель 1000 при вычислении этих полей формы? Любая помощь высоко ценится!

ActiveDocument.FormFields("voattot").Result = Val(ActiveDocument.FormFields("betvoat1").Result) _
+ Val(ActiveDocument.FormFields("betvoat2").Result) + Val(ActiveDocument.FormFields("betvoat3").Result) _
+ Val(ActiveDocument.FormFields("betvoat4").Result) + Val(ActiveDocument.FormFields("betvoat5").Result) _
+ Val(ActiveDocument.FormFields("betvoat6").Result) + Val(ActiveDocument.FormFields("betvoat7").Result) _
+ Val(ActiveDocument.FormFields("betvoat8").Result) + Val(ActiveDocument.FormFields("betvoat9").Result) _
+ Val(ActiveDocument.FormFields("betvoat10").Result)

person RobK    schedule 21.08.2014    source источник


Ответы (1)


Я бы создал отдельную функцию для анализа строки результата из поля формы

Function GetFieldValue(FieldName as string)
Dim FF As FormField 
Dim Result As String
Dim Value As Double


Set FF = ActiveDocument.Formfields(FieldName)'Find the Form Field
Result = FF.Result                           'Get the Text from the Form Field
Result = Replace(Result, ",", "")            'Remove any commas
If Trim(Result) ="" Then
    GetFieldValue= 0                         'Return the numeric valu
ElseIf Isnumeric(Result) Then
    Value = CDbl(Result)                         'Convert to numeric value
    GetFieldValue= Value                          'Return the numeric value
Else
    Debug.Print "Not IsNumeric(""" & Result & """)"
    GetFieldValue= 0
End If
End Function

И тогда вы можете написать свое заявление как

ActiveDocument.FormFields("voattot").Result = GetFieldValue("betvoat1") _
+ GetFieldValue("betvoat2") + GetFieldValue("betvoat3") _
+ GetFieldValue("betvoat4") + GetFieldValue("betvoat5") _
+ GetFieldValue("betvoat6") + GetFieldValue("betvoat7") _
+ GetFieldValue("betvoat8") + GetFieldValue("betvoat9") _
+ GetFieldValue("betvoat10")

Это также означает, что вы можете включить перехват ошибок в свою функцию для работы с пустыми или нечисловыми значениями или отсутствующими полями формы. Стоит ли возиться с этим - решать вам

person Tom Page    schedule 21.08.2014
comment
Большое спасибо! Все это выглядит очень логично, но я новичок в VBA, никогда раньше не работал с функциями и не могу заставить его работать. Я пробовал несколько вещей, но мне кажется наиболее логичным отделить функцию от подпрограммы с этим вычислением. Когда я запускаю сценарий, он продолжает выдавать ошибку: Ошибка компиляции: подпрограмма или функция не определены. Что я здесь делаю не так? - person RobK; 22.08.2014
comment
Чтобы быть ясным: мне нужно выполнить расчет в Sub, так как я хочу, чтобы код запускался после некоторых других кодов, которые находятся в том же Sub. - person RobK; 22.08.2014
comment
поместите определение функции вне определения Sub. Функция будет оцениваться как часть Sub. - person Tom Page; 22.08.2014
comment
Это не работает. Выдает такое же сообщение об ошибке, как я упоминал выше :( - person RobK; 22.08.2014
comment
Дох! Я назвал его GetFieldVal в определении и GetFieldValue в дополнительном теле. Неудивительно, что он не смог найти функцию, определенную под этим именем. Я отредактирую свой ответ, чтобы исправить это - person Tom Page; 23.08.2014
comment
Спасибо! Теперь это ведет меня дальше, но дает мне ошибку времени выполнения 13: Несоответствие типа в строке Value = CDbl (Результат) функции. Я сам пытался найти решение, но боюсь, что мои знания недостаточно развиты :( Ваша помощь будет очень признательна! - person RobK; 25.08.2014
comment
Я предполагаю, что у вас есть пустые поля, результатом которых является пустая строка, и поэтому, когда вы пытаетесь оценить CDbl (), вы получаете эту ошибку. Я добавил оператор If, чтобы уловить этот особый случай. Он также будет записывать в поток отладки, если есть какие-либо другие нечисловые значения, которые не могут быть преобразованы. Вы можете прочитать вывод отладки в немедленном окне (Ctrl + G, чтобы показать) - person Tom Page; 26.08.2014
comment
Да, это работает! Ты мой герой дня. Спасибо, что уделили этому столько времени. Не имел в виду, что кто-то напишет код для меня, но вы буквально это сделали, и я очень ценю это. Большое спасибо! - person RobK; 26.08.2014
comment
Иногда проще показать, чем объяснить, как писать - person Tom Page; 26.08.2014