首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Excel在TextBox中创建公式

使用Excel在TextBox中创建公式
EN

Stack Overflow用户
提问于 2015-12-05 05:51:54
回答 3查看 5.1K关注 0票数 2

有人知道Excel 2010中的用户表单中的文本框是否可以像公式编辑器那样工作吗?

换句话说,当用户窗体打开,而textbox是焦点控件时,请允许我键入say

代码语言:javascript
运行
复制
=AND( 

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

代码语言:javascript
运行
复制
=AND($D$2

然后键入a=

代码语言:javascript
运行
复制
=AND($D$2= 

然后单击单元格E2

代码语言:javascript
运行
复制
=AND($D$2=$E$2

然后输入)

代码语言:javascript
运行
复制
=AND($D$2=$E$2)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-05 09:34:07

将此代码放在ThisWorkbook模块中:

代码语言:javascript
运行
复制
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行:

代码语言:javascript
运行
复制
  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
EN

Stack Overflow用户

发布于 2015-12-05 11:32:03

是的,这在TextBox中是可能的,但问题是您需要无模型地显示UserForm,因为在显示Userform时,您需要在工作表中选择单元格。如果您想按照您所描述的那样做(即下一个击键是'=‘),那么您将需要重新激活UserForm,否则您只需在选定的单元格中添加一个'=’。

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

代码语言:javascript
运行
复制
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中选择单元格):

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
UserForm1.Show False

如果您希望在打开TextBox时光标在UserForm中,那么也添加以下行:

代码语言:javascript
运行
复制
UserForm1.ActivateByCode
票数 1
EN

Stack Overflow用户

发布于 2017-10-27 13:20:33

(代表问题提交人发文)。

检查选择是否改变是我错过的。我是如此专注于使UserForm的行为,我完全间隔在所有其他事件,Excel必须处理!

最后,我在SelectionChanged子程序中进行了检查,查看一个简单的UserForm (文本框和还原按钮的最小大小)是否可见,文本框是否处于活动状态。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34101785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档