プロが教えるわが家の防犯対策術!

こんにちは、自身で調べてはみたのですが、特定のキーを押すというマクロは見つかったのですが、押しっぱなしというものが見つからず質問させて頂きました。

エクセルを操作する時に、離れたセルを選択する時やグループ化の際の選択にはCtrlキー+クリックを用いますが、この動作を再現するようなもの、もしくはCtrlキーを押している、押していないというスイッチのようなものを作ることは可能でしょうか?

ミスタイプでよく選択が解除されたりするため、スイッチなどがあれば確実だなーと思いました。

A 回答 (7件)

#5の補足の補足的情報としては、元の私のコードは、ある種のマクロは、keyboard 上の NumLock を外してしまうので、取り付けたものです。



そのマクロのNum Lock版は、本体のマクロとセットで使っていますから、そちらは、何千回と使われているものです。
昨日今日できたものではないのですが、Control キーは事情が違いますので、AsyncKeyコマンドで、Control キーを監視する方法が考えられます。
そこで、押した・押さないは感知できますから、まだ、もう少し工夫の余地はあります。

もう一つは、こちらは、32bit だからですが、64bit では、
Declare の後に、PtrSafe を加える必要があります。

その技術を応用すれば、完全な形にはなるとは思いますが、質問者さんの多くの中からどれがよいという恣意的な選択肢の中で終わってしまうだけでは、このコードは内容的に重すぎますから、深追いはやめておきます。もう少し、工夫の必要はあるのは知っています。

しかし、個人的な興味もあり、改良を加えてみると、結局、Windowsの設定の固定キーと考え方が近寄っていくわけで、そのぐらいなら、物理的にキーボードのコントロールキーにテープを貼り付けてしまってもよいかとも思えてくるのです。実際、この前から、キーボードが調子が悪くて、左シフトキーを中心として、押した状態が戻らなくなり、ついにこの開発の最中にキーボードを交替させました。

また、一頃は流行ったキーボードSwapで、シフトとCtrl キーを入れ替えても良いのではないかと思います。方法はいくつもありますから、ここの質疑の中だけでなく、適当なものを選べばよいと思います。
    • good
    • 0

Ctrlキーを押しっぱなしにしなくても、離れたセルを連続して選択できれば良いのですよね?


マクロ、トグルボタン等のキーワードが出ているのでユーザフォームとかでも大丈夫ですよね?

まず、ユーザフォームを作って、その上にトグルボタンを配置します。とりあえず、名前はデフォルトのままとします。
その上で、次のVBAを書いてください。
使い方ですが、まず、標準モジュールの sample を起動します。すると、ユーザフォームが表示されます。
トグルボタンをオンにすると、連続してセルが選択できるようになります。トグルボタンをオフにすると解除されます。

【Sheetモジュール】
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If myRng = "" Then Exit Sub
Application.EnableEvents = False
myRng = Target.Address & "," & myRng
Range(myRng).Select
Application.EnableEvents = True
End Sub

【UserForm1モジュール】
Private Sub ToggleButton1_Click()
If ToggleButton1.Value Then
myRng = Selection.Address
Else
myRng = ""
End If
End Sub

【標準モジュール】
Public myRng As String
Sub sample()
UserForm1.Show vbModeless
End Sub
    • good
    • 0

こんばんは。



一般的には、Windows の設定-簡単操作-[キーボード]クリック
Windows 10 ですが、他のバージョンでも似た機能があります。

「Ctrl、Alt、Shift、Windowsロゴキーを2回続けて押すとそのキーをロックする」

ここを[オン]にします。(今のところは、指はちゃんと動いているようですが、近いうちには、私もお世話にならなければならないキーかもしれません。これは、障がい者用のキーです。)

たぶん、フリーソフトウェアも出ているかと思います。中身は、大した違いはないでしょうけれども、VBAでは反応が鈍いのです。

