2014-09-22 18 views
7

我對Access窗體有以下代碼。看起來好像SendKeys與我的 NumLock關鍵在於打開和關閉表單時打開和關閉它。SendKeys通過訪問形式的VBA代碼搞亂了我的NumLock密鑰

由於完全有效的原因,我不想進入,我真的不想完全隱藏功能區(我希望下拉菜單仍然可以訪問),所以DoCmd.ShowToolbar命令不是我的首選方式。

有沒有人有任何建議,我可以如何修改下面的代碼來完成我想要使用SendKeys命令?

使用Access 2007,以便命令

CommandBars.ExecuteMso "MinimizeRibbon" 

沒有提供給我。

順便說一下,數據庫將被分發,所以解決方案必須包含在數據庫中。

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 
+1

查看http://support.microsoft.com/kb/179987/(KB179987)。這似乎是一個已知的錯誤,但我現在無法測試究竟是什麼阻止了它的發生。 – Christian 2014-09-23 08:02:33

+0

我試圖在SendKeys命令之後立即添加DoEvents,但它沒有任何改變。對於如何使用DoEvents功能我感到非常困惑。其中一位VBA專家是否可以幫助我修改此代碼以使其正常工作? – user12059 2014-09-23 16:22:30

回答

7

這是Microsoft VBA中的一個錯誤。但有一個解決方法。

使用 F8運行宏並找到它關閉的位置。通常在SendKeys之後。

然後添加一個 Sendkeys "{NUMLOCK}", True行後扭轉效果。

如果找不到它,只需在最後添加它,當它結束時,它將返回。希望如果你在顯示/隱藏過程中添加它,它會起作用。

1

此行引起了我的問題:

Application.SendKeys "%s" 

改變這種解決:

Application.SendKeys "{NUMLOCK}%s" 

有在字符串的開頭或結尾添加{NUMLOCK}之間沒有什麼區別。

Sendkeys "any key", False 

代替False作爲第二個參數,使用True

1

這是通過引起的。

0

SendKeys "^{HOME}", True被關閉 NUM LOCK所以我只是重複命令,並把它重新打開:您SendKeys語句後

SendKeys "^{HOME}", True 
SendKeys "^{HOME}", True 
0

右鍵添加這兩條線:

DoEvents 
SendKeys "{NUMLOCK}{NUMLOCK}" 
0

當您在代碼中執行最後一個sendKeys命令時,正如RodB和iceBird76所指出的那樣,在語句中添加{NUMLOCK}可能會有所斬獲。但是這不是一個好的編程習慣,這就是爲什麼:如果運行宏時任何事情與下一次不同,它可能會或可能不會工作。我知道這一點,因爲我自己也遇到過類似的問題。當我在程序結束時執行sendKeys命令時,有時候Num Lock會保持打開狀態,但其他時候會停留,這取決於電子表格中的某些變量(不管我是否將{NUMLOCK}包含在我的最後一個SendKeys聲明)。
我不會涉及到我自己的變量的細節,但重點是要構建一個程序/宏,以保持您的Num Lock始終如一,您需要先進行測試以查看NUM LOCK是打開還是關閉,然後根據當前情況執行代碼。

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 

此示例程序會給你一個確認消息,作爲對Num Lock鍵是打開還是關閉,並打開它,如果它是關閉的。

1

我有類似的問題,我發現一些vba論壇上的解決方案。而不是越野車Sendkeys你可以模擬這樣的kyes。

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 

其它鍵可以在這裏vba forum 發現這種 「previousTab」 功能,只需發送控制+ Shift + F6鍵。