[[20200827170413]] 『「マクロ onkey 機能について。」[カイ] につax(JULIA) ページの最後に飛ぶ

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

 

『「マクロ onkey 機能について。」[カイ] について』(JULIA)

投稿
[[20170330152051]] 『マクロ onkey 機能について。』(カイ) 
について...

はじめまして。

ここ数ヶ月からVBAを独学で学んでいるものです。
どう調べても、自分の望む答えが見つからず
こちらにたどり着きました。

何せ初心者もので、ご質問内容が突拍子もない初歩的なものでしたら
大変申し訳ありません…

表題のEnterにてマクロ作動させるものですが
マクロ解除までのコードを入力しました。

しかし、該当のブックや他のブック全てにおいて
Enterを押すと通常の下にスクロールする動きになりません。

詳細設定でスクロールが解除されていないことも確認しました。

そもそもOnkeyにて一度マクロ設定し、解除マクロを書いても
そういった細かい機能は作動しなくなってしまうのでしょうか。

コードも添付いたしますので
何卒ご教授いただけないでしょうか?

よろしくお願い致します。

Sub Auto_Open()

     'Sheet1がアクティブになったら「AutoActivateSheet_Name」マクロ実行
    Worksheets("検索画面").OnSheetActivate = "AutoActivateSheet_Name"
     'Sheet1がアクティブになったら「AutoDeactivateSheet_Name」マクロ実行
    Worksheets("検索画面").OnSheetDeactivate = "AutoDeactivateSheet_Name"

 End Sub

Sub AutoActivateSheet_Name()

     'テンキーのEnterを押すと「Set_Name」マクロ実行
    Application.OnKey "{Enter}", "検索処理"
     '大きいEnterを押すと「Set_Name」マクロ実行
    Application.OnKey "{~}", "検索処理"

 End Sub

 Sub AutoDeactivateSheet_Name()

     'テンキーのEnterへの割り当て解除
    Application.OnKey "{Enter}", ""
     '大きいEnterへの割り当て解除
    Application.OnKey "{~}", ""

 End Sub

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


 こんばんは ^^
onkeyはあまり使ったことが無いのですが、同じような事が
イベント処理を使っていると、良く起こります。何らかの
要因で、解除処理が実行されていない[例、強制終了]から
ではないでしょうか、私が気付くのはこれくらいでして、もし
外していましたら、お許しを。。。で、他のお詳しい方の回答
をお待ちくださいませ。でわでわ。。。m(_ _)m
(隠居じーさん) 2020/08/27(木) 17:50

とりあえず、ヘルプを信じてみて下さい。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.onkey
_プロシージャ_が省略された場合、_キー_は Microsoft Excel で通常の結果に戻り、前のOnKeyメソッドで行われた特殊なキーの割り当てはクリアされます。
Enter ~ (ティルダ)

 Sub AutoActivateSheet_Name()
        Application.OnKey "{ENTER}", "検索処理"
        Application.OnKey "~", "検索処理"
 End Sub

 Sub AutoDeactivateSheet_Name()
        Application.OnKey "{ENTER}"
        Application.OnKey "~"
 End Sub

(kazuo) 2020/08/27(木) 19:11


 こんばんは 
大変すみません、(隠居じーさん) 2020/08/27(木) 17:50
は私の勘違いだったようです。
無視して下さいませ。m(_ _)m
(隠居じーさん) 2020/08/27(木) 20:18

隠居じーさん様
ご丁寧にご回答いただきまして、ありがとうございます。こうした掲示板を使用するのは初めてなもので、こんなにも早くレスポンス頂けるとは思わず、驚きとともに、大変嬉しかったです。ありがとうございます。
まだ質問内容は解決できていませんが、何とか目指すものまで、皆さんのご助力賜りながら、作り上げてみます!

kazuo様
ご回答ありがとうございます。
確かに解除なされるということでは理解していたものの、上記コードでOnkeyで割り当ててしまうとセル移動が出来なくなる状況で、ご教授いただきましたコードへ訂正してみた所、他ブックの下セル移動は改善されました!しかしながら、該当ブックの下セル移動はまだ改善されておりません…。
もしお時間があるようでしたら、長いのですがメインの”検索処理”のコードも、お送りいたしますので原因点があればご指摘いただけないでしょうか?何卒よろしくお願い申し上げます。

Option Explicit

