ここから質問投稿すると、最大4000ポイント当たる!!!! >>

Excelのsheet1のセルA1でスペースキーを押したときに100までの乱数を表示させ、エンターキーを押すと0になるようにするにはどうしたらいいですか?

質問者からの補足コメント

  • うーん・・・

    VBAの知識がほとんどないため、マクロを張り付けていただけると幸いです。

      補足日時:2019/09/22 13:55
  • どう思う?

    エンターキーは特に重要というわけでもありませんが、できればエンターキーにしていただきたいと思います。
    エンターキーでない場合はアルファベットにしていただけるとわかりやすいです。

      補足日時:2019/09/23 17:18

A 回答 (8件)

こんにちは。



連休中は、体調を壊していまして、とても書き込みできる状態ではありませんでした。
まだ、調子が戻ってはいないのですが、書き加えておきます。

MakeZero の部分で、動かなくなる問題は修正しておきますし、違うブックは設定キーをオフにしました。もう少し設定条件に細かくもできますが、当面、このままにとどめておきます。
なお、私は、聞かれれば答えますが、細かい説明はあまりしません。

https://bit.ly/2lcm3rM
Enter (テンキー) {ENTER}
Enter ~ (ティルダ)
テンキーからEnterキーを入れるのでしたから、それに
標準モジュールのSetkey に
Application.OnKey "{ENTER}", "MakeZero" 'テンキー
を加えてもよいです。スペースキーと近い場所にあるという理由で、Enter はキーボードにしています。

以下は、あまり細かいテストをしていませんので、不具合があるのかもしれません。
'-------------------------------
'コード
'//ThisWorkbookモジュール

'Excelを再起動するか、このWorkbook_Openを実行すれば、設定されます。
Private Sub Workbook_Open()
Call SetKeys
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
Call SetKeys
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Call SetOffKeys
End Sub

'----------------------
'//標準モジュール
Sub SetKeys()
 Application.OnKey " ", "MakeRandom"
 Application.OnKey "~", "MakeZero"
End Sub
Sub SetOffKeys()
'設定キーを解除
 Application.OnKey " "
 Application.OnKey "~"
End Sub
Sub MakeRandom()
 If ActiveSheet.Name = "Sheet1" Then
  If ActiveCell.Address = "$A$1" Then
   ActiveCell.Value = Int(100 * Rnd + 1)
  End If
 End If
End Sub

Sub MakeZero()
'この部分は、もう少し細かな設定も可能です。
 If ActiveSheet.Name = "Sheet1" Then
  If ActiveCell.Address = "$A$1" Then
   ActiveCell.Value = 0
  Else
   ActiveCell.Offset(1).Select
  End If
 End If
End Sub
    • good
    • 0
この回答へのお礼

お礼が遅れてしまい申し訳ありません。
あやふやながらも一応意味はわかると思います。(何日もかかかると思いますが…)
わざわざ体調がすぐれないにもかかわらず回答をくださりまして、心からの感謝を送ります。
お体をお大事に

ベストアンサーに選ばさせていただきます。
ありがとうございました!

お礼日時:2019/10/01 21:06

冷やかしを入れてしまったお詫びとして。

(急ぎの要件もあるので)
>なぜか"MakeZero"と"MakeRandom"が動かないようでした。
>半角チルダもエンターキーに置き換える必要もありますし、どうしたらいいんだぁ!!って頭を抱えています。

WindFaller氏の回答でご質問の動作が可能ですよ。

このプロセス、設定方法は、覚えておいた方が良いですよ。(私、忘れてました)
制御系に使う事もあるかと、無いかも知れませんが、ゲームを作る時とか、、(昔作りました)

Application.OnKey "~", "MakeZero"を
Application.OnKey "{ENTER}", "MakeZero" にして

Auto_Openでキーを登録するので初めにAuto_Openを手動で実行するか、
ブックを開き直して使います。
設定するという特性化から、ブック立ち上げ時に設定するようにしたのだと思います。
チルダを入れてあったのは、意図するところがあったのではないでしょうか、(私もEnterにしない)

ご質問の回答としては、ベストでしょう。

質問としては、質問者のおっしゃる通り、問題ですね。。

