use*_*059 13 vba ms-access-2007 access-vba sendkeys
我有一个Access窗体的以下代码.当我打开和关闭表单时,似乎SendKeys是NumLock在打开和关闭它时弄乱了我的键.
出于完全正确的原因,我不想进入,我真的不想完全隐藏功能区(我希望下拉菜单仍然可访问)所以DoCmd.ShowToolbar命令不是我喜欢的方式.
有没有人有任何建议,我如何修改下面的代码,以完成我想要的SendKeys命令使用?
使用Access 2007这样的命令
CommandBars.ExecuteMso "MinimizeRibbon"
Run Code Online (Sandbox Code Playgroud)
不适合我.
顺便说一句,数据库将被分发,因此解决方案必须包含在数据库中.
Private Sub Form_Close()
' Unhide navigation pane
DoCmd.NavigateTo "acNavigationCategoryObjectType"
DoCmd.Maximize
' Maximize the ribbon
RibbonState = (CommandBars("Ribbon").Controls(1).Height < 75)
Select Case RibbonState
Case True
SendKeys "^{F1}", True
Case False
'Do nothing, already maximized
End Select
End Sub
Private Sub Form_Load()
' Hide navigation pane
DoCmd.NavigateTo "acNavigationCategoryObjectType"
DoCmd.Minimize
Debug.Print Application.CommandBars.Item("Ribbon").Height
' Minimize ribbon
RibbonState = (CommandBars("Ribbon").Controls(1).Height < 100)
Select Case RibbonState
Case True
'Do nothing, already minimized
Case False
SendKeys "^{F1}", False
End Select
End Sub
Run Code Online (Sandbox Code Playgroud)
ice*_*d76 15
这是Microsoft VBA中的一个错误.但有一个解决方法.
使用F8通过宏运行,并找到它关闭它.通常在经过一段时间后SendKeys.
然后Sendkeys "{NUMLOCK}", True在行后添加一个
反转效果.
如果你找不到它,只需在最后添加它,当它结束时,它将返回.希望,如果你在显示/隐藏过程中添加它,它将起作用.
小智 8
我有类似的问题,我在一些 vba 论坛上找到了解决方案。您可以像这样模拟 kyes,而不是有缺陷的 Sendkeys。
Option Explicit
'//WIN32API Declare
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
'//WIN32API Constant
Public Const KEYEVENTF_EXTENDEDKEY = &H1
Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_CONTROL = &H11
Public Const VK_SHIFT = &H10
Public Const VK_F6 = &H75
Public Function PreviousTab()
keybd_event VK_CONTROL, 0, 0, 0
keybd_event VK_SHIFT, 0, 0, 0
keybd_event VK_F6, 0, 0, 0
keybd_event VK_F6, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
End Function
Run Code Online (Sandbox Code Playgroud)
其他键可以在这里找到vba 论坛 这个“previousTab”功能只是发送 Control+Shift+F6 键。
小智 7
这是由以下原因引起的:
Sendkeys "any key", False
Run Code Online (Sandbox Code Playgroud)
而不是False作为第二个参数,使用True.
当您在代码中执行最后的 sendKeys 命令时,在语句中添加 {NUMLOCK} 可能会达到目的,正如 RodB 和iceBird76 所指出的那样。但这不是一种良好的编码实践,原因如下:如果运行宏时每次有任何不同,则它可能有效也可能无效。我知道这一点是因为我自己也遇到过类似的问题。当我在程序结束时执行 sendKeys 命令时,有时 Num Lock 会保持打开状态,但有时它会保持关闭状态,这仅取决于电子表格中的某些变量(无论我是否在其中包含 {NUMLOCK}我最后的 SendKeys 声明)。
我不会详细介绍我自己的变量,但要点是,要构建一个程序/宏,使您的数字锁保持一致,您需要首先测试看看数字锁是打开还是关闭,然后根据当前条件执行代码。
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const kNumlock = 144
Public Function NumLock() As Boolean
NumLock = KeyState(kNumlock)
If (NumLock = True) Then
MsgBox ("Num lock was off. Will turn back on now...")
SendKeys "{NUMLOCK}", True
Else: MsgBox ("Num Lock stayed on")
End If
End Function
Private Function KeyState(lKey As Long) As Boolean
KeyState = CBool(GetKeyState(lKey))
End Function
Sub myMainMethod()
'do a function here that includes .SendKeys
Call NumLock
End Sub
Run Code Online (Sandbox Code Playgroud)
该示例程序将向您显示 Num Lock 是否打开或关闭的确认消息,如果关闭则将其打开。
小智 7
VBA 内置的 SendKeys() 函数确实有一个副作用,会导致 NumLock 被停用。但是您可以使用解决方法并调用属于 WSCRIPT 组件(Windows 操作系统的一部分)的同一函数的另一个实现。以下示例代码显示了如何引用该组件,然后调用其方法:
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^g", True
Run Code Online (Sandbox Code Playgroud)
这样,您可以获得相同的功能(在示例中调用 Ctrl-G 键盘快捷键),但在这种情况下 NumLock 没有问题。
小智 5
在 SendKeys 语句之后添加以下两行:
DoEvents
SendKeys "{NUMLOCK}{NUMLOCK}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32510 次 |
| 最近记录: |