本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

締切済み
※ ChatGPTを利用し、要約された質問です(原文:カウンターボード⇒EXCEL2000にVBAでデ…)

カウンターボード⇒EXCEL2000にVBAでデータを取込みたい

2023/10/16 05:17

このQ&Aのポイント
  • ロータリーエンコーダ(2相式パルス)のカウンターの値をカウンターボードを経由しEXCEL2000に取込みたいと考えています。
  • カウンターボードに付属してきたサンプルプログラムでは正常に動作します。(ボードは正常)
  • そこでEXCELサンプルプログラムを動作したのですが、コンパイラーエラーが発生し動作しません。
※ 以下は、質問の原文です

カウンターボード⇒EXCEL2000にVBAでデ…

2008/08/01 22:44

カウンターボード⇒EXCEL2000にVBAでデータを取込みたい

ロータリーエンコーダ(2相式パルス)のカウンターの値をカウンターボードを経由しEXCEL2000に取込みたいと考えています。
カウンターボードに付属してきたサンプルプログラムでは正常に動作します。(ボードは正常)
そこでEXCELサンプルプログラムを動作したのですが、コンパイラーエラーが発生し動作しません。
ボード認識や初期設定は同じにしてあるため、EXCEL VBAのサンプルプログラムのミスだと思われます。
プログラムは下記に添付します。このうち"Acx Timer1.TimEnabled"変数が未定義というエラーが出ます。
また自分で変数を定義してみましたが、今度は”修飾子が不正”というエラーが出ます。
どう修正すれば動作する様になるでしょうか?ご教授ください。
'--------------------------------------------------------------------------------
' Count
'--------------------------------------------------------------------------------
Option Explicit
Const EXP_SAMPLE = "カウンタ入力用サンプルです。"
Const EXP_TITLE = "Countサンプル"
Const PROG_TITLE = "カウンタ入力:"
Dim ret As Integer '戻り値格納用
Dim i As Integer '一時的なカウンタ

'--------------------------------------------------------------------------------
'カウント一致検出
Private Sub AcxCnt1_OnDetectedMatch(ByVal ChannelNumber As Integer, ByVal MatchValue As Long, ByVal Direction As Integer)
Range("lblDisp").Value = "カウント一致 CH" & ChannelNumber & " カウント値 = " & MatchValue & " 方向 = " & Direction
End Sub

'エラー発生
Private Sub AcxCnt1_OnErr(ByVal Status As Integer)
Range("lblDisp").Value = AcxCnt1.GetErrorString(Status)
End Sub

'--------------------------------------------------------------------------------
'タイマイベント:カウント値表示処理
Private Sub AcxTimer1_Timer(ByVal TimerCnt As Long)
Dim i As Integer
Dim tmpStr As String
'カウント値の表示
tmpStr = ""
For i = 0 To AcxCnt1.MaxChannelNumber - 1
tmpStr = tmpStr & "CH" & i & " = " & AcxCnt1.CountValue(i) & Chr(10)
Next i
Range("lblCount").Value = tmpStr
End Sub

'カウント値のラッチ
Private Sub chkLatch_Click()
'チェック
If chkLatch.Value = True Then
AcxCnt1.LatchCount = True 'ラッチ
cmdApply.Enabled = True
Else
AcxCnt1.LatchCount = False 'ラッチ解除(通常読み込み)
cmdApply.Enabled = False
End If
End Sub

'データ更新
Private Sub cmdApply_Click()
AcxCnt1.LatchCount = True
End Sub

'表示クリア
Private Sub cmdClear_Click()
Range("lblCount").Value = ""
Range("lblDisp").Value = ""
End Sub

'--------------------------------------------------------------------------------
'カウント開始
Private Sub cmdStart_Click()
Dim i As Integer
For i = 0 To AcxCnt1.MaxChannelNumber - 1
AcxCnt1.CountEnabled(i) = True
Next i
AcxTimer1.TimEnabled = True
End Sub

