Инициализация пользовательской формы без перезаписи данных в ячейке - PullRequest
1 голос
/ 07 ноября 2019

Я некоторое время размышлял об этом.

Допустим, у меня есть формула в A1, Worksheet ("Main")

=IF(B2="English";"Good morning";"Guten Morgan")

Затем у меня есть пользовательская форма с кодом:

Private Sub TextBox1_Change()
ThisWorkbook.Worksheets("Main").Range("A1").Value = Me.TextBox1.Text
End Sub

Private Sub UserForm_Initialize()
Me.TextBox1.Text = ThisWorkbook.Worksheets("Main").Range("A1").Value
End Sub

Как мне сделатьэто работает так, что, если я ничего не введу в текстовое поле, он будет продолжать отображать результат функции. Если я начну печатать текст в текстовом поле, он введет мой набранный текст в A1. Теперь, если я открою пользовательскую форму, она перезапишет A1 текстом в текстовом поле, и формулы больше не будет. Поэтому, если я поменяю язык в B2, результат больше не будет отображаться в текстовом поле.

Может быть и другой подход с VBA. Все приемлемо, пока логика будет работать.

Я пытался правильно использовать текстовое поле, что-то вроде связанного источника или аналогичного, но иногда это приводит к сбою книги Excel. Вот почему я пытаюсь избежать этого.


РЕДАКТИРОВАТЬ:

Спасибо за предложения! Я пытался реализовать это как-то, но до сих пор не понимаю. Я создаю переменную, в которой я хочу сохранить результат из ThisWorkbook.Worksheets("Other Data").Range("L49").Value, тогда я хотел бы использовать его в Userform Me.TextBox14.Text для отображения. Затем, после того, как он был изменен в Me.TextBox14.Text и нажата кнопка Enter, он должен измениться также в ThisWorkbook.Worksheets("Other Data").Range("L49").Value.

Вот мой текущий код, с которым я пытаюсь играть:

Private ProjectClass As String

Private Sub TextBox14_Enter()
ThisWorkbook.Worksheets("Other Data").Range("L49").Value = ProjectClass
End Sub

Private Sub UserForm_Initialize()
Me.TextBox14.Text = ProjectClass
End Sub

1 Ответ

1 голос
/ 08 ноября 2019

Событие TextBox.Enter не вызывается, когда пользователь нажимает Ввод , но когда вводится элемент управления , то есть когда он получает фокус и курсор / курсорначинает мигать внутри него. Вы захотите обновить вспомогательную переменную, когда значение будет изменено :

Private Sub TextBox14_Enter()
    'runs when the control gets focus
End Sub

Private Sub TextBox14_Exit()
    'runs when the control loses focus
End Sub

Private Sub TextBox14_Change()
    'runs whenever the value changes (real-time)
End Sub

Так что в этом случае я бы использовал обработчик события TextBox.Change и обновил егопеременная (не рабочая таблица):

Private ProjectClass As String

Private Sub TextBox14_Change()
    ProjectClass = TextBox14.Text
End Sub

Теперь проблема в том, что значение ProjectClass должно быть доступно извне формы, чтобы вызывающая сторона могла установить начальное значение. Один из способов сделать это может состоять в том, чтобы представить его как свойство - одно свойство (get + let) для каждого поля, для которого нужно заполнить значение:

Public Property Get ProjClass() As String
    ProjClass = ProjectClass
End Property

Public Property Let ProjClass(ByVal value As String)
    ProjectClass = value
    ApplyModelProperties
End Property

Private Sub ApplyModelProperties()
    TextBox14.Text = ProjectClass
    '...
End Sub

Теперь вне формы, при вызовесайт (код, который показывает это диалоговое окно), вы можете заполнить значение из рабочего листа, и форма никогда не должна знать или заботиться о том, что рабочий лист был задействован:

With New UserForm1
    .ProjClass = ThisWorkbook.Worksheets("Other Data").Range("L49").Value
    .Show
    MsgBox .ProjClass
End With

Обратите внимание, что, поскольку значение открытокак свойство, вызывающему коду больше не нужно знать о TextBox14.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...