有没有人知道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控件,但只要在工作表上选择了一个范围,它就会覆盖任何自定义文本,当我点击一个范围时,我基本上需要它附加到文本框。
答案 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内置的控件相似?只是一个想法。