【问题标题】:Create Formula in a TextBox using Excel VBA使用 Excel VBA 在文本框中创建公式
【发布时间】:2016-03-10 04:18:31
【问题描述】:

有谁知道是否可以在 Excel 2010 中的用户表单中使用文本框,就像公式编辑器一样工作?

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

=AND( 

然后单击单元格 D2 并让文本框成为

=AND($D$2

然后输入 a =

=AND($D$2= 

然后点击单元格E2

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

然后输入 )

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

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

【问题讨论】:

  • 您可以考虑使用工作表的 SelectionChange 事件来执行此操作。它需要跨工作表吗?
  • 你试试 Application.Inputbox 方法吗? Application.InputBox("Select cell.", Type:=8).Address 可能对你有帮助。

标签: vba excel excel-2010


【解决方案1】:

将此代码放入 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

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

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

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

可以找到更优雅的方式来检查用户窗体是否已加载(此处)[http://www.ozgrid.com/forum/showthread.php?t=152892].您可以使用它来代替 On Error Goto 部分。

【讨论】:

    【解决方案2】:

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

    我相信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
    

    然后,您将从WorkSheet_Change 事件或Workbook_SheetSelectionChange 事件(在本例中用于选择任何WorkSheet 中的单元格)调用AppendText 例程:

    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
    

    【讨论】:

      【解决方案3】:

      (代表问题作者发布).

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

      最后,我在 SelectionChanged 子中进行了检查,以查看是否可以看到更简单的 UserForm(带有文本框和恢复按钮的最小尺寸)并且文本框处于活动状态。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 2017-04-24
        • 1970-01-01
        相关资源
        最近更新 更多