Sub 検索処理()

  Dim C2, C3 As String, C4 As String, C5 As String
 Application.EnableEvents = False
  Application.Calculation = xlCalculationManual
  Application.ScreenUpdating = False

  C2 = Cells(2, 3)
  C3 = Cells(3, 3)
  C4 = Cells(4, 3)
  C5 = Cells(5, 3)

  If ActiveSheet.FilterMode = True Then
  ActiveSheet.ShowAllData
  End If
                                                                             '全角の空白が2つ以上あれば、"入力は1ヶ所  2単語までです"とメッセージを出す

  If UBound(Split(C2, " ")) >= 2 Or UBound(Split(C3, " ")) >= 2 Or UBound(Split(C4, " ")) >= 2 Or UBound(Split(C5, " ")) >= 2 Then

  MsgBox "入力は1ヶ所  2単語までです"

  End If
                                                                         'N2の関数判定で、全角の空白が"1つ"であれば、オートフィルターB10の条件に当てはめる
                                                                                                            'この際空白で区切られた値を2つまで検索値に含む
   If Cells(2, 14) = 1 Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=1, _
        Criteria1:="=*" & Left(C2, InStr(C2, " ") - 1) & "*", Operator:=xlAnd, _
        Criteria2:="=*" & Mid(C2, InStr(C2, " ") + 1) & "*"
   ElseIf Cells(2, 14) = 0 And C2 <> "" Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=1, _
        Criteria1:="=*" & C2 & "*"
   End If
                                                                         'N3の関数判定で、全角の空白が"1つ"であれば、オートフィルターC10の条件に当てはめる
                                                                                                           'この際空白で区切られた値を2つまで検索値に含む
   If Cells(3, 14) = 1 Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=2, _
        Criteria1:="=*" & Left(C3, InStr(C3, " ") - 1) & "*", Operator:=xlAnd, _
        Criteria2:="=*" & Mid(C3, InStr(C3, " ") + 1) & "*"
   ElseIf Cells(3, 14) = 0 And C3 <> "" Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=2, Criteria1:="=*" & C3 & "*"
   End If
                                                                          'N4の関数判定で、全角の空白が"1つ"であれば、オートフィルターG10の条件に当てはめる
                                                                                                             'この際空白で区切られた値を2つまで検索値に含む
   If Cells(4, 14) = 1 Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=5, _
        Criteria1:="=*" & Left(C4, InStr(C4, " ") - 1) & "*", Operator:=xlAnd, _
        Criteria2:="=*" & Mid(C4, InStr(C4, " ") + 1) & "*"
   ElseIf Cells(4, 14) = 0 And C4 <> "" Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=5, _
        Criteria1:="=*" & C4 & "*"
   End If
                                                                         'N5の関数判定で、全角の空白が"1つ"であれば、オートフィルターF10の条件に当てはめる
                                                                                                            'この際空白で区切られた値を2つまで検索値に含む
   If Cells(5, 14) = 1 Then
        ActiveSheet.Cells(10, 2).AutoFilter Field:=4, _
        Criteria1:="=*" & Left(C5, InStr(C5, " ") - 1) & "*", Operator:=xlAnd, _
        Criteria2:="=*" & Mid(C5, InStr(C5, " ") + 1) & "*"
   ElseIf Cells(5, 14) = 0 And C5 <> "" Then
       ActiveSheet.Cells(10, 2).AutoFilter Field:=4, Criteria1:="=*" & C5 & "*"
    End If

Application.EnableEvents = True

 Application.Calculation = xlCalculationAutomatic
 Application.EnableEvents = True

End Sub

(JULIA) 2020/08/28(金) 10:57


>しかしながら、該当ブックの下セル移動はまだ改善されておりません…。
Worksheets("検索画面")以外のシートでの話ですか?
 Sub 検索処理()
    Application.ScreenUpdating = False
 End Sub
で 実施してみましたがキチンと解除され下セル移動します。

1. とりあえず、Sub 検索処理()
で Application.ScreenUpdating =true に戻しましょう。

それ以外は解りません。

Worksheets("検索画面")での話ですか?
1.は同じです適用下さい。
2.フィルターしているので、下セル移動って意味無いのではと思います。
 それでもと言うのなら

 Sub 検索処理()
    Dim r As Range
    Set r = ActiveCell
    '   処理
    With r
        .Worksheet.Parent.Activate
        .Worksheet.Activate
        Range(.Offset(1), Cells(Rows.Count, .Column)).SpecialCells(xlCellTypeVisible).Cells(1).Activate
    End With
 End Sub

(kazuo) 2020/08/28(金) 17:33


kazuo様

お世話になっております。
ご回答頂きありがとうございます。

まずご指摘についてですが…
>1. とりあえず、Sub 検索処理()
で Application.ScreenUpdating =true に戻しましょう。
お恥ずかしい限りです。
すぐにTreuのコードへ変更いたしました。

また
>Worksheets("検索画面")での話ですか?

 1.は同じです適用下さい。 
 2.フィルターしているので、下セル移動って意味無いのではと思います。 
  それでもと言うのなら 
ご質問の件ですが、その通りです。こちらに関しては補足させていただきたいと思います。説明不足で申し訳ございません。