私の説明付けたほうが良いですよは、VBAの知識がほとんどないためとあり、重要なことなので
WindFaller氏が見ない可能性もあるので、注意喚起だけでもと、思います。

この、Application.OnKeyには、問題もあります。

Application、すなわち、Excelのキーを設定するものです。
したがって、Excelが閉じられていない場合、他のブックのSheet1、A1セルでEnterキーを押しても実行されてしまいます。
また、設定は、Excelが閉じるまで有効でVBAが書かれているブック以外を開き、VBAのブックを閉じます。
新しく開いたブックにSheet1シートがあった場合、A1セルで何かを入力、Enterキーで決定すると
A1セルには設定された0が入力され、VBAが書かれているブックがなぜか開きます。

この回避方法は、このVBAのブックは単独で使い、他のブックを開きたい場合は、Excelを閉じてから
開く必要があります。

これは、特定の使用に限ったブックでは、良いのですが知らないで、沢山ブックを開いていて
後からでもこのVBAブックを開くと他のブックで作業する時、不明な挙動で困ると言う事になります。
試してみてください。

会社で出来ましたよと試す時、このような事象を知らないと取り返しがつかない事になるかも知れません。

お節介が過ぎました。失礼します。
    • good
    • 0
この回答へのお礼

助かりました

前述のように(おそらく)遊びですので、少々不明な挙動をしたところで大丈夫だと思いますが、取り返しのつかないことになろうと発案者が悪いんですから大丈夫…なはず。
今、補足を付け足しましたが遅かったですね…

VBA自体、入門書みたいな本を読んだくらいの知識量しかないのでご教授いただきありがとうございます。
たぶん、ブックを開きなおしてなかったから動かなかったのだと思います。
ゲームを作るですか…SEの人が頭抱えて見ているパソコンのキーボードに落ちた大量の髪の毛を見てプログラミング自体怖くなってしまっているのでゲームは作らないと思います。作らないことを祈ってます。

お礼日時:2019/09/23 17:35

どこから拾ったの "{ENTER}" ですよ。


どうも意見が合わないようで、、、
A1セルでは、本来必要なEnterキーの機能なくなっていますよね。。
質問にはないので、必要かどうか分かりませんが、そのような対応で良いのかなあー
ご存知の通り、Enterキーは特別と私は、認識していますので、
機能変更するのはありですが、説明は付けた方が、、良いかと思いますよ。
まあ、いつかのお返しです。(本気では無いですよ)WW
    • good
    • 0

投稿時、半角2回は修正されるようですね。

知りませんでした。

If Target.Value = " " Then Target.Value = Rnd * 100
If Target.Value = " " Then Target.Value = 0 ’ ” ”は、半角2回 です。全角にしてみましたが?
    • good
    • 0

ご質問には、難しい課題が含まれています。

VBAにしても、関数にしても結果を考えるに、1セルのみに行うのであれば、
設計自体を考え直す方が良いでしょう。
つまり、合理的な設計ではないので、仕様を改善をしなさい。というのが、答えになります。

理由を教えて欲しいとなると思いますので、簡単に、、、
Enterキーの機能を考えてください。昔でいうリターンキーでこれ自体に値などは持ちません。決定するとかの機能です。
よく、Excelでセル選択をするのに、Enterキーを連打したり、何回か押してセルの移動する手段に使っていますが、
これは、あくまでOfficeのサービス機能です。本来、セル移動にはTabキーや矢印キーを使うべきで、Enterキーに移動する機能はありません。
一方、スペースキーは” ”など値を持つ事が出来ますが、決定する事が出来ません。
つまり、決定するには、Enterキーを押すかセルを移動する必要があります。
又は、キーが押されたこと自体を検知する必要があります。
VBAには、Windows API宣言をして使用する事が出来き、キーイベントを検知することは出来ますが、
そのトリガーになるであろう、シートイベントには適当なイベントがなく、他の方法を考えなくてはいけません。
つまり、A1セルでキーを押したらだけでは、条件が他に必要になると言う事です。Enterキーの場合、セル移動してしまいますしー

If ~~~ Then Range("A1").Value = 0
If ~~~ Then Range("A1").Value = Rnd * 100

