[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
こんな感じで。
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.