当用户窗体可见时,Excel 2013模式VBA用户窗体更改Activeworkbook

时间:2016-11-01 18:43:49

标签: excel vba userform

在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

因此,一旦隐藏了表单,就会恢复原始工作簿窗口。但是显示用户窗体时,会显示其他不需要的工作簿窗口。任何提示都会非常有用。谢谢!

1 个答案:

答案 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

但是,有时我只是通过调用它而收到类型不匹配错误,即用户表单不是对象(!)。整个区域都是越野车,因此我避免使用此方法。

有时,只需重新创建用户表单即可解决此问题。并非适用于所有用户形式。而且我还没有找到触发器。