[[20190214073506]] 『Sendkeysで勝手にNumlockがON-OFF回避する方法にax(マイン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Sendkeysで勝手にNumlockがON-OFF回避する方法について』(マイン)

いつもお世話になっております。

現在

コピー&値の貼り付け操作(Ctrl+Alt+V V→Enter)を

Sendkeysを使用してCtrl+Vに割り当てる(他のキーでも良いのですがあえて)

といったコードを作成しました。

処理自体は適正に実行されています。

しかし

Sendkeysで複数のキーを指定すると勝手にNumlockがOn-OFFになるバグがあるようです。

これを回避するために下記のコードをサイトを参考に組み込みましたが相変わらず、マクロを実行するたびに、Windows画面にNumLock「ON/OFF」と表示されてしまいます。

皆様、どうかアドバイスの程よろしくおねがいします。

Option Explicit
'======================================================
' SendkeysでNumlockがOFFになるバグを回避する
' 参考→https://hatenachips.blog.fc2.com/blog-entry-400.html
'======================================================
' API declarations:

    Private Declare Sub keybd_event Lib "user32" _
       (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

      Private Declare Function GetKeyboardState Lib "user32" _
         (pbKeyState As Byte) As Long

      ' Constant declarations:
      Const VK_NUMLOCK = &H90
      Const VK_SCROLL = &H91
      Const VK_CAPITAL = &H14
      Const KEYEVENTF_EXTENDEDKEY = &H1
      Const KEYEVENTF_KEYUP = &H2

Function NumLockOn()

    Dim NumLockState As Boolean
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    NumLockState = keys(VK_NUMLOCK)

    'オフであれば強制的にオンに切り替えます。
    If NumLockState <> True Then
        'Simulate Key Press
        keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
        keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
End Function

'======================================================
' Sendkeysで値貼り付けをキーに割り当て
'
'======================================================

'キーの割当(Ctrl+V)で値貼り付け
Sub Pasteキーバインド()

    Application.OnKey "^{v}", "ValuePaste"
    Call NumLockOn
End Sub

'値の貼り付け操作
Private Sub ValuePaste() 'Ctrl+Alt+V V→Enter
  '値貼り付けのキーボード操作をSendKeysで操作

    Application.SendKeys "^%{v}{v}{ENTER}", True
    'NumLockバグ回避コードを実行
   Call NumLockOn
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


追伸です。

今までは、下記コードで、コピー&値の貼り付け処理を

 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

で実行していましたが、当然ながら戻るボタンでやり直しが効きません。

ですので、先の質問のようにして、EXCELのキー操作をキーに割り当てて戻るボタンでやり直しが効くように試しに採用してみました。

'★キー自体に値貼り付けのショートカットを割り当てる方法
Private Sub Workbook_Open()

 '標準ショートカット貼り付けを値化
    Application.OnKey "^v", "ValuePaste"    'Ctrl+V バージョン
End Sub
'本体
Sub ValuePaste()
    Dim vClip As Variant
    'エラー対策(クリップボードに値の残骸が格納されていた場合は貼り付けしない=あくまでEXCEL内のみコピペ)
    On Error Resume Next
    'クリップボードが空の場合は
    vClip = Application.ClipboardFormats
    If vClip(1) = True Then
        Beep    'ビープ音を鳴らす
        Exit Sub
    End If
    'クリップボードに値があれば→値の貼り付け
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    If Err Then
        Selection.Paste
    End If
End Sub
(マイン) 2019/02/14(木) 08:12

 クイックアクセスツールバーに「値の貼り付け」を設定して
 Alt+1 とかでどうでしょう?
http://blog.jmiri.net/?p=223

 私のやり方ですが。
(稲葉) 2019/02/14(木) 08:58

稲葉 さん

ありがとうございます。

私のPCは似たことを、ショートカットを作成したものを、アドイン化して組み込んでいます。

ただ、今回のファイルは、共有ファイルなものでマクロから制御・・・で

できればキーControlでできればと考えています。

(マイン) 2019/02/14(木) 09:17


 今はkeybd_eventでNumLockのキーコードを送信しているが直接keybd_eventでCtrl+Alt+V V→Enterを送信してはどうだろうか?
 keybd_eventで検索すると任意のキーコードを送る方法が見つかると思うが。
(ねむねむ) 2019/02/14(木) 09:19

私は下記のサイトを参考に、WScript.Shellで作りました。
https://santane.jp/wp/?p=355

こんな感じで。

Sub 値貼り付け()

    Dim WshShell As Object

    If Application.CutCopyMode = 1 Then

        Set WshShell = CreateObject("WScript.Shell")

        With WshShell
            .SendKeys "%^{v}"
            .SendKeys "{v}"
            .SendKeys "{ENTER}"
        End With

        Set WshShell = Nothing

    End If

End Sub

ただ、環境はWindows7、Excel2013なので他の環境では分かりませんが。

(う) 2019/02/14(木) 09:55


ちょっと記載が足りなかったかなということで補足します。

自分も同じ事をしていて、(余談ですが、値貼り付け&行列入替Verも作っています。)
そもそもNumLockがOFFにならない方法を使えばいいのでは?
ということで、NumLockがOFFにならない方法として調べたのが上の方法でした。

(う) 2019/02/14(木) 10:04


ねむねむ さん

う さん

試しましたがWin10 EXCEL2016ではだめでした。

ネット閲覧し既存コードを試行錯誤したところ

運良く、NumLockが「ON」状態だった場合限定で、ON・OFF表示がなくなりました\(^o^)/

ただ、PCによっては「OFF」設定の場合の対策はしていないので、同じ症状になります。

分岐方法がわからず困っています。
あともう一歩のところまで来た感じがします。

皆様、アドバイスの程よろしくおねがいします。

'-変更なしのコード--------------------------------------

Option Explicit
' API declarations:
Private Declare Sub keybd_event Lib "user32" _

                                (ByVal bVk As Byte, _
                                 ByVal bScan As Byte, _
                                 ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Declare Function GetKeyboardState Lib "user32" _

                                          (pbKeyState As Byte) As Long

' Constant declarations:
Const VK_NUMLOCK = &H90
Const VK_SCROLL = &H91
Const VK_CAPITAL = &H14
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
'https://hatenachips.blog.fc2.com/blog-entry-400.html

Sub Pasteキーバインド()

    Application.OnKey "^{v}", "ValuePaste"
    'Call NumLockOn
End Sub
Private Sub ValuePaste()    'Ctrl+Alt+V V→Enter

    Application.SendKeys "^%{v}{v}{ENTER}", True
    'とりあえず「NumLockがON」の場合は表示回避のみ対応・・・
    Call NumLockOn

End Sub

'-↑↑↑↑--------------------------------------

'変更したコードの部分。

'======================================================
' SendkeysでNumlockがOFFになるバグを回避する
'======================================================
Function NumLockOn()

    Dim NumLockState As Boolean
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    NumLockState = keys(VK_NUMLOCK)

    '重要:NumLockを予めON状態であること!!そうしないとON-OFF繰り返される

    'NumLockがONの場合は何もしない(表示しない)

    If Not NumLockState <> True Then

  '↑NOTを入れて
  '↓をコメントアウト(いらなかったかも)

        'Simulate Key Press
        'keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
        'keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0

    End If

End Function
(マイン) 2019/02/14(木) 12:31


追伸

EXCEL起動後に、NumLockをキープレス(直接押して)しONの状態をEXCELのコードに認識させる必要がありました。

まだ、甘かったです。orz
(マイン) 2019/02/14(木) 12:45


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.