たとえば、1秒おきにある配列に適当な数値を代入するにはどうすればよろしいでしょうか。Timer イベントの発生のさせ方はわかるのですが…。
ってか、これじゃ質問の意味がわかんないですよね。例えば、1秒毎にそのときの時刻の、「秒」を配列 a に格納することにします。。はじめた時間が 14:35:17 なら、
a(0) = 17, a(1) = 18, a(2) = 19, a(3) = 20,…
というようにしたいのです。これでなんとなく分かって頂けると思うんですが。よろしくお願いします。

A 回答 (2件)

ぼくはVBのタイマーを信用していません。


VBのタイマーは、タイマーイベントのロジックの処理の重さにより多少ずれているように思えるのです。(正確だというのであればごめんなさい)

ちなみにAPI関数でWINDOWSが起動してからどれだけの時間が経過したかなどの、時間に関するものがあります。そういったものを使用したほうが、コンパイル後のEXEが小さくすみます。

タイマーコントロールを使用しないやり方を記述します。

処理の簡単なながれとしては
直前の実行時から1秒経過したら、配列に値をセットするようになってます。
実行秒数は、配列要素の数だけの秒数を実行します。

----以下のソースを貼り付けてください。----
必要なものフォームとコマンドボタン1

Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private pTime    As Long
Private lngWork(5)  As Long
Private lngCount  As Long

Private Sub Command1_Click()
  Dim maxCount  As Long
  Dim lngGetTime As Long
  
  Command1.Enabled = False
  
  lngCount = LBound(lngWork)
  maxCount = UBound(lngWork)

  'とりあえず開始の時間を取得
  pTime = timeGetTime
  
  Do Until lngCount > maxCount
    DoEvents
    '時間を取得
    lngGetTime = timeGetTime
    '前回の処理から1秒経過すると以下の処理を行う
    If (lngGetTime - pTime >= 1000) Then
      lngWork(lngCount) = lngGetTime
      pTime = lngGetTime
      lngCount = lngCount + 1
    End If
  Loop
  MsgBox "end"
  Command1.Enabled = True
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。わざわざソースまで書いてくださって、とてもうれしいです。大変参考になりました。おかげさまで問題はほぼ解決できました。勉強になりました。

お礼日時:2001/10/17 16:52

「Timerイベント」が発生するたびに変数が初期化されるのが問題なのでしょうか?


でしたら、「Staticステートメントで変数を宣言する。」あるいは、モジュールの宣言セクションで「Publicキーワードを使って”パブリック変数”を宣言する。」を利用してみてはいかがでしょうか?
どちらの場合でも、途中で初期化(0?)する必要がある場合はそのタイミングが難しいかも知れません。
ご参考までに...
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございます。ただ、初心者なので、ちょっと難しいですね。もっともっとレベルアップしたいところです。

お礼日時:2001/10/17 16:50

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

このQ&Aと関連する良く見られている質問

Q「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現在のセル( n , "A" )より14行上に数値がないことを確認するために
'14行上のセルを全て足し算しています。
For m = n - 14 To n - 1
s = s + Worksheets("Sheet1").Cells(m, "A").Value
Next

'足し算結果がゼロならば何も記入していないと判断し、
'数字の「1」を記入します。
If s >= 1 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 0
ElseIf s = 0 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 1
End If
End Sub

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現...続きを読む

Aベストアンサー

はいはい了解。

今着目しているセルが (n,1)であるとする。

条件: 今いるところから上に14行サーチして、一度でも1か2の値が見つかったら
     回答を0とする。14行すべてに1・2の値がひとつも含まれていなければ1とする。



Ans = 1

for i = 1 to 14

x = cells ( n - i , 1 ).value

if x = 1 or x = 2
then
Ans = 0
endif
next i


cells ( n , 1 ) = Ans


デフォルトの回答値=1としておき、一回でも条件にヒットしたら回答値=0にする。
ヒットしたらfor~nextを強制的に閉じてもいいけど、面倒なのでそのまま14回検索する。

QSystem.Timers.Timer について

下記のようなコードで動いていますが、
TestFunc に独自の引数を渡したいと考えています。
どうすれば実現できるでしょうか?
引数以外(メンバ変数等)では対応できていますので、
引数の方法だけ教えてほしいです。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

timer = New System.Timers.Timer()
AddHandler timer.Elapsed, New ElapsedEventHandler(AddressOf TestFunc)

timer.Interval = 1000
timer.Start()

End Sub

Public Sub TestFunc(ByVal sender As Object, ByVal e As ElapsedEventArgs)
Console.WriteLine(DateTime.Now)
End Sub

下記のようなコードで動いていますが、
TestFunc に独自の引数を渡したいと考えています。
どうすれば実現できるでしょうか?
引数以外(メンバ変数等)では対応できていますので、
引数の方法だけ教えてほしいです。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

timer = New System.Timers.Timer()
AddHandler timer.Elapsed, New ElapsedEventHandler(AddressOf TestFunc)

timer.Interval = 1000
timer.Sta...続きを読む

Aベストアンサー

デリゲートは型が決まっているので,引数の数や型を変更することは出来ません。

Q座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な座標の求め方

VBで図形を入力した線分に対称に反転した図形と書こうとしています。
その為に必要な座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な
座標B(X',Y')の求め方についてご教授お願いいたします。

Aベストアンサー

 次の関係から連立方程式を解いてください。

 点P(aX,aY)、点Q(bX,bY)とすると、

・直線PQと直線ABは垂直に交わる。 ⇒2つの直線の傾きを掛けると-1になる。

・2点ABの中点Mが直線PQ上を通る。⇒直線PQの方程式に点M((X+X')/2, (Y+Y')/2)を代入する。

QVBの配列 IsNull, IsNuthing, ...? 用途がわかりません。

以下の場合、(1)で範囲エラーとなります。
redim a(0)とすると、a配列に1個データがあるということで、for文が実行されますが。
Redimしないまま(データが無い意味としたいので)で、このFor文をパスするには、どのように記述すればよいのでしょうか?

dim a() as string

'----->(2)
for i=LBound(a) to UBound(a) '---->(1)
msgbox(a(i))
next i

Aベストアンサー

string限定ですが、
a=split("","A")
とか、ありえないsplitを行うとか・・・
ubound(a)=-1になります。

ちなみに、SafeArrayAllocDescriptor は、excelやaccessのvbaでもOKです。

Qwebbrowserで配列になっているtextboxへの値の代入

VB6/VBAのwebbrowserで配列になっているtextboxへ
値を代入したいと思います。この場合の指定はどの
ようにすればいいのでしょうか?

<input type="text" name="products_name[1]">

<input type="text" name="products_name[2]">

こんな感じです。

Aベストアンサー

どこまでコードが出来ているのかわからないので要点だけ。

Dim doc As HTMLDocument

'(ここにブラウザのHTMLDocumentを取得するコード)

doc.getElementsByName("products_name[1]").item(0).value = "NewValue1"
doc.getElementsByName("products_name[2]").item(0).value = "NewValue2"

または
doc.forms(0).item("products_name[1]").value = "NewValue"


ところで、name属性でこのような書式ははじめてみたのですが、これって配列として認識されているのでしょうか?

<input type="text" name="products_name">
<input type="text" name="products_name">
このように同じnameであれば配列として扱われますが・・・。


このカテゴリの人気Q&Aランキング

おすすめ情報