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

こんにちは、エクセルのマクロで解らない事があるので教えて頂けませんか。

一定時間、例えば5分おきにAB12セルをダブルクリックし、入力状態にし、すぐに入力状態を解除して、選択状態に戻したりは出来ますか?

ダブルクリック後、他のセルを選択しても構いません。

使っていないどこかのセルを一度入力状態に出来れば問題ないです。

詳しい方、教えて頂けませんでしょうか。

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

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

  • うーん・・・

    回答ありがとうございます。

    その通りです、Sheet1のF2セルに =NOW()が記述されていて、それを一定時間で更新したいと思っています。

    教えて頂いたコードを標準モジュールにペーストしたんですが、何も起こらないような気がするのですが、開始にあたり必要な手順等はありますでしょうか?

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

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/10/31 01:16
  • うーん・・・

    はい、最初のコードすべてを、Alt+F11で開いたGeneralのエリアにそのままペーストしました。

    これではダメだったんですかね?

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/10/31 03:17
  • どう思う?

    再回答ありがとうございます。

    これです、こういった物を求めていたのですが、これだとエクセル起動時に毎回マクロの開始をしないとなりませんよね?

    ファイルを開いたら自動で開始させたいと思い試しに

    Private Sub Workbook_Open()
      Call selfTimerMacro
    End Sub

    として、そのシートに導入してみたのですが、なんだか動いてくれません。

    これは、このマクロを入れる場所が違ったのでしょうか?
    それとも、そもそもこの構文が違うのでしょうか?

    また、表示箇所のユーザー定義を
    d"日  "h"時"mm"分" ss"秒"
    としているにも関わらず正常な日付を表示してくれず
    1900/1/0 17:14:58 と表示されています。

    こちらはどう考えてどう対処すれば良いのでしょうか?

    お手数ですが、教えて頂けませんか。

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

      補足日時:2017/10/31 17:22
  • ありがとうございます。
    表示の件は解決しました。

    それで、開いたら自動で実行の件ですが、教えて頂いたコードを標準モジュールに記述してみましたが、依然、マクロの実行をしないと動いてくれません。

      補足日時:2017/10/31 22:37
  • うーん・・・

    コードは以下の通りです
    Sub selfTimerMacro()
      Dim myTime As Date

    With Worksheets("Sheet2")
    If StrComp(.Range("F2").Value, "Q", 1) = 0 Then
    MsgBox "終了しました。", 64
    Exit Sub
    Else '
    .Range("F2").Value = Now ' Format(Now, "hh:MM:ss")
    End If
    myTime = Now + TimeSerial(0, 0, 10)
    Application.OnTime myTime, "selfTimerMacro", myTime + TimeSerial(0, 0, 5)
    End With
    End Sub

      補足日時:2017/10/31 22:38

A 回答 (6件)

>一定時間、例えば5分おきにAB12セルをダブルクリックし、入力状態にし、すぐに入力状態を解除して、選択状態に戻したりは出来ますか?



本来の目的は、別の所にあるのではないでしょうか?
セル上で、「マウスの左によるダブルクリックする」という物理的な動作をさせても、意味があるとは思えないのですが。

>使っていないどこかのセルを一度入力状態に出来れば問題ないです。
もしかして、再計算をさせるという意味ではないでしょうか。

もし、そうなら、セル上には、=NOW() 関数を置き、
一定の時間(5 min)で、OnTime を使い、Caluculate させれば、必要な部分が再計算します。
ただ、これを、ワークシートに何も置かないということになると、大変に不安定なコードになるような気がします。

例えば、こんなことです。時間のサイクルは、10秒にしてあります。
意味が違うようでしたら、もう少し説明をしてください。

'//標準モジュール
Dim flg As Boolean
Dim ETime As Date
Sub Start_End()
'開始と終了
flg = Not flg
TimerTest
If flg Then
MsgBox "開始しました"
Else
MsgBox "終了の命令を受け付けました。", vbInformation
'//このコードではすぐに止まりません
End If
End Sub
Private Sub TimerTest()
ETime = Now() + TimeSerial(0, 0, 10)  '10秒単位
DoEvents
Application.OnTime ETime, "MacroTest"
End Sub
Private Sub MacroTest()
Application.Calculate
If flg Then
TimerTest
End If
End Sub
この回答への補足あり
    • good
    • 0

分かっていらっしゃるとは思いますが、


Dim flg As Boolean
Dim ETime As Date

この2つは、プロシージャ外のモジュール変数ですから、当該の標準モジュールの先頭に置いてください。

これがなければ、動きません。
この回答への補足あり
    • good
    • 0

> =NOW()が記述されていて、それを一定時間で更新したいと思っています。


それなら「セルをダブルクリックして確定し直し」なんてしなくても F9キーを
押すだけでいいと思いますが。