果たして良い条件を付けられますか?(条件の付け方が最大の問題ですね)
仕様は、目的が明確でそれに対して合理的でなければ、いけません。
単なる遊び、検証、勉強なら良いのですが、、、頑張ってください。。

勿論、スペースキー、エンターキーにする理由をお聞きしていませんので、
判断に困りますが、簡単な例を示します。

例えば A1セルにスペースキーを1回(半角)→EnterキーでA1に乱数入力、
スペースキーを2回(半角)→EnterキーでA1に0を入力するなら、簡単で

Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
  If Target.Address = "$A$1" Then
   If Target.Value = " " Then Target.Value = Rnd * 100
   If Target.Value = " " Then Target.Value = 0
  End If
 Application.EnableEvents = True
End Sub

って感じです。

初めのこの条件、
>セルA1でスペースキーを押したときに100までの乱数を表示させ、エンターキーを押すと0、
通しますか?
    • good
    • 0
この回答へのお礼

ありがとう

お礼が遅れましてすみません。
Qcahn1962様、三つも回答してくださりありがとうございます。
お礼はこの一件でまとめさせていただきますが、ご了承ください。
この条件はもともと、たらい回しで回ってきたものでほかの人に回そうにも回せる人がいなかったので私がすることになってしまいました。発案者は私も誰かわからないので探しに行かなくてはなりませんが、私にこの条件を押し付けた人に「三連休明けまでによろしく」と言われましたので、こんな非合理的な条件をすることになりました。
たらい回しで回ってきた感じでは、遊びっぽいです。

発案者に直談判できるとすればエンターキーよりわかりやすいフォームコントロール(ボタン)で記録したマクロを実行すればいいのではないか、と言いたいです。
とりあえず、回答者様の言う通り良い条件を考えてみようと思います。

お礼日時:2019/09/23 12:45

学校の宿題で、こんな難しい内容のものは出るはずがありませんね。


スペースキーに乱数を、エンターキーで0になる、という設定は、それを経験なくて、テキストで実現できるほど簡単ではないかもしれません。

'//標準モジュール
Sub Auto_Open()
 '自動設定(ブックをオープンした時に設定される)
Call TryOnKeys  'キー設定マクロを呼び出し
End Sub

Sub TryOnKeys()
'キー設定マクロ
 Application.OnKey " ", "MakeRandom" '半角スペース
 Application.OnKey "~", "MakeZero"  '半角チルダ
End Sub

Sub MakeRandom()
'乱数を作る
 If ActiveSheet.Name = "Sheet1" Then
  If ActiveCell.Address = "$A$1" Then
   ActiveCell.Value = Int(100 * Rnd + 1)
  End If
 End If
End Sub

Sub MakeZero()
'ゼロを入れる
 If ActiveSheet.Name = "Sheet1" Then
  If ActiveCell.Address = "$A$1" Then
   ActiveCell.Value = 0
  End If
 End If
End Sub
    • good
    • 0
この回答へのお礼

うーん・・・

学校の宿題じゃないですが、学校の先生に聞いてみたらなにかヒントを得られるかなと思って聞いてみましたが、「本を読め」って言われました。ちなみに本には書いてないです。
エンターキーが押されたことを取得する方法は本に書いてあったので読みましたが、sheet1A1セルに限定してイベントを起こすにはどうしたらいいか全くわかりませんでした。
回答者様のマクロをコピペしてみましたが、なぜか"MakeZero"と"MakeRandom"が動かないようでした。
半角チルダもエンターキーに置き換える必要もありますし、どうしたらいいんだぁ!!って頭を抱えています。

お礼日時:2019/09/23 13:16

君の学校の課題だよね?


丸投げしてないで、ちょっとくらい自分で考えてみたら?
    • good
    • 0
この回答へのお礼

うーん・・・

学校じゃないです。
関数で代用できるところはしましたが、ここだけVBAが必要で、自分は知識が乏しいため質問させていただきました。
自分で考えてもVBAの基礎が全くなってないのでそもそもわからないっていう状況です。
VBAの本とにらめっこしてますが、サッパリです。

お礼日時:2019/09/22 14:31

何らかのイベント関数を使って、キー押下を感知して


キー種別に応じて処理する
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
VBAの知識がほとんどないので、勉強してみます。

お礼日時:2019/09/22 13:51

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング