Excel Userform初始化时不重写单元格中的数据

Excel Userform初始化时不重写单元格中的数据,excel,vba,Excel,Vba,我一直在想这个问题有一段时间了 假设我在A1工作表(“主”)中有一个公式 然后我有了userform和代码: 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").Ra

我一直在想这个问题有一段时间了

假设我在A1工作表(“主”)中有一个公式

然后我有了userform和代码:

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。现在,如果我打开userform,它将用文本框中的文本覆盖A1,并且不再有公式。所以,若我在B2中更改语言,结果将不再连接到文本框中

也可以使用VBA使用其他方法。只要逻辑可行,一切都是可以接受的

我曾尝试正确使用文本框,比如linkedsource或类似的,但它有时会破坏excel工作簿。这就是为什么我试图避免它


编辑:

谢谢你的建议!我试图以某种方式实现这一点,但仍然没有得到它。我正在创建一个变量,用于存储来自
此工作簿的结果。工作表(“其他数据”)。范围(“L49”)。值
,然后我想在
用户表单Me.TextBox14.Text中使用它来显示。然后,一旦在Me.TextBox14.Text和Enter按钮中更改了它,它在
此工作簿中也应该更改。工作表(“其他数据”)。范围(“L49”)。值

以下是我当前尝试使用的代码:

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

TextBox.Enter
事件在用户按Enter键时不会触发,而是在输入控件时触发,即当控件获得焦点且插入符号/光标开始在其中闪烁时。修改该值时,您需要更新支持变量:

因此,在本例中,我将使用
TextBox.Change
事件处理程序,并使其更新变量(而不是工作表):

现在的问题是,需要从表单外部访问
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

这是因为您已将电子表格单元格直接链接到Textbox。您应该做的是使用一组本地变量,这些变量用于从电子表格中捕获信息并显示在文本框中,但在单击“确定”之前不会回写到电子表格中,如果单击“取消”,则不会回写到电子表格中。应该有帮助。也
Private ProjectClass As String

Private Sub TextBox14_Change()
    ProjectClass = TextBox14.Text
End Sub
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