それはともかく5分置きでいいなら データベースクエリで 外部データ参照をし
て「定期的に更新する(R) 『5』分ごと」にしておけばいいだけです。
    • good
    • 0

あまり、いろいろ書いても意味がないのかもしれませんが、以下は、自走型です。

5秒間隔です。最近は、以下のようなコードを書かなくなりました。

タイマーを使ったマクロは、様々なものが発表されています。最終的には、RaiseEvent につながるようですが、最初は、こんなところでもつまずきます。

私も
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
の使い方は、人から教わっています。知っているようで知らないものです。
(そんなことは、どうでもよいことかもしれませんが(^^;)

'//標準モジュール
Sub selfTimerMacro()
  Dim myTime As Date
  '----------------------------------
  '終了は、セルに'Q' を入れる(小文字も可能)
  '----------------------------------
  If StrComp(Range("F1").Value, "Q", 1) = 0 Then
   MsgBox "終了しました。", 64
   Exit Sub
  Else
   Range("F1").Value = Format(Now, "hh:MM:ss")
  End If
  myTime = Now + TimeSerial(0, 0, 10)
  Application.OnTime myTime, "selfTimerMacro", myTime + TimeSerial(0, 0, 5)
End Sub
    • good
    • 0

>Private Sub Workbook_Open()


Worksheets("Sheet1").Select 'シートの特定化
>  Call selfTimerMacro
>End Sub

これって動いていないことはないけれども、基本的には、シートを特定し、開いたら、そのシートを開けるようにしないといけませんね。
#4のマクロは、アクテイブシートになっています。それを、「明示的」に、
With Worksheets("Sheet1")
  If StrComp(.Range("F1").Value, "Q", 1) = 0 Then
   MsgBox "終了しました。", 64
   Exit Sub
  Else '
   .Range("F1").Value = Now  ' Format(Now, "hh:MM:ss")
  End If
  myTime = Now + TimeSerial(0, 0, 10)
  Application.OnTime myTime, "selfTimerMacro", myTime + TimeSerial(0, 0, 5)
End With

などとつけてシートを特定化してあげないといけない、ということです。
タイマーの起動中に途中で終了するとマクロが立ち上がってくるはずです。
必ず止めてから、ブックを終了させます。
途中で止める方法は、やはりマクロで行います。

>表示箇所のユーザー定義を
>d"日  "h"時"mm"分" ss"秒"
>としているにも関わらず正常な日付を表示してくれず
>1900/1/0 17:14:58 と表示されています。

Range("F1").Value = Format(Now, "hh:MM:ss")
これは、文字列を送っているだけですから、セルの表示のようにさせるなら、
Range("F1").Value = Now
とかしてみたら良いです。
    • good
    • 0

>依然、マクロの実行をしないと動いてくれません。


私には、分からないですね。たぶん、こういうのは固有の問題だと思っていますから、それを解明するのは難しいです。

まあ、デバッグのテクニックの話を紹介しておくぐらいしかしありません。ただし、これは特例です。

まず、Workbook_Open でF8を押して、ステップインで、中のマクロに飛ぶかどうかチェックします。自動実行の場合は、Workbook_Openの次辺りに、Stop メソッドを置き、マクロが止まったら、後はステップイン(F8)にして、次のマクロに飛ぶか調べるわけです。

次に、セキュリティの設定で、自動実行が動かないような設定になっていないか調べます。Workbook_Openで動かなくても不思議ではありません。

もうひとつは、途中でマクロに割り込みが入っているのか、ということがあります。割り込みが入ってしまう問題は、そんなに簡単な話ではありません。特殊なツールが必要になります。

With Worksheets("Sheet2")
If StrComp(.Range("F2").Value, "Q", 1) = 0 Then
MsgBox "終了しました。", 64
'Q/qで止めるわけだから、
.Range("F2").ClearContents  'と終了時、掃除 '←Qの文字排除/あまり関係ないが、
Exit Sub

あとは、私のマクロが、ヘタを打っているということになりますが……。もちろん、この紹介したマクロは、代用の実験的なもので、10年近く前に作ったものです。多少、凝った作りにはなっているようには感じますが、そんなに難しい内容でもありません。

私が実用で使うレベルでは、最初のマクロにもう少し手の込んだことをします。しかし、このまま、2つのマクロがダメなら、この件は、もうしわけありませんが、もう何も言えないです。

何が原因なのか、こちらに振り向けられても、こちらでは分からないのです。悪くは思わないでください。
    • good
    • 0
この回答へのお礼

なるほど ありがとうございました。

Auto_open使えば良いのですね、出来ました。

色々教えて頂きありがとうございました。

お礼日時:2017/11/01 01:13

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