使用Excel VBA在TextBox中创建公式

时间:2015-12-05 05:51:55

标签: excel vba excel-vba excel-2010

有没有人知道Excel 2010中的userform中的文本框是否可以像公式编辑器一样工作?

换句话说,当用户窗体启动且文本框是聚焦控件时,允许我输入say

var requestHandler = require("./handler.js");
var server = require("http").createServer();
server.on("request", requestHandler);
server.listen(8080);

// check if HMR is enabled
if(module.hot) {
    // accept update of dependency
    module.hot.accept("./handler.js", function() {
        // replace request handler of server
        server.removeListener("request", requestHandler);
        requestHandler = require("./handler.js");
        server.on("request", requestHandler);
    });
}

然后单击单元格D2,然后将文本框设为

=AND( 

然后输入a =

=AND($D$2

然后单击单元格E2

=AND($D$2= 

然后输入)

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

我使用过RefEdit控件,但只要在工作表上选择了一个范围,它就会覆盖任何自定义文本,当我点击一个范围时,我基本上需要它附加到文本框。

3 个答案:

答案 0 :(得分:2)

将此代码放入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)时,选择的地址将附加到其上。如果您还需要添加工作表的名称,请更改上面的第3行:

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

如果您只需要在一张纸上使用它,请将代码放入该Sheet的代码而不是ThisWorkbook的代码。

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

请注意,将代码放入ThisWorkbook的SheetChange方法会造成损失:您将无法在此工作簿中使用撤消。

可以找到更优雅的方法来检查是否加载了Userform(这里)[http://www.ozgrid.com/forum/showthread.php?t=152892]。您可以使用它而不是On Error Goto部分。

答案 1 :(得分:1)

是的,这可以在TextBox中使用,但您遇到的问题是您需要无模式显示UserForm ,因为您需要选择显示Userform时工作表中的单元格。如果您想完全按照您的描述进行操作,即下一次击键是' =',那么您需要重新激活UserForm,否则您只需添加& #39; ='进入你选择的单元格。

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

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

然后,您可以从AppendText事件中调用WorkSheet_Change例程,或者在此情况下调用Workbook_SheetSelectionChange事件(适用于任何WorkSheet事件的选择{1}}):

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

如果您希望在TextBox打开时光标位于UserForm,那么也要添加此行:

UserForm1.ActivateByCode

答案 2 :(得分:0)

(代表作者提问)

检查选择更改是我缺少的。我专注于尝试让UserForm在Excel必须使用的所有其他事件上完全分开!

最后,我选中了SelectionChanged子,看看是否有一个更简单的UserForm(带文本框和恢复按钮的最小尺寸),文本框是否有效。

我添加了一些逻辑来处理插入文本框的光标位置以及直接追加。将来可能会为箭头键添加一些支持,但我已经设定了原始功能。

微软,如果您正在倾听,是否可以为我们提供一个RefEdit控件,其外观和行为与Excel内置的控件相似?只是一个想法。