[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル未入力でenter押下時のマクロ発動』(ユウノスケ)
現在,
excel 2010 を使用しており、
enter押下時に特定セルの移動を実現しようとしているのですが、
Worksheet_Changeイベントにて以下マクロを行うことで、
動作を実現しようと致しました。
If Target.Address = "$A$1" Then
[B3].Select
Exit Sub
しかしながら、セルが空白の場合、enterを押下しても、
Worksheet_Changeイベントが発動せず、オプションで指定した方向に
セルが移動してしまいます(マクロ自体が発動しない。。。当たり前ですが)。
恐れ入りますが、セルが空白時にenter押下にて発生するイベント、
若しくは上記、ソース以外の代替案ありましたら、
御教示頂けませんでしょうか?
−−−−
もうしわけございません。
excel のバージョンは 【2007】でした。
訂正致します。
(ユウノスケ)
値が入っていたセルで、Deleteキー等でクリアした場合はChangeイベントは発生するが もともと空白のセルでEnterをおしても発生しない。 このケースを捕捉するイベントはない(というか、われわれにリリースされていない) かわりに使えそうなものとして、Enterを押すと、必ずアクティブセルが移動する。 このセルの移動、つまりセルの選択が変わった時に発生するのが Worksheet_SelectionChange 悩ましいのは、このとき、Targetとして与えられるのが「移動後のセル」。 通常のエクセル設定であればEnterで下に移動するから、元のセルは1つ↑という判断ができそうにも思うが タブキーで移動があった場合は1つ右となるし、さらにはマウスで離れたセルを選択する可能性もある。
したがって「望み薄」
おそらく、必須チェックをしたいのかな? もし、そうなら、どこかのタイミング、シートのDeactivate等で必須チェックをかけるという方法しかないかな? その場合、このシートがアクティブの状態で閉じられると、Deactivateは発生しないので、ブックの BeforeSaveあたりでもチェックをかける必要がある。 (あるいはBeforeSaveだけでチェックをかけてもいいかも)
(追記)保存なしで閉じる場合もあるので、BeforeCloseでチェックをかけてはいけない。
ぶらっと立ち寄り
ユウノスケさん ずいぶん前に使った手です
Private myAdd As String
Private Sub Worksheet_Activate() myAdd = ActiveCell.Address(0, 0) End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If myAdd = "A1" Then MsgBox "OK" End If myAdd = Target.Address(0, 0) End Sub (seiya)
seiyaさん
1つ前のアクティブセルを保存しておく手ですね。これで判定できますね。 いい手だなぁ。 1点だけ。たとえばブックを開いた時点で目的のシートがアクティブシートだった場合 Activateイベントは発生しないので、Workbook_Openあたりで If ActiveSheet Is 目的のシート Then myAdd = ActiveCell.Address(False,False) を。 したがって myAdd は標準モジュールにPublic宣言せざるを得ないけど。
追記)ただ、やっぱり、こうする目的が、不明。 必須チェックだとして、エラーメッセージ出して、たとえば元のセルにカーソルを戻す。 ここまではできるけど、ここで保存されたら、空白のままということになる。 質問者さんの目的次第ですけど。
ぶらっと立ち寄り
ぶらっと立ち寄りさん そこまで必要かな?...
ThisWorkbook module へ
Private Sub Workbook_Open() Dim myadd As String If ActiveSheet.Name = "Sheet1" Then With Sheets("sheet1") myadd = ActiveCell.Address .Range(myadd)(2).Activate .Range(myadd).Activate End With End If End Sub (seiya)
>enter押下時に特定セルの移動を実現しよう (マウスでの移動は、どこでも移動できる) という仕様でしょうか?
APIの GetAsyncKeyState を使えば、できそうですが・・・。
この特定のセル移動の仕様のために結構なコードになってしまいます。
A1や、B3にActiveXControlのテキストボックスを配置して、 テキストボックスのKeydownイベントで処理するのはどうでしょうか?
検討してみてください。
ichinose
seiya様
ichinose様
御返信が遅くなり申し訳ございませんでした。
御回答ありがとうございます。
本件の意図は、
”Enter押下時に指定したセルに移動させたい”のが目的になります。
例えば [A2]に値を入力(若しくは何も入力しない)
→ enter押下
→ [C5]にアクティブセルが移動
上記、動作をさせたく思っております。
上記例にて、[A2]に入力した場合は Worksheet_Change イベント内にて、
[C5].Select
とすることで強引に移動させようとしております。
但し、この方法だと、[A2]にアクティブセルがある場合、何も入力せずenterを押下した場合、
Worksheet_Change イベントは実行されないため、excelで設定した方向にアクティブセルが動いてしまいます。
今回、実現可否の判断材料となるのが、
”セル内の値を未入力時にenter押下にてexcel設定したenter動作でなく、指定したセルにアクティブを移すことができるかのどうか”
となるかと考えております。
過去ログ等から範囲指定を行う方法も考えたのですが、
本方法だと範囲指定内の一つのセル内の値を削除した際に、
範囲内セル全てのセル内の値が消えてしまうことから断念致しました。
長々と記載してしまい、申し訳ありませんが、
なにか良い知恵をお持ちであれば、ご教示頂ければ幸いでございます。
以上です。
宜しくお願い致します。
(ユウノスケ)
>”セル内の値を未入力時にenter押下にてexcel設定したenter動作でなく、 >指定したセルにアクティブを移すことができるかのどうか” >となるかと考えております。
試してないんだね? それとも、全て書かなきゃだめなのかな? (seiya)
あぁ、必須チェックじゃなかったんだ。 入力の順序を規制したいセルに カーソルがあって、入力の有無に関係なく、エンターやタブで、指定した次のセルに移動するということだけなら以下。 マウスで、全く違う場所を選択されるとどうしようもないけど、それでも、次に、順序規制セルのどこかが選択されると、 また、規制が働く。シフト/タブで規制順の逆周りもできる。 たとえば、E14->F16->F17->G11->D18->I19->E14 という順序で規制したい場合、
シートモジュールに
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Range("E14,F16,F17,G11,D18,I19") If Not Intersect(Target(1), .Cells) Is Nothing Then Application.EnableEvents = False .Select Target(1).Activate Application.EnableEvents = True End If End With End Sub
要件に合わなかったら無視して。
追記)規制セル内にあって、そこから脱出したい場合は上でも書いたようにマウスで選択するか、矢印キーで。 逆に言えば、規制セル内で、矢印キーで規制セル外に移動させると規制が途切れる。
ぶらっと立ち寄り
ぶらっと立ち寄り 様
御教示の程、ありがとうございます。
大変恐れ入りますが、
ぶらっと立ち寄り 様 のコードを検証させて頂いたところ、
1つのセルであれば問題ないのですが、
結合セルの場合はどのように記載すればよろしいでしょうか?
ぶらっと立ち寄り 様 の例であれば、
・E14 の部分が E14:E16 の結合セル
・G11 の部分が G11:G19 の結合セル
・D18 の部分が D18:D26 の結合セル
といった具合になります。
こちらの記載が足らず、五月雨式のご質問になり恐縮ですが、
何卒、ご教示の程宜しくお願い致します。
(ユウノスケ)
結合セルの左端上端セルを指定すれば問題ないようです。 試してみたら解るけど。 (みやほりん)(-_∂)b
御対応ありがとうございます。
すいません。先程、左上のセル指定で検証したらうまくいかなかったので、
てっきり結合セル指定のやり方が原因だと思っておりました。。。
しかしながら、どうやらNGだった原因は”シートの保護”が原因だったようです。
先のソースでは”シートの保護”を行っているせいでうまく作動しておりませんでした。
※シートの保護を外すと結合セルにおいてもうまく作動致しました。
大変恐れ入りますが、シート保護をしたまま、
本ソースを生かす方法はあればご教示頂けると幸いです。
スレが長くなり恐縮ですが、何卒宜しくお願い致します。
どこにいれてもいいけど、Selection_Changeで毎回やるのもなんなので Workbook_Open あたりで 当該シート.Protect Scenarios:=True, UserInterfaceOnly:=True こんな感じで。保護パスワード付なら Paessword:=xxxx も。
追記 ぐるぐるまわるセルは、セル書式で保護なしだよね。 最悪でも、シート保護条件が、保護されているセルの選択が許可されている。 マクロは別にして、人間がタブキー、エンターキーで移動させるんだよね。
ぶらっと立ち寄り
シート保護の仕方によります。セルにロックがかかっており、ロックされた セルの選択が許可されていないとセル選択が出来ません。 選択したいセルの「書式設定」の「保護」タブで、「ロック」のチェックを はずしておきます。 シート保護のオプションで、「ロックされていないセルの選択」のチェックを した上でシート保護をかけると、選択が可能になります。 (みやほりん)(-_∂)b
早急なご対応ありがとうございます。
私の説明の足らなさゆえ、皆様には大変ご迷惑をおかけしております。
今回ですが、ぶらっと立ち寄り 様のソースコードを例にとれば、
指定セル("E14,F16,F17,G11,D18,I19")以外にも
E9,E12,C20,D24 などが 入力対象セルになっております。
(入力順は E9→E12→E14→…→I19→C20→D24…)
つまり、
bookを開いた段階では”シートの保護”、”enter設定は右” となっており、
E9(enter) → E12(enter) → E14(E14→…→I19と指定セルに移動したい)
→C20にアクティブセルが移動したら”enter設定は右”にしたい。
というような動作になります。
恐らくですが、E14にアクティブセルが移動した段階で”シートの保護”を解除してやり、
指定範囲で特定のセル移動を行い、
I19にアクティブセル が移動した後、シートの保護を掛けてやればよいとおもうのですが、
"ぶらっと立ち寄り"様、”みやほりん”様 のコメントをご参考にさせて頂きましたが、
シートの解除、シート保護が上手くいかないで困っております。
そもそも、私の想定しているシーケンスで良いのかどうかも分かりかねますが、
そのこと踏まえて、ご教示頂きたく宜しくお願い致します。
(ユウノスケ)
まず、アップしたコードの意味を詳しく説明しなかったけど、必要なセルを、その必要な順番で Range(い,ろ,は,に,ほ,へ,と,・・・・・).Select。これによって、「い」の次に、「ろ」が 右にあろうが左にあろうが上にあろうが下にあろうが、ずぅっと離れた場所にあろうが、とにかく 「い」の次には「ろ」にいく。下方向から右方向に変更したいから、何かロジックをかませる必要はなく ましてや、Protectや、UnProtectを行う必要はない。
で、次に、い,ろ,は,に,ほ,へ,と,・・・・・のすべてのセルは、セルの書式設定で保護をはずしておく。 こうした上でシート保護をかけておく。 そうすると、おそらく、後でアップした、UserInterfaceOnly付きのProtectを実行しなくとも 最初にアップしたコードのままの形でうまくいくはず。
シート保護がかかっていて、トラブったのは、対象のセル書式が保護のままだったと想像。
★セルの記述で間違いあり、上記コメント修正。 いずれにしても、Range( ) の かっこ内は、移動させていくセルの順序通りに。
ぶらっと立ち寄り
その他、ご協力、ご拝謁頂きました皆様
ありがとうございました。
無事解決いたしました。
皆様方のご協力に感謝いたします。
(ユウノスケ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.