このシートの仕様としましては、C2〜C5に検索窓を設け、B1〜K…上にあるリストを
オートフィルターで絞り、検索するためのシートを構築しておりました。

この際C2〜C5の検索窓は、縦に配列させておりますので
Enterでアクティブセル移動を下方向へさせたかったわけでございます。

そして一点気づいたのですが、もしかすると
前述しております
>Sub AutoActivateSheet_Name()

     'テンキーのEnterを押すと「Set_Name」マクロ実行
    Application.OnKey "{Enter}", "検索処理"
     '大きいEnterを押すと「Set_Name」マクロ実行
    Application.OnKey "{~}", "検索処理"

 End Sub

のコードがOnkeyの設定までで止まっているのではないか?と考えたのですが、
見当違いでしょうか?
見識お聞かせ願えれば幸いです。

よろしくお願いいたします。

(JULIA) 2020/08/31(月) 17:30


 >   Application.OnKey "{~}", "検索処理"
ENTERを表すチルダに、{} は不要かと。
(???) 2020/08/31(月) 18:04

 横から失礼します。

 困っている事象について確認します。

 私の理解ですと、
 | Worksheets("検索画面").OnSheetDeactivate = "AutoDeactivateSheet_Name"
 ですから、Sub Auto_Open()において実行されているのは、
 そのマクロが書かれているブックの"検索画面"シートがアクティブでなくなったら、
 AutoDeactivateSheet_Nameというマクロ(名前が気になるがこの際、置いておいて)で、
 キー登録が解除されるんですよね。

 | しかしながら、該当ブックの下セル移動はまだ改善されておりません…。
 ということは、
 該当ブックのどのシートをアクティブにしたときの話ですか?
 もう少し正確に書いてください。

 Worksheets("検索画面")では動作して、それ以外をアクティブにしたら、
 無効になるはずがならないということですか?

 AutoDeactivateSheet_Nameの最初の実行行にブレークポイントを置いて、
 Worksheets("検索画面")がアクティブで無くなったときに、
 そこを通っているか確認しましたか?

 そのあたりをそちらで確認してみてはどうですか?

(γ) 2020/08/31(月) 18:48


 >Application.OnKey "{Enter}"

 これPCによって違いがあります。
 IBMノート の Thinkpad だと {Return}

 実際、Returnキーなんてなく、Enterと書いてあるキーだけなんだけどね。

(BJ) 2020/08/31(月) 20:50


 NECのPC-8801を使用していた時代はReturnキーと言っていました。。
 Returnキー懐かしいです。
(EXC) 2020/08/31(月) 21:32

Application.OnKey はキーの機能を変えてしまうものです。
enterキーをほかの役目=Sub 検索処理() に割り当てたのですから、
 Sub 検索処理() の中に下セル移動機能を書いてやらない限り下セル移動はしません。
本、検索処理ではシートの切り替えはしていないので、
 Range(.Offset(1), Cells(Rows.Count, .Column)).SpecialCells(xlCellTypeVisible).Cells(1).Activate
だけで構いません。

例えば、以下はa,b,cのキーに処理を割り当てたものです。
a,b,cの文字は出力されなくなります。

 Sub onkey_test()
    Dim i As Long
    Dim s As String
    s = "keyd,keye,keyf"
    For i = 0 To UBound(Split(s, ","))
        Application.OnKey Chr$(Asc("a") + i), Split(s, ",")(i)  'a,b,cをd,e,fに変更
    Next
 End Sub
 Sub onkey_reset()
    Dim i As Long
    For i = 0 To 9
        Application.OnKey Chr$(Asc("a") + i)
    Next
 End Sub

 Sub keyd()
    ActiveCell.Value = "d"
 End Sub
 Sub keye()
    ActiveCell.Value = "e"
 End Sub
 Sub keyf()
    ActiveCell.Value = "f"
 End Sub

(kazuo) 2020/08/31(月) 22:01


???様
ご指摘頂きありがとうございます。
{~}→~へ変更いたしました。
こちらで運用してみますね。

γ様
ご覧頂きましてありがとうございます。
またもや説明不足で大変申し訳ありません。
以下ご質問に回答させていただきますので、ご高覧ください。

>私の理解ですと、

  Worksheets("検索画面").OnSheetDeactivate = "AutoDeactivateSheet_Name"
 ですから、Sub Auto_Open()において実行されているのは、
 そのマクロが書かれているブックの"検索画面"シートがアクティブでなくなったら、
 AutoDeactivateSheet_Nameというマクロ(名前が気になるがこの際、置いておいて)で、
 キー登録が解除されるんですよね。

まさにご認識の通りです。

>| しかしながら、該当ブックの下セル移動はまだ改善されておりません…。

 ということは、
 該当ブックのどのシートをアクティブにしたときの話ですか?
 もう少し正確に書いてください。
 Worksheets("検索画面")では動作して、それ以外をアクティブにしたら、
 無効になるはずがならないということですか?

