Страницы: 1
RSS
Об элементе управления Textbox
 
Несколько задач по теме (не таких простых, как кажется на первый взгляд).  :)
Описание примера (во вложении).
В ячейке 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, Владимир, приветствую! Благодарю за науку!  :idea:
Подробно разбирать сейчас не могу, но закладку создал. Как столкнусь - отчитаюсь  :)
Изменено: Jack Famous - 28.10.2022 08:50:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Владимир, спасибо за еще один замечательный нюанс!
Свойство по умолчанию Value с типом Variant творят чудеса...
 
немного изменил пример
Изменено: Msi2102 - 28.10.2022 14:22:51
 
Коллеги, спасибо за внимание к теме! Предлагаю дать заинтересованным читателям еще пару дней на размышления...
Владимир
 
Цитата
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

Дискуссию попросили отложить на пару дней, чтобы самостоятельно поразмышлять над этим казусом.
Владимир
 
Цитата
sokol92 написал:
Ответы
значит я предположил правильно, т.к. не раз с этим сталкивался. Но повторюсь: на офисе 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
 
Цитата
Msi2102 написал:
Офис LTSC профессиональный плюс 2021 версия 2107(сборка 14228.20204)
Спасибо за тестирование! Результаты соответствуют #7.
Изменено: sokol92 - 28.10.2022 17:27:09
Владимир
 
Вот ещё особенность только ListBox
Если в ячейке стоят числовые значения с форматом ячейки "00000", т.е. просто добавляет ноли
При
Код
Me.ListBox1.List = Range("A1:A3").Value
будут вставлены значения как 1; 2; 3
А при
Код
Me.ListBox2.RowSource = "A1:A3"
с учетом формата ячейки: 000001; 000002; 000003
Изменено: Msi2102 - 28.10.2022 17:29:43
 
Итак, попробуем объяснить ответы, приведенные в #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 конфигурации.
Изменено: sokol92 - 30.10.2022 16:59:47
Владимир
Страницы: 1
Наверх