測定器のソフトが測定終了後、エクセルの特定のブック名にシートを追加し、データを出力しますが、エクセルのマクロを使用してそのイベントを
検出しようとすると、測定器側のシートの保護により、エラーが発生します。(メーカ側では対処不能という回答が来ました。)そこで、VB6を使用して、そのイベントを検出する方法を検討しましたが、エクセルのシートが追加された時のイベントを取得する方法が分かりません。
例えば、エクセルが開いている時に値をコピーし、他のブックに貼り付けることは手動では可能なのですが、それをVB6でできないのはどうしてでしょうか?
Sub Main()
Set xlapp = CreateObject("Excel.Application")
Fname = "C:\Results\TRD basic 051005-4.xls"
xlapp.Workbooks.Open FileName:=Fname
xlapp.Visible = True
' ActiveWorkbook.Name
' On Error Resume Next
Initialize
Form1.Timer1.Interval = 1000
Form1.Timer2.Interval = 200
' ActiveWorkbook.Worksheets.Add
Func_loop
End Sub
Sub Initialize()
firstflag = False
fshtcnt = False
End Sub
Sub Func_loop()
Dim i As Integer
Do ' While enableflag = True
DoEvents
' For i = 0 To 1000
' i = i + 1
' Next i
'
' If bkxl_open = False Then
BackXL
' End If
If xlapp Is Nothing Then
'何もしない
Else:
If firstflag = False Then
pre_shcnt = ActiveWorkbook.Worksheets.Count
firstflag = True
End If
End If
If fshtcnt = True Then
If xlapp Is Nothing Then
Else:
Judge
End If
If Form1.Timer1.Enabled = False Then
Form1.Timer1.Enabled = True
End If
If Form1.Timer2.Enabled = False Then
Form1.Timer2.Enabled = True
End If
If Form1.countupflag Then
Form1.Label1.Caption = ""
Else
Form1.Label1.Caption = "点滅中"
End If
End If
If passflg = False Then
Cellcheck
End If
If Form1.cmdflag Then Exit Do
Loop
Form1.Timer1.Enabled = False
Form1.Timer2.Enabled = False
End Sub
Sub BackXL()
' If bkxl_open = False Then
' On Error GoTo ErrorHandoler
' Workbooks("TRD basic 051005-4.xls").Worksheets(Worksheets.Count).Activate
' xlapp.Workbooks(1).Worksheets(Worksheets.Count).Activate
'ErrorHnadoler:
' Exit Sub
' bkxl_open = True
' End If
On Error Resume Next
current_shcnt = Workbooks(1).Worksheets.Count
'この分岐処理は測定器が測定データをEXCELに出力した時に入る仕様にする
If pre_shcnt = current_shcnt - 1 Then 'シートが追加された時の処理
pre_shcnt = current_shcnt 'シート数を記憶する
Func_copysheet 'シートをコピーする
fshtcnt = True 'シートのコピー完了フラグを立てる
End If
End Sub
Sub Func_copysheet()
' ActiveSheet.Select
Worksheets(current_shcnt).Activate
ActiveSheet.Copy 'copyメソッドの引数を省略すると、bookを追加し、コピーする
End Sub
Sub Judge()
Dim a As Integer, b As Integer
' ReDim x(10, 10)
On Error GoTo errorjump
a = ActiveWorkbook.ActiveSheet.Range("F4").Value
b = ActiveWorkbook.ActiveSheet.Range("F9").Value
errorjump:
If a >= 50 Then 'しきい値を変更せよ!
enable_f4 = True
End If
If b >= 50 Then 'しきい値を変更せよ!
enable_f9 = True
End If
If (enable_f4 Or enable_f9) Then
enableflag = True
Form1.Show vbModeless
Form1.Label1.Caption = "警報発令中!!"
Else
enableflag = False
Form1.Hide
Form1.Label1.Caption = ""
End If
End Sub
Sub Cellcheck()
ActiveWorkbook.Worksheets(1).Activate
With ActiveWorkbook
With Worksheets(Worksheets.Count)
If Form1.countupflag Then
If enable_f4 Then
.Range("F4").Font.Color = 0
Else:
.Range("F4").Font.Color = RGB(255, 0, 0)
End If
If enable_f9 Then
.Range("F9").Font.Color = 0
Else:
.Range("F9").Font.Color = RGB(255, 0, 0)
End If
End If
End With
End With
passflg = True
End Sub
こういうことですか?
※「測定器側のシートの保護により、エラーが発生します。」ということは、
後から"C:\Results\TRD basic 051005-4.xls"を開くことが出来ない…ということになるのかな…?
よくわかりません(orz
'Form1.frm
Option Explicit
'[プロジェクト]-[参照設定]-[Microsoft Excel ?? Object Library]にチェック
Private xlApp As Excel.Application
Private WithEvents xlBook As Excel.Workbook
Private Sub Form_Load()
Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Open("C:\Results\TRD basic 051005-4.xls")
xlApp.Visible = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set xlBook = Nothing
xlApp.DisplayAlerts = False
xlApp.Quit
End Sub
Private Sub xlBook_NewSheet(ByVal Sh As Object)
Dim wkSheet As Worksheet
Dim cel As Range
Set wkSheet = Sh
With wkSheet
Debug.Print "NewSheet"
Debug.Print .Name
Set cel = .Cells(1, 1)
cel.Interior.Color = &HC0C0C0
cel.Value = "=sum(1,2,3,4,5,6)"
End With
End Sub
その手順でいきますと、測定器側の出力が後で来ることになりますので、
読み取り専用のワークブックを測定器が別に開いてしまい、「読み取り専用のため・・・」というエラーになります。
ということは、測定器がxlsファイルを開く前に、こちらが主導権を握っていれば可能ということですか?
そうです。それが分かれば、解決できます。
追記:主導権を握っているという意味が分かりませんが、こちらでsetステートメントを使用して、エクセルのオブジェクトをセットしても、(測定器の
メーカー側のソフトのためブラックボックスであり、)メーカ側ソフトが
読取り専用の同名のファイル名で別のブックを開くので、測定データを読み取り専用のブックに書込めないことが問題となります。
メーカー側ソフトがブックを開いて、データを出力したイベントを検知して
そのシートのデータを参照(例えばコピーする)する方法が分かればいいのですが・・・。そこで、そのシートにアクセスする為の、VBのコードが分かればいいと考えます。
…全体をざっと見て
>例えば、エクセルが開いている時に値をコピーし、他のブックに貼り付けることは手動では
>可能なのですが、それをVB6でできないのはどうしてでしょうか?
手動でできることはVB6からもほぼできます。できない場合、やり方(考え方)が悪いだけだ
と思って良いです。
>測定器側のシートの保護により、エラーが発生します。
まずはシートの保護を解除してみてください。
>エクセルのシートが追加された時のイベントを取得する方法が分かりません。
既に示された、タイマーで前回よりシート数が増えていたら…のコードで対処
できそうなら不必要な内容です。質問を分かり難くするだけですので、問題を
切り分けて2次的に発生している問題を混ぜないように心掛けましょう。
>外部ソフトのエクセルシートの追加イベントを取得するには?
既に起動しているエクセルファイルのオブジェクトを取得する方法は
過去ログにもありますが、見当はずれな方向に行きそうなので保留します。
| ツイート |
|