言葉足らずで申し訳ないです。
まずマクロの実行自体は、Enter押下で問題なく”検索画面”シート上でのみ作動してくれます。
問題は該当ブックの”検索画面”シート上でのみ
Enter後のアクティブセル下移動が出来ない状況です。
全く別のブックや同じブックでも”検索画面”以外のシートでは
きちんとAutoDeactivateSheet_Nameによるキー解除はされておりますようで
通常通りEnterで下方向移動の動きになります。
上記の通りなのですが、お分かりになるでしょうか…?

>AutoDeactivateSheet_Nameの最初の実行行にブレークポイントを置いて、

 Worksheets("検索画面")がアクティブで無くなったときに、
 そこを通っているか確認しましたか?
 そのあたりをそちらで確認してみてはどうですか?

こちらに関しては、ブレークポイントで確認しましたが通っていました。

BJ様、EXC様
貴重なお話聞けました。
パソコンによってもキー指定のコードが変わることがあるんですね。
勉強になります。
ありがとうございます。

kazuo様
何度もお付き合い頂きましてありがとうございました。
いただきましたコードを
検索処理マクロに追加し検証いたしましたところ
きちんと理想通りに動かすことが出来ました。
本当にありがとうございます。
ただやはり他の方に返信したとおりですが
Onkeyにて
>問題は該当ブックの”検索画面”シート上でのみ
Enter後のアクティブセル下移動が出来ない状況です。
全く別のブックや同じブックでも”検索画面”以外のシートでは
きちんとAutoDeactivateSheet_Nameによるキー解除はされておりますようで
通常通りEnterで下方向移動の動きになります。
この部分が自分としては腑に落ちないままとなりそうです…。

始めたばかりのVBAですが、皆様の見識の深さや的確なご指摘には
本当に驚きました。
また共に問題に向き合っていただきました事、感謝いたします。
まだまだ精進しなければならないと改めて感じました。

皆々様重ねて御礼申し上げます。
ありがとうございました。

(JULIA) 2020/09/01(火) 15:44


問題の所在を間違えていたようですね。
てっきり、マクロが解除できないという話かと思っていました。
どうも失礼しました。

改めて拝見すると、
Enterキーを別の動作に変更してしまっていれば、
下に移動するという、Enterの動作に付随しておきる機能が
無くなるのは当然です。(既にご指摘がありました)

やや書きすぎたので削除しました。(17:10)

(γ) 2020/09/01(火) 16:24


γ様

ご理解いただけたようで安心致しました。
そうですよね…。
そもそも私もEnterではなく"F1"などに割り当てたかったのですが…
業務上他の方も使用する都合で
エンターで一回一回検索できるようにして欲しい。との要望があったため
割り当てることになりました。

初心者なりに答えようと
受けたものの、ふたを開けたらやめたほうが良かった。
なんて感じだったのです。

お恥ずかしい限りです…

(JULIA) 2020/09/01(火) 17:32


ENTERキーに割り当てる程ではないですが、F1キーに割り当てるのも無謀です。

20世紀の終わり近くに、アプリの操作を統一する事で、どんなアプリでも説明なしに使えるようにしよう、という考えから、共通したUI標準が提案されました。(Common User Access) この中で、F1キーはヘルプ表示に使う、と決められてます。 現在でも、ほとんどのアプリはこれに従っており、F1キーをマクロ用に割り当ててしまうと、ヘルプ表示ができなくなりますよ。

なので、普通はOnKeyを使わず、ボタンを配置しておいて押すと動作するとか、標準のキー動作を妨げないように考えてください。 マウスが苦手な人が居るのも承知していますが(そういう人に限って高齢で、発言力が高かったりする…)、大事なキーには手を付けないようにしましょう。
(???) 2020/09/01(火) 18:03


⁇?様

おっしゃる通りでございます。
本来ですと、独自のショートカットキーを
持たせることが理想ではありました。
実際のところは別途マクロボタンは今のものにも導入しております。
ですが、この検索を連続で繰り返す特性が今の業務上あるのです。
要は本来であればエクセルで行うより
本来運用している社内システム改編をしてもらえればよかったのですが
諸事情あり、その意見は通らず現場からは不満が上がりました。
結果マスタデータを社内システムより落として
エクセルでその検索機能を担おうと言うことになったわけです。
ただご指摘の件に関しては、今回この案件に携って分かりましたが
ごもっともなご意見だと思います。
また別の開発がありました際には
念頭において行うように致しますね。
大変勉強になりました。
ありがとうございます。

(JULIA) 2020/09/01(火) 18:23


コメント返信:

[ 一覧(最新更新順) ]


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