有人知道Excel 2010中的用户表单中的文本框是否可以像公式编辑器那样工作吗?
换句话说,当用户窗体打开,而textbox是焦点控件时,请允许我键入say
=AND(
然后单击单元格D2并拥有文本框,然后是
=AND($D$2
然后键入a=
=AND($D$2=
然后单击单元格E2
=AND($D$2=$E$2
然后输入)
=AND($D$2=$E$2)
我曾经使用过RefEdit控件,但是只要在工作表上选择了一个范围,它就会覆盖任何自定义文本,我基本上需要它在单击某个范围时将其附加到文本框中。
发布于 2015-12-05 09:34:07
将此代码放在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部件。
发布于 2015-12-05 11:32:03
是的,这在TextBox
中是可能的,但问题是您需要无模型地显示UserForm
,因为在显示Userform
时,您需要在工作表中选择单元格。如果您想按照您所描述的那样做(即下一个击键是'=‘),那么您将需要重新激活UserForm
,否则您只需在选定的单元格中添加一个'=’。
我相信Show
命令不会重新激活已经显示的无模式UserForm
,而且我也不知道UserForm
的Activate
命令。其他人很可能知道其中之一,但我会使用几个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
中选择单元格):
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
发布于 2017-10-27 13:20:33
(代表问题提交人发文)。
检查选择是否改变是我错过的。我是如此专注于使UserForm的行为,我完全间隔在所有其他事件,Excel必须处理!
最后,我在SelectionChanged子程序中进行了检查,查看一个简单的UserForm (文本框和还原按钮的最小大小)是否可见,文本框是否处于活动状态。
我添加了更多的逻辑来处理插入到文本框的光标位置以及直接附加的问题。将来可能会添加一些对箭头键的支持,但我有我设定的原始功能。
微软,如果你在听的话,有没有可能给我们一个RefEdit控件,它的外观和行为类似于一个内置在Excel中的控件?这只是个想法。
https://stackoverflow.com/questions/34101785
复制相似问题