こんにちはは 当方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
timer1 =1 で動き はまちがいです
サンプルコードを見ましたが、どの辺りが『自作のタイマー』
なのか理解できませんでした。
秒を求める部分は
Dim s As String
s = Format$(Time, "ss")
でいい様な気もしますが…何にせよ変数のデータ型は
明記してください。省略すると何をやっているのか伝わり
難くなります。
timer1 は何でしょうか?どこでも設定されていませんから、
最初から最後まで 0 なのでは?
kiroku4 も何かサッパリ分かりませんが、
>If kiroku4 <> s Then
ですから、60分の1の確率でループする可能性があるものの、
ほぼ、実行すると『'作業工程を書くをして終了』というプログラム
ではないでしょうか?
timer1 =1 だと延々とループをまわしまくる…って感じ?
どういう条件で何を実行して、実行した後はどうしたいのでしょうか?
>VB6でソフトを作っているのですが
…ならVB6のタイマーを使ったら良いのでは???
[Excel VBA]のみで実現するなら OnTime メソッドを使ってみるとか。
すいません 抜けてました
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
すいません 訂正します
秒を調べて 一秒間に一回処理をするようにしたつもりです
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
>秒を調べて 一秒間に一回処理をするようにしたつもりです
つもりはいいんだけど、実行した結果は?そのくらい自分で
調べられるでしょ?自分の書いたコードの結果を検証して、
バグをとる事をデバッグと呼び、これは 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 メソッドを使ってみるとか。
あたりを調べてみてください。
早速のご返事ありがとうございます
OnTime メソッド については なかなか難しく 調べたのですが
使い方がわからない状態で 無視したつもりはありません
VB6のタイマーなのですが 最初に書いたのが悪かったのですが 今回VBAで
タイマーを使いたくて すいません API のSleepは 調べてみます
聞きたかったのは VBAで このループを 繰り返しているときに
エクセルの sheetに 文字を記入したりすると ループが停止してしまうため
どうしたらいいかを聞きたかったのです
デバッグを していただくつもりはありませんでした
不愉快な思いをさせたのならすみませんでした
AVBに Timerがついていればよかったのですが
CPU使用率 を減らすには loopに
Sleep 関数を はさんでおくほうがいいのですね
ありがとうございます
> VBAに タイマーがないので
とは限らない。たとえば Access なら、Form に
TimerIntervalプロパティ / Timerイベントが存在するから。
だから質問時には、「どのVBAなのか」も明示する事。
> Sleep 関数を はさんでおくほうがいいのですね
駄目。
使い方が簡単なので、サンプル等で使われてしまう事も多いのだけど、
Sleep(Ex) は本来、VBA や VB6 から積極的に呼ぶようなものじゃない。
Excel VBA ならば素直に OnTime メソッドの使い方を調べた方が良い。
ただし OnTime の使い方がわかったとて、問題の解決にはならないはず。
入力中にプログラム制御を受け付けないという点では変わらないから。
そしてこれは Sleep を使った場合も同様。VB6 等からの外部制御も無理。
なので、個人的には「諦めましょう」に一票。
確かに 使っているのは
オフィス2000パーソナルでアクセスは入っていません
ありがとうございます
辞めます・・・・・
残念
>使い方が簡単なので、サンプル等で使われてしまう事も多いのだけど、
>Sleep(Ex) は本来、VBA や VB6 から積極的に呼ぶようなものじゃない。
microsoft のサポートオンラインで、サンプルコードとして使われている場合も
あるし、使っちゃいけないなら使えないようにしておくべきで、使える以上、
使ってもいいと思いますが。(コピペしかできないレベルの人が API を使っ
ちゃうのに恐怖はあるけど。)
否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。
そのあたりのキーワードが1行2行書いてあると、たいへん勉強になります
のでm(__)m
今回、プログラムが止まるのはエラーで落ちてるのが理由のようです。
このままのコードではエラーメッセージは表示されませんが、エクセルでは
ありがちなことで、エラートラップすればエラーメッセージが取れました。
>入力中にプログラム制御を受け付けないという点では変わらないから。
そうですね。エクセルの機能上仕方ないと思います。ただ、もう少し妥協点を
探る余地はありそうでしたが。。。
ちなみに、OnTime メソッドならエラーで落ちるのではなく、セルを確定後に
動いてくれるようです。
また、いいプログラムだとは思いませんが、前述のエラートラップでの処理も
可能かもしれません。
>OnTime メソッド については なかなか難しく 調べたのですが
>使い方がわからない状態で 無視したつもりはありません
いや、普通にヘルプに使用例載ってるし(^^;)自分の現状を伝える気が
なかったのは確実ですし。
# 今までの経験上、こちらが念を押さないと流される確率90%ですw
「諦めましょう」が通用するならありがたいよねぇ。。。
kscさんへ
ここの回答者は厳しいのです!
今回の質問の内容はシートを入力状態にすると
エクセルのVBAが止まる件は、対策は色々あります。
ThisWorkbookに
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
を記入するだけでダブルクリックでは入力できません。
ここに入力用フォームを作成しダブルクリックで選択されているセルに代入する方法もよし
ただし、
書き終える前に送信を押してしまいました。
ただし、数式バー等は消しましょう。
(ここで入力しようとすると同じくVBAがストップします。)
タイマーにこだわることはありませんよ。
VBAがストップするのはエクセルVBAの仕様ですからね
VBAのことはモーグで聞くと良いです。
”VBA モーグ”で検索すると出てくるでしょう
親切に教えてくれますよ。
> 使っちゃいけないなら使えないようにしておくべきで、
使えないとは書いてない。
限定された条件下では使えるけれど、積極的に使用するような物じゃないというだけ。
> 否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。
SDKにも書いてある事だけど、メッセージループが阻害されるから。
Sleepするアプリが多数重なると、システム全体が重くなるし。
あらら^^
タイマーは必要なのか・・・
そのた、シート上の右クリックもキャンセルで
表示しないようにもできるし。
VBAが一時ストップする原因となるものは全て非表示にすると良いです。
がんばです!
>特攻隊長殿
>否定するなら注意点や問題点を具体的に書いてくれると嬉しいです。
最近目にしたもので、ご参考になれば。
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
皆さんありがとうございます
がんばってみます これからもよろしくお願いします
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
ツイート | ![]() |