タイマーソフトを起動していてシートの書き込みで停止させない方法は

解決


ksc  2006-06-01 20:35:29  No: 95591

こんにちはは  当方2000SP4  オフィス2000パーソナル  VB6でソフトを作っているのですが
VBAに  タイマーがないので  自作のタイマーで  作業を行っているのですが
ソフト起動はうまく動くのですが  エクセルのシートに  記入などすると  停止してしまいます
何か  いい方法はないでしょうか
よいタイマーがあれば教えてもらえませんか

timer1 =1 で動き  0で停止です

 Do
     DoEvents
   
   t = Time
   h = Mid(t, 1, serchword(t, ":") - 1)
   t = Mid(t, serchword(t, ":") + 1, Len(t) - serchword(t, ":"))
    m = Mid(t, 1, serchword(t, ":") - 1)
    s = Mid(t, serchword(t, ":") + 1, Len(t) - serchword(t, ":"))
    
If kiroku4 <> s Then

 kiroku4 = s
'作業工程を書く

  DoEvents

  If timer1 = 0 Then Exit Sub  
  
  End If
  Loop


ksc  2006-06-01 20:36:40  No: 95592

timer1 =1 で動き  はまちがいです


特攻隊長まるるう  2006-06-02 04:51:04  No: 95593

サンプルコードを見ましたが、どの辺りが『自作のタイマー』
なのか理解できませんでした。

秒を求める部分は
    Dim s As String
    s = Format$(Time, "ss")
でいい様な気もしますが…何にせよ変数のデータ型は
明記してください。省略すると何をやっているのか伝わり
難くなります。

timer1 は何でしょうか?どこでも設定されていませんから、
最初から最後まで 0 なのでは?

kiroku4 も何かサッパリ分かりませんが、
>If kiroku4 <> s Then
ですから、60分の1の確率でループする可能性があるものの、
ほぼ、実行すると『'作業工程を書くをして終了』というプログラム
ではないでしょうか?
timer1 =1 だと延々とループをまわしまくる…って感じ?

どういう条件で何を実行して、実行した後はどうしたいのでしょうか?

>VB6でソフトを作っているのですが
…ならVB6のタイマーを使ったら良いのでは???
[Excel VBA]のみで実現するなら OnTime メソッドを使ってみるとか。


ksc  2006-06-02 15:12:38  No: 95594

すいません  抜けてました

If kiroku4 <> s Then  の行で
一秒間に1回どうさするように  したつもりです

public timer1  as integer

public sub time
dim kiroku4
kiroku4=0

 Do
     DoEvents
   
   t = Time
   h = Mid(t, 1, serchword(t, ":") - 1)
   t = Mid(t, serchword(t, ":") + 1, Len(t) - serchword(t, ":"))
    m = Mid(t, 1, serchword(t, ":") - 1)
    s = Mid(t, serchword(t, ":") + 1, Len(t) - serchword(t, ":"))
    
If kiroku4 <> s Then

 kiroku4 = s
'作業工程を書く

  DoEvents

  If timer1 = 0 Then Exit Sub  
  
  End If
  Loop
end sub


ksc  2006-06-02 15:27:07  No: 95595

すいません  訂正します
秒を調べて  一秒間に一回処理をするようにしたつもりです

public timer1  as integer

public sub time
dim kiroku4 , s
kiroku4=0

 Do
     DoEvents
   
 s = Format$(Time, "ss")

    
If kiroku4 <> s Then

 kiroku4 = s
'作業工程を書く

  DoEvents

  If timer1 = 0 Then Exit Sub  
  
  End If
  Loop
end sub


特攻隊長まるるう  2006-06-02 18:57:47  No: 95596

>秒を調べて  一秒間に一回処理をするようにしたつもりです
つもりはいいんだけど、実行した結果は?そのくらい自分で
調べられるでしょ?自分の書いたコードの結果を検証して、
バグをとる事をデバッグと呼び、これは ksc さんのすべきこと
ですよ?

まず、プログラムの基本として、

・適正なインデントをしてください。通常、[Tab]キーでインデントします。
http://e-words.jp/w/E382A4E383B3E38387E383B3E38388.html

