Информирую о том, что в Windows 10 библиотека FM20.DLL элементов формы MSForms как в 32-х, так и в 64-х битных версий Office работает с преобразованием десятичных чисел в текстовое значение контролов TextBox, ListBox и ComboBox иначе, чем это было ранее. Возможно, конечно, что это какие-то особенности установки Office, но проявляется не только у меня - неплохо было бы проверить и на других компьютерах с Win10. У меня в Win10 64 бит проблема есть как в 32 битной версии Excel 2010, так и в 64-битной версии Excel 2016.
Проблема проявляется, когда в качестве разделителя целой и дробной части десятичного числа в операционной системе используется не точка, а запятая, как в русской локализации. Если ранее VBA код TextBox1 = 1.23 или TextBox1.Value = 1.23 помещал в TextBox1 текстовое значение 1,23 с запятой, то теперь в Win10 помещает текстовое 1.23 с точкой. И получается, что IsNumeric(TextBox1.Value) = False, а CDbl(TextBox1.Value) приводит к ошибке, чего ранее не было.
Обойти проблему можно использованием TextBox1.Text = 1.23 или TextBox1.Value = CStr(1.23), тогда в результате будет запятая, а не точка. Здесь 1.23 - число для примера, понятно, что это число может быть задано неявно, например, как Range("A1").Value и т.п.
Хуже обстоит дело с элементами ListBox и ComboBox, которые так ListBox1.List = Range("A1:A4").Value теперь тоже заполняются с использованием точки вместо запятой в качестве разделителя целой и дробной частей числа. Можно, конечно, применять ListBox1.AddItem CStr(1.34) , но это медленнее. В других элементах MSForms нет такой проблемы, например, Label2 = 1.23 помещает, как и ранее, текстовое значение 1,23 с запятой.
В принципе, то, что TextBox1.Value теперь независимо от локализации, а TextBox1.Text – зависимо, может быть интересным, но все же это явная ошибка совместимости версий, прошу учесть всем, у кого в коде это критично.
ZVI, спасибо за информацию. Сам на 10 не работал плотно, но рано или поздно придётся.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Михаил, спасибо, что проверили! Конечно, обновленная FM20.DLL виновата. Насколько помню, эта библиотека существенно менялась в конце 2016г. В ней названия элементов (всплывающие подсказки) на VBE-Toolbox для форм русской локализации стали на английском языке, а некоторые элементы там частично с синим цветом.
Здравствуйте, коллеги! Выполнил следующий тест на нескольких конфигурациях: Win XP + Excel 2003, Win XP + Excel 2007, Win 7 + Excel 2007, Win 10 + Excel 2016. На всех системах в региональных настройках разделителем между целой и дробной частью является запятая.
Код
Sub test()
Load UserForm1
With UserForm1
.TextBox1 = 0.5
Debug.Print .TextBox1
.TextBox1 = Now
Debug.Print .TextBox1
End With
End Sub
На всех конфигурациях формат результата выглядит следующим образом
Код
0.5
7/2/2019 11:40:10 AM
Таким образом, выводы сообщения #1 применимы и к иным конфигурациям (Win XP - самая старая система, которая у нас в компании есть).
По-своему, даже логично , игнорирование региональных надстроек при присвоении свойства value ячейкам мы на форуме обсуждали
Fm20.dll из Windows XP имеет версию 12.0.4518.1014 от 27.10.2006.
Последний крупный пакет обновлений для Windows XP установлен c датами изменения отдельных файлов *.dll от 25.08.2016, что корреспондирует с периодом из #4.
sokol92 написал: На всех конфигурациях формат результата выглядит следующим образом... 0.5
Владимир, у меня на старом компьютере с русифицированной Windows XP Proffesional SP3 в Excel 2003, 2007, 2010 - везде при TextBox.Value = 1.23 записывается "1,23" с запятой. То есть, разделитель в TextBox соответствует разделителю операционной системы (запятая).
"Resolution: I copied my current Windword.BOX and Excel.BOX files from my Windows 7 device (known working without issues) to my Windows 10 and that fixed the issue. Note: My Windows 7 and Windows 10 are both running Office 2016."
Сокращённый перевод: скопировать файл Excel.box с "рабочей" станции на "проблемную"
Файл *.BOX находится здесь: C:\Users\(your computer user)\application data\Microsoft\forms\EXCEL.box
Кто-то файл *.box переименовывает и тогда создаётся новый файл. Но это на ОДИН раз. Переменовывать можно *.bat файлом, кмк...