使用Excel VBA在文本框中创建公式

使用Excel VBA在文本框中创建公式,vba,excel,excel-2010,Vba,Excel,Excel 2010,有人知道在Excel2010的用户表单中是否可以像公式编辑器一样使用文本框吗 换句话说,当userform启动并且textbox是焦点控件时,允许我键入say =AND( 然后单击单元格D2,然后显示文本框 =AND($D$2 那么a型= =AND($D$2= 然后单击单元格E2 =AND($D$2=$E$2 然后输入) 我已经使用了RefEdit控件,但它只会在工作表上选择一个范围后立即覆盖任何自定义文本,我基本上需要在单击范围时将其附加到文本框中。将此代码放入ThisWorkbo

有人知道在Excel2010的用户表单中是否可以像公式编辑器一样使用文本框吗

换句话说,当userform启动并且textbox是焦点控件时,允许我键入say

=AND( 
然后单击单元格D2,然后显示文本框

=AND($D$2
那么a型=

=AND($D$2= 
然后单击单元格E2

=AND($D$2=$E$2
然后输入)


我已经使用了RefEdit控件,但它只会在工作表上选择一个范围后立即覆盖任何自定义文本,我基本上需要在单击范围时将其附加到文本框中。

将此代码放入ThisWorkbook模块:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error GoTo EndOfSub

If UserForm1.ActiveControl.Name = "TextBox1" Then
  UserForm1.TextBox1.Value = UserForm1.TextBox1.Value & Target.Address
End If

EndOfSub:

End Sub
这样,当您的userform被加载(这里是UserForm1)并且您的textbox处于活动状态(这里是TextBox1)时,所选内容的地址就会附加到它上面。如果还需要添加工作表的名称,请更改上面的第三行:

  UserForm1.TextBox1.Value = UserForm1.TextBox1.Value & sh.Name & "!" & Target.Address
若您只需要在一张工作表上使用它,请将代码放在该工作表的代码中,而不是放在该工作簿的代码中

它不像公式编辑器那样复杂,因为它总是附加选择。(如果需要,更改刚刚插入的引用也是可行的,只需进行更多检查。)

请注意,将代码放入this工作簿的SheetChange方法会付出代价:您将无法在此工作簿中使用“撤消”


可以找到一种更优雅的方法来检查是否加载了Userform(此处)[.您可以使用此选项,而不是错误转到部分。

是的,这在
文本框中是可能的,但您遇到的问题是,您需要无模式地显示
用户表单
,因为在显示
用户表单
时,您需要在工作表中选择单元格。如果您想完全按照您所描述的操作,即xt击键为“=”,则需要重新激活
UserForm
,否则只需在所选单元格中添加一个“=”

我相信
Show
命令不会重新激活已经在显示的无模式
UserForm
,我不知道
activate
命令用于
UserForm
。其他人可能很清楚,但我会使用一些API来完成这项工作。因此
UserForm
中的代码可能如下(如果您有Win64和/或VB7,则可能需要调整API声明):

然后,您可以从
工作表\u Change
事件调用
AppendText
例程,或者在本例中,从
工作簿\u sheet selectionchange
事件调用
AppendText
例程(该例程用于选择任何
工作表中的单元格):

请记住以无模式显示您的
UserForm

UserForm1.Show False
如果要在用户窗体打开时将光标置于
文本框中
,请也添加此行:

UserForm1.ActivateByCode
(代表问题作者张贴)

检查所选内容是否已更改是我所缺少的。我非常专注于尝试使UserForm正常运行,我完全忽略了Excel必须处理的所有其他事件

最后,我在SelectionChanged子项中进行了检查,以查看是否有一个更简单的用户表单(最小大小,带有textbox和restore按钮),并且textbox是否处于活动状态

我添加了更多的逻辑来处理插入文本框的光标位置以及直接追加。将来可能会添加一些对箭头键的支持,但我有我最初设定的功能


Microsoft,如果您正在收听,是否可以为我们提供一个外观和行为与Excel中内置控件类似的RefEdit控件?只是想一想。

您可以研究使用工作表的SelectionChange事件来完成此操作。它是否需要跨工作表工作?是否尝试Application.Inputbox方法?Application.Inputbox方法(“选择单元格”,类型:=8)。它可能对您有所帮助。
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If UserForm1.TextBoxHasFocus Then
        UserForm1.AppendText Target.Address
        'Uncomment the line below if you want sheet name as well as address
        'UserForm1.AppendText Sh.Name & "!" & Target.Address
    End If
End Sub
UserForm1.Show False
UserForm1.ActivateByCode