・適正な大文字と小文字を使ってください。
[Excel VBA]ならコードで書けば変更してくれるのでは?何故に小文字?
掲示板に手書きはスペルミスなどが起こるので避けましょう。

・関数名がまずいです。
>public sub time
既に時間を求める Time() 関数が用意されていますので、ユーザ独自の
関数名を time() にするとそちらが優先され、正常に動作しません。
変数名などを含め、かぶらないような名前を付けてください。
#   確認する方法はコードを右クリックして[定義]で飛んでください。
#   既存の関数の場合、オブジェクトブラウザに飛びます。思っていた
# 場所と違った場合は名前を修正してください。

・変数の明示的な宣言を覚えてください。
>dim kiroku4 , s
この宣言ではデータ型は Variant 型になります。何でも入ってしまう型
ですので必要な箇所以外では使わないようにしてください。
プログラムの先頭で
  Option Explicit
と宣言してください。意味はヘルプで調べてください。
#   ここまでは基本中の基本です。それができていませんので、プログラム
# の内容について質問ができるレベルに到達していません。入門本を読んで
# 最低限の知識くらいはつけてから、プログラムする事をお勧めします。

[Excel VBA] 
Option Explicit
Public timer1 As Integer

Public Sub TestRun()
    Dim kiroku4 As Long
    Dim s As Long
    kiroku4 = 0
'''    timer1 = 1
    Do
        DoEvents
        s = CLng(Format$(Time, "ss"))
        If kiroku4 <> s Then
            kiroku4 = s
            '作業工程を書く
            
            DoEvents
            If timer1 = 0 Then Exit Sub
        End If
    Loop
End Sub

・相変わらず timer1 をどこでも設定していません。
Integer は数値型ですので宣言した時点で初期値 0
が入ります。ですから1回実行して終わりです。
'''    timer1 = 1
をコメントからコードに戻せばループをまわすことは
可能です。ただし、このままではCPU使用率が100%
近くなってアプリの動作が鈍くなるでしょう。

その場合は API の Sleep 関数を使うか、せっかく回答した
のに意味が分からなかったからか?思いっきり無視(怒)された
>>VB6でソフトを作っているのですが
>…ならVB6のタイマーを使ったら良いのでは???
>[Excel VBA]のみで実現するなら OnTime メソッドを使ってみるとか。
あたりを調べてみてください。


ksc  2006-06-03 05:37:57  No: 95597

早速のご返事ありがとうございます
OnTime メソッド  については  なかなか難しく  調べたのですが
使い方がわからない状態で  無視したつもりはありません
VB6のタイマーなのですが  最初に書いたのが悪かったのですが  今回VBAで
タイマーを使いたくて  すいません  API  のSleepは  調べてみます


ksc  2006-06-03 07:31:06  No: 95598

聞きたかったのは  VBAで  このループを  繰り返しているときに
エクセルの  sheetに  文字を記入したりすると  ループが停止してしまうため
どうしたらいいかを聞きたかったのです

デバッグを  していただくつもりはありませんでした
不愉快な思いをさせたのならすみませんでした
AVBに  Timerがついていればよかったのですが

CPU使用率  を減らすには  loopに  

Sleep 関数を  はさんでおくほうがいいのですね

ありがとうございます


Dental  2006-06-03 08:19:16  No: 95599

> VBAに  タイマーがないので
とは限らない。たとえば Access なら、Form に
TimerIntervalプロパティ / Timerイベントが存在するから。

だから質問時には、「どのVBAなのか」も明示する事。

  
> Sleep 関数を  はさんでおくほうがいいのですね

駄目。

使い方が簡単なので、サンプル等で使われてしまう事も多いのだけど、
Sleep(Ex) は本来、VBA や VB6 から積極的に呼ぶようなものじゃない。

Excel VBA ならば素直に OnTime メソッドの使い方を調べた方が良い。

ただし OnTime の使い方がわかったとて、問題の解決にはならないはず。
入力中にプログラム制御を受け付けないという点では変わらないから。
そしてこれは Sleep を使った場合も同様。VB6 等からの外部制御も無理。

なので、個人的には「諦めましょう」に一票。


ksc  2006-06-03 16:59:40  No: 95600

