在Excel 2013(Office 15)中,快捷方式和非常简单的用户窗体(用于格式化)的组合有时会导致活动工作簿消失,并且无理由显示另一个工作簿(有时只会在更改后发生) activeworkbook)。我正在尝试将当前工作簿窗口保留在前台,同时显示格式化用户窗体但没有成功。
这是我的代码:
Sub AssignKeys()
Application.OnKey "^%,", "MakeBlue"
End Sub
Sub MakeBlue()
frmFormat.Show
End Sub
frmFormat是一个非常简单的小表单,只有一个文本框,其中输入格式代码。在使用以下代码隐藏模式窗体后,它可以恢复以前活动的工作簿:
Private Declare PtrSafe Function SetForegroundWindow Lib "USER32" (ByVal hWnd As LongPtr) As LongPtr
Public Sub MyAppActive(Handle As Long)
Dim lngStatus As LongPtr
lngStatus = SetForegroundWindow(Handle)
End Sub
Private Sub tbShortcut_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If tbShortcut.Text <> "xn" Then
Dim mySel As Range
Dim myWb As workBook
Dim myWnd As Window
Set myWnd = ActiveWindow
Set mySel = Selection
Set myWb = ActiveWorkbook
Debug.Print mySel.Address
Me.Hide
'mySel.Parent.Parent.Activate
myWb.Activate
myWnd.Activate
MyAppActive myWnd.hWnd
end if
end sub
因此,一旦隐藏了表单,就会恢复原始工作簿窗口。但是显示用户窗体时,会显示其他不需要的工作簿窗口。任何提示都会非常有用。谢谢!
答案 0 :(得分:0)
以下内容似乎在大多数时间都有效。似乎需要OnTime。我怀疑Microsoft错误与功能区有关。
fsShow myUserForm
Sub fsShow(form As Object)
' Work around bug that form.show changes active window rather randomly
' (Only the displayed window is wrong, not the ActiveCell.parent.parent.)
Set fsActiveWindow = Application.ActiveWindow
form.Show
Application.OnTime Now(), "fsResetActiveWindowOnTime"
End Sub
Sub fsResetActiveWindowOnTime()
If Not fsActiveWindow Is Nothing Then
fsActiveWindow.Activate
Set fsActiveWindow = Nothing
End If
End Sub
但是,有时我只是通过调用它而收到类型不匹配错误,即用户表单不是对象(!)。整个区域都是越野车,因此我避免使用此方法。
有时,只需重新创建用户表单即可解决此问题。并非适用于所有用户形式。而且我还没有找到触发器。