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

有谁知道是否有可能在Excel 2010中的用户窗体中的文本框工作,如公式编辑器?

换句话说,当用户表单启动,文本框是集中控制允许我键入说

=AND( 

然后单击单元格D2,然后有文本框

 =AND($D$2 

然后键入a =

 =AND($D$2= 

然后点击单元格E2

 =AND($D$2=$E$2 

然后键入)

 =AND($D$2=$E$2) 

我已经玩过了RefEdit控件,但是只要在表单上select一个范围,就会覆盖任何自定义文本,当我单击一个范围时,我基本上需要将它添加到文本框中。

把这个代码放在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 

这样,当你的用户表单加载(UserForm1这里),你的文本框是活动的(TextBox1这里),select的地址被附加到它。 如果您还需要添加工作表的名称,请更改上面的第三行:

  UserForm1.TextBox1.Value = UserForm1.TextBox1.Value & sh.Name & "!" & Target.Address 

如果您只需要在一张纸上使用它,请将代码放在该工作表的代码中,而不要放在ThisWorkbook的代码中。

它不像公式编辑器那样复杂,因为它总是追加select。 (如果你需要更改插入的引用也是可行的,只需稍微检查一下。)

请注意,将代码放入ThisWorkbook的SheetChange方法会带来收益:您将无法在此工作簿中使用“撤消”。

一个更加优雅的方式来检查用户窗体是否加载可以在这里find[ http://www.ozgrid.com/forum/showthread.php?t=152892%5D 。 你可以使用这个来代替On Error Goto部分。

是的,这在TextBox是可行的,但是您遇到的问题是您需要无模式地显示UserForm因为您需要在Userform显示时Userform工作表中的单元格。 如果您想完全按照您所描述的方式进行操作,即下一个按键是“=”,那么您将需要重新激活UserForm否则您只需在所选单元格中添加“=”。

我相信Show命令将不会重新激活已显示的无模式UserForm ,而且我不知道UserFormActivate命令。 其他人可能知道一个,但我会用几个API来完成这个工作。 因此,您的用户Userform中的Userform可能如下(如果您有Win64和/或VB7,您可能需要调整API声明https://msdn.microsoft.com/en-us/library/office/ee691831(v=office .14).aspx ):

 Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetFocusAPI Lib "user32" Alias "SetForegroundWindow" _ (ByVal hwnd As Long) As Long Private mHwnd As Long Private mTextBoxHasFocus As Boolean Public Property Get TextBoxHasFocus() TextBoxHasFocus = mTextBoxHasFocus End Property Public Sub AppendText(appendedText As String) 'Add the text to textbox TextBox1.Text = TextBox1.Text & appendedText 'Activate this userform window SetFocusAPI mHwnd 'API doesn't trigger UserForm_Activate event so call it Me.ActivateByCode End Sub Private Sub TextBox1_Enter() mTextBoxHasFocus = True End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) mTextBoxHasFocus = False End Sub Public Sub ActivateByCode() 'Set focus on any another control then back to textbox btnSave.SetFocus 'Set cursor at end of text TextBox1.SelStart = Len(TextBox1.Text) TextBox1.SelLength = 0 TextBox1.SetFocus End Sub Private Sub UserForm_Initialize() 'Acquire the handle for this window mHwnd = FindWindow("ThunderDFrame", Me.Caption) End Sub 

然后,您可以从WorkSheet_Change事件中调用AppendText例程,或者在这种情况下调用Workbook_SheetSelectionChange事件(可以select任何WorkSheet中的单元格):

 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 

并记住无模式地显示您的UserForm

 UserForm1.Show False 

如果您想在UserForm打开时将光标放在TextBox ,则还要添加以下行:

 UserForm1.ActivateByCode 

(发表代表作者的问题)

检查改变的select是我失踪。 我是专注于使用户窗体行为我完全隔开所有其他事件Excel必须处理!

最后,我去了SelectionChanged中的一个检查,看看是否一个更简单的用户窗体(文本框和还原button的最小大小)是可见的,文本框是活动的。

我添加了一些更多的逻辑来处理插入到文本框的光标位置,以及直接附加。 未来可能会增加一些对箭头键的支持,但是我拥有我设定的原始function。

微软,如果你在听,是否有可能给我们一个RefEdit控件,它的外观和行为与Excel中内置的一样? 只是一个想法。