確かに  使っているのは
オフィス2000パーソナルでアクセスは入っていません

ありがとうございます
辞めます・・・・・
残念


特攻隊長まるるう  2006-06-05 21:11:23  No: 95601

>使い方が簡単なので、サンプル等で使われてしまう事も多いのだけど、
>Sleep(Ex) は本来、VBA や VB6 から積極的に呼ぶようなものじゃない。
microsoft のサポートオンラインで、サンプルコードとして使われている場合も
あるし、使っちゃいけないなら使えないようにしておくべきで、使える以上、
使ってもいいと思いますが。(コピペしかできないレベルの人が API を使っ
ちゃうのに恐怖はあるけど。)
否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。
そのあたりのキーワードが1行2行書いてあると、たいへん勉強になります
のでm(__)m

今回、プログラムが止まるのはエラーで落ちてるのが理由のようです。
このままのコードではエラーメッセージは表示されませんが、エクセルでは
ありがちなことで、エラートラップすればエラーメッセージが取れました。

>入力中にプログラム制御を受け付けないという点では変わらないから。
そうですね。エクセルの機能上仕方ないと思います。ただ、もう少し妥協点を
探る余地はありそうでしたが。。。
ちなみに、OnTime メソッドならエラーで落ちるのではなく、セルを確定後に
動いてくれるようです。
また、いいプログラムだとは思いませんが、前述のエラートラップでの処理も
可能かもしれません。

>OnTime メソッド  については  なかなか難しく  調べたのですが
>使い方がわからない状態で  無視したつもりはありません
いや、普通にヘルプに使用例載ってるし(^^;)自分の現状を伝える気が
なかったのは確実ですし。
 # 今までの経験上、こちらが念を押さないと流される確率90%ですw

「諦めましょう」が通用するならありがたいよねぇ。。。


VB梅  2006-06-05 21:48:51  No: 95602

kscさんへ

ここの回答者は厳しいのです!
今回の質問の内容はシートを入力状態にすると
エクセルのVBAが止まる件は、対策は色々あります。

ThisWorkbookに
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
        Cancel = True
End Sub
を記入するだけでダブルクリックでは入力できません。
ここに入力用フォームを作成しダブルクリックで選択されているセルに代入する方法もよし

ただし、


VB梅  2006-06-05 21:59:10  No: 95603

書き終える前に送信を押してしまいました。

ただし、数式バー等は消しましょう。
(ここで入力しようとすると同じくVBAがストップします。)

タイマーにこだわることはありませんよ。
VBAがストップするのはエクセルVBAの仕様ですからね

VBAのことはモーグで聞くと良いです。
”VBA  モーグ”で検索すると出てくるでしょう  
親切に教えてくれますよ。


Dental  2006-06-05 22:01:06  No: 95604

> 使っちゃいけないなら使えないようにしておくべきで、
使えないとは書いてない。
限定された条件下では使えるけれど、積極的に使用するような物じゃないというだけ。

> 否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。
SDKにも書いてある事だけど、メッセージループが阻害されるから。
Sleepするアプリが多数重なると、システム全体が重くなるし。


VB梅  2006-06-05 22:08:02  No: 95605

あらら^^
タイマーは必要なのか・・・

そのた、シート上の右クリックもキャンセルで
表示しないようにもできるし。

VBAが一時ストップする原因となるものは全て非表示にすると良いです。

がんばです!


もげ  2006-06-06 03:38:54  No: 95606

>特攻隊長殿

>否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。

最近目にしたもので、ご参考になれば。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?no=6557&reno=no&oya=6557&mode=msgview&page=0
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?no=6547&reno=no&oya=6547&mode=msgview&page=0


ksc  2006-06-06 06:44:51  No: 95607

皆さんありがとうございます
がんばってみます  これからもよろしくお願いします


ksc  2006-06-18 18:30:20  No: 95608

OnTimeで  まわすと  コンピュータに  負荷をかけないで  また
エクセルに入力後  回りだす  ようになりました

ありがとうございました

Sub AppStart()

If timer1 = 0 Then Exit Sub
  
  
          Application.OnTime Now + TimeValue("00:00:01"), "beepbt"
      End Sub
      
      Sub beepbt()
'Beep

AppStart
End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加