もし、マクロで、それをしようとすると以下のようになります。

「君子危うきに近寄らず」と思うなら、以下のようなものは使わないほうが懸命かもしれません。昔、使っていたものを見直して設定しなおしました。もう、今の私の能力では、以下のようなコード自体は書けません。

トグルが上手くいかないので、行き着いたものが、CommandButton なのでした。つまり、コントロールキーを押し続けていることになるので、通常では、Off状態には戻らないのです。

>チェックボックスかトグルボタン
Ctrl キーに反応するオブジェクトでないといけません。

シートにActive X のコマンドボタンを付けます。

Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Shift = 0 Then
Call Command_ControlKey(True)
Else
Call Command_ControlKey(False)
End If
End Sub

'----------------
標準モジュール

Option Explicit
  'API declarations:
  Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
  Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
  Public Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  Public Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
  'Constant declarations:
  Public Const VK_CONTROL = &H11
  Public Const KEYEVENTF_EXTENDEDKEY = &H1
  Public Const KEYEVENTF_KEYUP = &H2
  Public Const VER_PLATFORM_WIN32_WINDOWS = 1
  Public Const VER_PLATFORM_WIN32_NT = 2
Public Type OSVERSIONINFO
  
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    'Maintenance string for PSS usage
    szCSDVersion As String * 128
  End Type
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Public Declare Function MessageBoxTimeoutA Lib "user32" (ByVal hWnd As Long, _
  ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal _
  wLanguageId As Long, ByVal dlliseconds As Long) As Long

Public Sub Command_ControlKey(ctrlFlg)
'''キーを監視
  Dim OsVer As OSVERSIONINFO
  Dim ControlKeyState As Boolean
  OsVer.dwOSVersionInfoSize = Len(OsVer)
  GetVersionEx OsVer
  Dim keys(0 To 255) As Byte
  Sleep 1000
  GetKeyboardState keys(0)
  ControlKeyState = keys(VK_CONTROL)
  
  If OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
   'If Not ControlKeyState = False Then
   If ctrlFlg = False Then
      'Simulate Key Release
      keybd_event VK_CONTROL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
      MessageBoxTimeoutA 0&, "解除されました。", "messagebox", vbMsgBoxSetForeground, 0, 1000
   Else
      'Simulate Key Press
      keybd_event VK_CONTROL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
      MessageBoxTimeoutA 0&, "設定されました。", "messagebox", vbMsgBoxSetForeground, 0, 1000
      
    End If
  Else
   MsgBox "現在旧OSについてはコードを示しません。", vbExclamation
   End If
End Sub
    • good
    • 0

Windowsパソコンなら「コンピュータの簡単操作センター」から「固定キー機能を有効にする」ことで対応できませんか。



・・・
てか、Ctrlキーって普通はキーボードの一番左下(と一番右下)にあるので Shiftキーよりも操作しやすいはずですよ。


・・・余談・・・
自分ならゲーム用の左手キーボードに「Ctrl+マウスクリック」を割り当てて、そのボタンを押している間はクリック状態を保持する設定にします。
ゲームだけでなく各種ソフトでショートカットキーなどの設定を割り当てて便利に使っています。
    • good
    • 0

ミスタイプで選択が解除されるという意味が分かりません。


>離れたセルを選択する時やグループ化の際の選択にはCtrlキー+クリックを用いますが、
>この動作を再現するようなもの
[Shift]+[F8]キーで「選択範囲に追加」ということができます。
[Esc]キーまたは[Shift]+[F8]キーで解除されます

また、セル範囲を選択しておいて名前を定義すれば、
名前ボックスからの選択でセルが選択されます
    • good
    • 0

フットスイッチ型マウス(USB接続)


http://www.itmedia.co.jp/pcuser/articles/1108/05 …
利用できそ~
    • good
    • 0

最終的に何をさせたいか分かりませんが、代替え方法がありそうです。


その方法でないと、実現不可能なんですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!