Showing results 1 to 7 of 7

Thread: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

  1. #1
    Join Date
    27.08.2011
    Posts
    88

    Default VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Hallo,

    Ich möchte, dass mein Vba Script "Public Sub Home_Anzeigen" immer dann ausgeführt wird, wenn sich ein Wert im Online Container ändert.

    Das Script läuft soweit und wenn ich es manuell aufrufe macht es auch das was es soll. Der Fehler liegt also sicherlich im 'Programmteil, der das Script aufruft.

    Weiters bekomme ich eine Fehlermeldung "Run-time error '13' Type mismatch" in folgender Zeile:

    If thisProject.Variables.Item("Zelle[" & CStr(m) & "].Zelle_Frg").Value = 0 Then

    Hier der gesamte Code:

    Public WithEvents vHome_Anzeigen As OnlineVariable    'Home_Anzeigewerte
    Const strHome_Anzeigen As String = "Home_Anzeigen"
    
    
    
    
    'deactivate 'vHome_Anzeigen' event
    If Not vHome_Anzeigen Is Nothing Then vHome_Anzeigen.Undefine
    Set vHome_Anzeigen = Nothing
    
    
    
    'Online Container erstellen und mit Werten füllen
    Dim m As Integer
        
        Set vHome_Anzeigen = thisProject.OnlineVariables.Item(strHome_Anzeigen)
        If vHome_Anzeigen Is Nothing Then
            'if not exitst, create a new OnlineVariable container
            Set vHome_Anzeigen = thisProject.OnlineVariables.CreateOnlineVariables(strHome_Anzeigen)
            'add variables to the container
    
            m = 1
            
            Do Until m > 200
            
                vHome_Anzeigen.Add "Zelle_Anzeige1[" & CStr(m) & "]"
                vHome_Anzeigen.Add "Zelle_Anzeige2[" & CStr(m) & "]"
                vHome_Anzeigen.Add "Zelle_Anzeige3[" & CStr(m) & "]"
             
                vHome_Anzeigen.Add "Zelle[" & CStr(m) & "].Zelle_Frg"
                vHome_Anzeigen.Add "Zelle[" & CStr(m) & "].CA_Modus"
                
                m = m + 1
            
            Loop
            
            vHome_Anzeigen.Add "Home1_Anzeigewert1"
            vHome_Anzeigen.Add "Home1_Anzeigewert2"
            vHome_Anzeigen.Add "Home1_Anzeigewert3"
            vHome_Anzeigen.Add "ErrX_FirstScan[1]"
            
            
            
        End If
        'activate 'VariableChange' event
        vHome_Anzeigen.Define
                
    End Sub
    
    
    
    
    'event is fired when a variable value changes Home_Anzeigen
    Private Sub vHome_Anzeigen_VariableChange(ByVal obVar As IVariable)
       
       Home_Anzeigen   
      
    End Sub
    
    
    
    
    'Aktivierung und Deaktivierung der Werteanzeigen auf dem Homescreen
    Public Sub Home_Anzeigen()
    
        Dim m As Integer
        
        m = 1
            
        Do Until m > 200
    
    
        If thisProject.Variables.Item("Zelle[" & CStr(m) & "].Zelle_Frg").Value = 0 Then
               
            thisProject.Variables.Item("Zelle_Anzeige1[" & CStr(m) & "]").Value = 0
            thisProject.Variables.Item("Zelle_Anzeige2[" & CStr(m) & "]").Value = 0
            thisProject.Variables.Item("Zelle_Anzeige3[" & CStr(m) & "]").Value = 0
            
    
            Else
       
                If thisProject.Variables.Item("Zelle[" & CStr(m) & "].CA_Modus").Value = 1 Then
            
                    thisProject.Variables.Item("Zelle_Anzeige1[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert1").Value
                    thisProject.Variables.Item("Zelle_Anzeige2[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert2").Value
                    thisProject.Variables.Item("Zelle_Anzeige3[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert3").Value
                  
                Else
                
                     If (thisProject.Variables.Item("Home1_Anzeigewert1").Value = 4 Or thisProject.Variables.Item("Home1_Anzeigewert1").Value = 5) Then
                         thisProject.Variables.Item("Zelle_Anzeige1[" & CStr(m) & "]").Value = 0
                     Else
                        thisProject.Variables.Item("Zelle_Anzeige1[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert1").Value
                     End If
                
                     If (thisProject.Variables.Item("Home1_Anzeigewert2").Value = 4 Or thisProject.Variables.Item("Home1_Anzeigewert2").Value = 5) Then
                         thisProject.Variables.Item("Zelle_Anzeige2[" & CStr(m) & "]").Value = 0
                     Else
                        thisProject.Variables.Item("Zelle_Anzeige2[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert2").Value
                     End If
                
                     If (thisProject.Variables.Item("Home1_Anzeigewert3").Value = 4 Or thisProject.Variables.Item("Home1_Anzeigewert3").Value = 5) Then
                          thisProject.Variables.Item("Zelle_Anzeige3[" & CStr(m) & "]").Value = 0
                     Else
                        thisProject.Variables.Item("Zelle_Anzeige3[" & CStr(m) & "]").Value = thisProject.Variables.Item("Home1_Anzeigewert3").Value
                     End If
                
                End If
                
        End If
        
        m = m + 1
        
        Loop
        
    
    
    End Sub

    Danke für eure Hilfe!

  2. #2
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    879

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Weiters bekomme ich eine Fehlermeldung "Run-time error '13' Type mismatch" in folgender Zeile:

    If thisProject.Variables.Item("Zelle[" & CStr(m) & "].Zelle_Frg").Value = 0 Then
    - kann es sein, dass der Datentyp dieser Variable vielleicht ein String ist?
    - funktioniert es wenn hier ein cast gemacht wird? z.B.

    If CInt(thisProject.Variables.Item("Zelle[" & CStr(m) & "].Zelle_Frg").Value) = 0 Then

    gruß,
    herbert


  3. #3
    Join Date
    27.08.2011
    Posts
    88

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Hallo,

    Es ist eine BOOL Variable! Habe es jetzt zuerst mit 'False' probiert und dann wie oben beschrieben mit CInt... kein Unterschied, immer der selbe Fehler!?

  4. #4

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Hallo Elso,

    Es sind etwas über 1000 Variablen im Online Container. Wenn das erste mal "Define" aufgerufen wird, wird das 1000 Change Events für diese 1000 Variablen auslösen, sobald sie einen Wert bekommen haben.

    Im jedem Change Event wird mindestens zwei hundert mal eine Variable gelesen, ohne zu prüfen ob die Variable bereits einen gültigen Wert hat, und je nach Ergebnis werden bis zu 600 Variablen geschrieben.

    Eventuell könnte man hier noch etwas optimieren. Auf jeden Fall würde ich abfragen ob die Variable einen gültigen Wert hat, bevor die If Abfrage den Wert liest. Eventuell haben noch nicht alle Variablen einen gültigen Wert wenn das erste Change Event ausgelöst wird.

    Mfg
    Mark

  5. #5
    Join Date
    27.08.2011
    Posts
    88

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Hallo,

    das könnte der Grund sein, weil der Fehler tritt nur beim RT Start auf! Wenn ich die Funktion nachher aufrufe tritt der Fehler nicht auf!

    Danke für den Tipp!

  6. #6
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    879

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    In der Hilfe Dokumentation gibt es ein Code Beispiel wie ein Online Container realisert werden kann. Im ChangeEvent wird dort auch der Wert der Variablen auf Gültikeit überprfüt
    -> siehe Handbuch -> Programmierschnittstellen -> Object Model -> OnlineVariables


  7. #7

    Default Re: VBA Code automatisch ausführen, wenn sich ein Wert im Online Container geändert hat

    Hallo,

    Das Beispiel worauf Herbert hindeutet prüft ob der Wert der Variable die der VariableChange Methode übergeben wird, einen gültigen Wert ist. Das ist natürlich immer sinnvoll zu prüfen.

    In diesem Fall jedoch bricht das Makro ab in der If Methode wo eine andere Variable als die im Change Event versucht wird zu lesen.

    Wenn die Methode "IsOnline" "TRUE" zurück liefert ist kann über die Programmierschnittstelle den Wert und Status der Variable gelesen werden.

    Das Macro könnte somit mit einer weitere If .IsOnline Then.. Abfrage erweitert werden.

    Mfg
    Mark

Similar Threads

  1. Replies: 4
    Last Post: 19th April 2013, 12:53
  2. Replies: 4
    Last Post: 22nd February 2012, 20:42
  3. CEL Eintrag wenn Variable sich im Treiber(Steuerung) ändert
    By armin_sa in forum zenon Supervisor
    Replies: 3
    Last Post: 22nd September 2011, 00:47
  4. Online Container zertören
    By perschke in forum VBA
    Replies: 1
    Last Post: 1st December 2010, 09:00
  5. Replies: 0
    Last Post: 10th February 2009, 13:54

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •