Несколько задач по теме (не таких простых, как кажется на первый взгляд). Описание примера (во вложении). В ячейке A1 содержится дата 12.01.2022. Форма UserForm1 содержит элементы управления TextBox1, CommandButton1 (текст: From A1), CommandButton2 (текст: To A2:A3). Макросы формы:
Код
Private Sub CommandButton1_Click()
Me.TextBox1 = Range("A1").Value
End Sub
Private Sub CommandButton2_Click()
Range("A2").Value = Me.TextBox1
Range("A3").Value = Me.TextBox1.Text
End Sub
Задача 1. Что будет в Textbox1 и ячейках A2:A3 после последовательного нажатия кнопок "From A1" и "To A2:A3"? Попробуйте решить без Excel, далее проверьте в Excel и объясните результаты.
Задача 2. Меняем присвоение в первом макросе на
Код
Me.TextBox1.Text = Range("A1").Value
Далее, как в задаче 1.
Возможно, для объяснения результатов может пригодиться эта тема.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
sokol92 написал: Меняем присвоение в первом макросе на
Не имею возможности проверить сейчас нюанс о котором идет речь, но полагаю, что без указания явного свойства будет записана дата в англ.формате(сначала в TextBox, затем и в ячейки - что логично). Однако в моем офисе 365 это ни на что не влияет и дата записывается ровно так, как должна и с .Text и без него(как ни странно). Хотя в более ранних версиях этот косяк я всегда объезжал принудительным форматированием, что делаю до сих пор. Или я что-то не так понял и вообще не в ту сторону смотрю?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Здравствуйте, Дмитрий! Ответы для конфигурации Excel 2016 (ru-RU). 1. В Textbox будет текст 1/12/2022 ; в ячейкe A2 текст 1/12/2022 ; в ячейке A3 дата 12.01.2022 2. В Textbox будет текст 12.01.2022 ; в ячейках A2 и A3 текст 12.01.2022
Ответы для конфигурации Excel 2019 (en-US). 1 и 2. В Textbox будет текст 1/12/2022 ; в ячейкe A2 текст 1/12/2022 ; в ячейке A3 дата 1/12/2022
Дискуссию попросили отложить на пару дней, чтобы самостоятельно поразмышлять над этим казусом.
значит я предположил правильно, т.к. не раз с этим сталкивался. Но повторюсь: на офисе 365, версия 2209(сборка 15629.20208) - этот косяк отсутствует и дата вносится корректно как в TextBox, так и в ячейки(за исключением того, что в ячейках не реальная дата, а текст при любом раскладе).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Офис LTSC профессиональный плюс 2021 версия 2107(сборка 14228.20204)
Код
Private Sub CommandButton1_Click()
Me.TextBox1.Text = Range("A1").Value
Me.TextBox2.Value = Range("A1").Value
End Sub
Private Sub CommandButton2_Click()
Range("A2").Value = Me.TextBox1
Range("A3").Value = Me.TextBox1.Text
Range("B2").Value = Me.TextBox2
Range("B3").Value = Me.TextBox2.Text
End Sub
Итак, попробуем объяснить ответы, приведенные в #7 для конфигурации Excel 2016 (ru-RU). Выводы не основаны на анализе исходного текста Excel и, следовательно, являются гипотезами. Надеюсь, квалифицированные читатели простят подробность изложения.
Задача 1. Поскольку при приcвоении Me.TextBox1 свойство не указано, то будет использовано свойство по умолчанию. В редакторе VBE открываем Project Explorer (F2) и ищем TextBox. Свойством по умолчанию (помечено цветом) MSForms.Textbox является Value типа Variant. Следовательно, правая часть оператора присваивания (Range("A1").Value) типа Date будет передана без преобразования (в VBA) методу объекта, который отвечает за присвоение свойства.
Свойства и методы объектов MSForms и Excel не локализованы (кроме тех, где учет локализации указан явно, например Range.FormulaLocal). Соответственно, дата будет преобразована в текст в соответствии с правилами для локализации en-US и после присвоения Textbox1.Value будет содержать в нашем случае текст 1/12/2022 (M/D/YYYY) .
Теперь о присвоении значений ячейкам A2 и A3. Для ячейки A2 в правой части оператора присваивания указан объект. Согласно пункту 6 Сообщения в ячейку будет занесено значения объекта по умолчанию, то есть Textbox1.Value. Таким образом, в A2 будет текст 1/12/2022 . Для свойства Value ячейки A3 в правой части оператора присвоения содержится текст - это пункт 4 Сообщения. Выполняются условия подпункта 4.6, в ячейку заносится число, соответствующее дате 12.01.2022 (что мы и видим).
Задача 2. Свойство Text объекта MSForms.Textbox имеет тип String. Соответственно, в VBA правая часть оператора присваивания (дата) будет неявно преобразована в текст. В VBA при преобразовании типов локализация учитывается. Соответственно, после присвоения Textbox1.Value будет содержать 12.01.2022 . При присвоения значений ячейкам A2 и A3 применяется пункт 4 Сообщения. Поскольку текст 12.01.2022 не может быть интерпретирован как число или дата в локализации en-US, то это значение и заносится в ячейки.
К сожалению, у меня нет возможности провести анализ для указанной Дмитрием в сообщении #8 конфигурации.