用户窗体在不重写单元格中数据的情况下进行初始化



我想知道这个已经有一段时间了。

假设我在A1中有一个公式,工作表("主"(

=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

当用户按下Enter时,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

最新更新