外部ソフトのエクセルシートの追加イベントを取得するには?


YCOSAP  2005-12-18 14:53:17  No: 129005

測定器のソフトが測定終了後、エクセルの特定のブック名にシートを追加し、データを出力しますが、エクセルのマクロを使用してそのイベントを
検出しようとすると、測定器側のシートの保護により、エラーが発生します。(メーカ側では対処不能という回答が来ました。)そこで、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


ガッ  2005-12-18 16:23:47  No: 129006

こういうことですか?
※「測定器側のシートの保護により、エラーが発生します。」ということは、
  後から"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


YCOSAP  2005-12-19 10:17:21  No: 129007

その手順でいきますと、測定器側の出力が後で来ることになりますので、
読み取り専用のワークブックを測定器が別に開いてしまい、「読み取り専用のため・・・」というエラーになります。


ガッ  2005-12-19 11:08:37  No: 129008

ということは、測定器がxlsファイルを開く前に、こちらが主導権を握っていれば可能ということですか?


YCOSAP  2005-12-19 14:27:35  No: 129009

そうです。それが分かれば、解決できます。


YCOSAP  2005-12-19 15:04:24  No: 129010

追記:主導権を握っているという意味が分かりませんが、こちらでsetステートメントを使用して、エクセルのオブジェクトをセットしても、(測定器の
メーカー側のソフトのためブラックボックスであり、)メーカ側ソフトが
読取り専用の同名のファイル名で別のブックを開くので、測定データを読み取り専用のブックに書込めないことが問題となります。
メーカー側ソフトがブックを開いて、データを出力したイベントを検知して
そのシートのデータを参照(例えばコピーする)する方法が分かればいいのですが・・・。そこで、そのシートにアクセスする為の、VBのコードが分かればいいと考えます。


特攻隊長まるるう  2005-12-20 14:41:40  No: 129011

…全体をざっと見て
>例えば、エクセルが開いている時に値をコピーし、他のブックに貼り付けることは手動では
>可能なのですが、それをVB6でできないのはどうしてでしょうか?
手動でできることはVB6からもほぼできます。できない場合、やり方(考え方)が悪いだけだ
と思って良いです。

>測定器側のシートの保護により、エラーが発生します。
まずはシートの保護を解除してみてください。

>エクセルのシートが追加された時のイベントを取得する方法が分かりません。
既に示された、タイマーで前回よりシート数が増えていたら…のコードで対処
できそうなら不必要な内容です。質問を分かり難くするだけですので、問題を
切り分けて2次的に発生している問題を混ぜないように心掛けましょう。

>外部ソフトのエクセルシートの追加イベントを取得するには?
既に起動しているエクセルファイルのオブジェクトを取得する方法は
過去ログにもありますが、見当はずれな方向に行きそうなので保留します。


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

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







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