'--------------------------------------------------------------------------------
'カウント停止
Private Sub cmdStop_Click()
Dim i As Integer
AcxTimer1.TimEnabled = False
For i = 0 To AcxCnt1.MaxChannelNumber - 1
AcxCnt1.CountEnabled(i) = False
Next i
End Sub

'--------------------------------------------------------------------------------
'ロード時の処理
Public Sub Load()
'設定ファイルの読み込み
AcxCnt1.ErrorMessage = False
ret = AcxCnt1.LoadProperty(ThisWorkbook.Path & "\ACXCNT.INI")
Sheet1.Name = "AcxCnt Count サンプル"
Range("lblDisp").Value = "ボード名 : " & Chr(10) & _
"I/Oアドレス : " & " 0h" & Chr(10) & _
"割込み : " & "0" & Chr(10) & _
"チャネル数:" & "0"

'自動検出
If ret <> 0 Then '設定ファイルがなければ検出/登録を試みる
ret = AcxCnt1.AutoDetect("CNT000")
If (ret = 0) Then
AcxCnt1.DeviceName = "CNT000" 'デバイス名CNT000のボードを選択
If (fncOpen = 0) Then '初期化ルーチン実行
MsgBox EXP_SAMPLE, vbOKOnly + vbInformation, EXP_TITLE 'サンプル説明表示
End If
Else
MsgBox "ボードを自動的に検出できませんでした。" & vbCrLf & _
"[プロパティ]ボタンを押してボードを登録してください。"
End If
Else
fncOpen '設定ファイルがあるのでそのまま初期化ルーチン実行
End If
End Sub

'--------------------------------------------------------------------------------
'初期化処理
Function fncOpen() As Integer
AcxCnt1.TimEnabled = False
ret = AcxCnt1.Open '初期化
If ret = 0 Then
fncDispProperty 'プロパティの設定を表示
Else
MsgBox "エラーコード = " & ret & vbCrLf & _
AcxCnt1.GetErrorString(ret), vbOKOnly + vbCritical, "初期化(Openメソッド)エラー"
End If
fncOpen = ret
End Function

'--------------------------------------------------------------------------------
'プロパティページの表示
Private Sub cmdShowProperty_Click()
Dim tmpBoardName As String, tmpDeviceName As String
tmpBoardName = AcxCnt1.BoardName 'ボードが変更されたかどうかを知るために記憶します
tmpDeviceName = AcxCnt1.DeviceName 'デバイス名が変更されたかどうかを知るために記憶します
AcxCnt1.ShowProperty 'プロパティページを表示
'プロパティページでボードが変更された?
If (tmpBoardName <> AcxCnt1.BoardName) Or (tmpDeviceName <> AcxCnt1.DeviceName) Then
MsgBox "ボードが変更されました。" & Chr(10) & _
"初期化しなおします。"
fncOpen '初期化時の処理(fncOpen内でタイマを開始)
Else
fncDispProperty '設定表示を更新
End If
End Sub

'--------------------------------------------------------------------------------
'プロパティの設定状態を表示
Sub fncDispProperty()

Range("lblDisp").Value = "ボード名 : " & AcxCnt1.BoardName & Chr(10) & _
"I/Oアドレス : " & Hex(AcxCnt1.IoAddress) & " h" & Chr(10) & _
"割込み : " & AcxCnt1.IrqLevel & Chr(10) & _
"チャネル数:" & AcxCnt1.MaxChannelNumber
End Sub

回答 (1件中 1~1件目)

2008/08/02 08:38
回答No.1

VBAのことは全く知りませんが、問題のプログラムは新規に作成していますか?
Timer(Timer1)はシステムコントロールなので、FormにTimerコントロールを貼り付けなければ使用できないと思います。

お礼

2008/08/02 12:55

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

このプログラムは新規に作成しており、FormにTimerコントロールも貼り付けてあります。当初、タイマー付きのカウンターボードを想定し作成されたものを改造し
システムタイマーを使用する様にしたものです。

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。