2016-05-31 11 views
0

Okay,Schleife aktualisiert Diagram auf Userform

So versuche ich, den folgenden Code zu integrieren:

`Private Sub UserForm_Initialize() 
    Dim Fname As String 

    Call SaveChart 
    Fname = ThisWorkbook.Path & "\temp1.gif" 
    Me.Image1.Picture = LoadPicture(Fname) 
End Sub 

Private Sub SaveChart() 
    Dim MyChart As Chart 
    Dim Fname As String 

    Set MyChart = Sheets("Data").ChartObjects(1).Chart 
    Fname = ThisWorkbook.Path & "\temp1.gif" 
    MyChart.Export Filename:=Fname, FilterName:="GIF" 
End Sub` 

von diesem Posten: Displaying "live" chart data in Excel Userform in eine bestehende Schleife, so dass die obige Codeabschnitt iteriert mit Die Schleife und das Bild werden jedes Mal aktualisiert, wenn die Schleife ausgeführt wird. Ich hätte dies als Kommentar zu der oben erwähnten Frage gepostet, aber ich habe nicht genug Rep.

' 
' Get last logged data 
' 
Private Sub GetLastLoggedData() 
    Dim rangeToWrite 
    Dim lStartFileSize As Long 
    Dim lNextFileSize As Long 
    Dim dtStartTime As Date 
    Dim lElapsedTime As Long 
    Dim bDone As Boolean 
    Dim sLastHeader As String 
    Dim sLastData As String 
    Dim iCol As Integer 
    Dim sNextValue As String 
    Dim iLoop As Integer 
    Dim Fname As String 
    Dim MyChart As Chart 

    On Error GoTo ErrorHandler 

    ' Initialize global_bHasScanCount flag 
    global_bHasScanCount = False 

    ' Get the file size of the log file 
    lStartFileSize = FileLen(global_sLogFile) 

    ' Initialize timer 
    dtStartTime = Now 

    ' Wait for filesize to change 
    UpdateLogStatus Now & " : Data Monitor: waiting for file size to change..." 
    bDone = False 
    Do 
     ' Get the file size of the log file and see if it's changed 
     lNextFileSize = FileLen(global_sLogFile) 
     If lNextFileSize <> lStartFileSize And lNextFileSize <> 0 Then 
      bDone = True 
     Else 
      lElapsedTime = DateDiff("s", dtStartTime, Now) 
      If (lElapsedTime >= global_lTimeout) Or (lElapsedTime < 0) Then 
       bDone = True 
      End If 
     End If 

     DoEvents 

    Loop Until bDone = True 

    ' Backup the file 
    UpdateLogStatus Now & " : Data Monitor: backing up data file..." 
    'FileCopy global_sLogFile, global_sLogFileBackup 

    ' Read the log file 
    UpdateLogStatus Now & " : Data Monitor: reading data file..." 
    sLastData = "" 
    sLastHeader = "" 

    If ReadLogFile(global_sLogFile, sLastData, sLastHeader) = False Then 
     ' Delete the backup log file 
     'Kill global_sLogFileBackup 

     Exit Sub 
    End If 

    ' Delete the backup log file 
    'Kill global_sLogFileBackup 

    UpdateLogStatus Now & " : Data Monitor: updating worksheet..." 


    ' Clear previous Results in Excel Spreadsheet 
    ThisWorkbook.Worksheets("ACQUIRE DATA").Range("A2:IV2").ClearContents 

    ' Parse comma delimeted header and place data into worksheet cells. If we have the scan count then 
    ' start writing in column1, else starting writing in column2. 

    If global_bHasScanCount = True Then 
     iCol = 1 
    Else 
     iCol = 2 
    End If 

    If sLastHeader <> "" Then 
     ' Clear previous Results in Excel Spreadsheet 
     ThisWorkbook.Worksheets("ACQUIRE DATA").Range("A1:IV1").ClearContents 

     Do 
      sNextValue = GetToken(sLastHeader, ",") 

      ' Copy Results to Excel worksheet 
      ThisWorkbook.Worksheets("ACQUIRE DATA").Cells(1, iCol).Value = sNextValue 
      iCol = iCol + 1 

     Loop Until sLastHeader = "" 
    End If 

    ' Parse comma delimeted results and place data into worksheet cells. If we have the scan count then 
    ' start writing in column1, else starting writing in column2. 

    If global_bHasScanCount = True Then 
     iCol = 1 
    Else 
     iCol = 2 
    End If 
    Do 
     sNextValue = GetToken(sLastData, ",") 

     ' Copy Results to Excel worksheet 
     ThisWorkbook.Worksheets("ACQUIRE DATA").Cells(2, iCol).Value = sNextValue 
     iCol = iCol + 1 
     'Copy Current Data to Control Panel 
     UserForm2.TextBox2.Text = Sheets("ACQUIRE DATA").Range("B12") 
     'Copy Time to Control Panel 
     UserForm2.TextBox3 = Format(Sheets("ACQUIRE DATA").Range("B13"), "hh:mm:ss") 
     'Copy Speed to Control Panel 
     UserForm2.TextBox4.Text = Sheets("ACQUIRE DATA").Range("B14") 

    'create .gif file of current PerfMap chart 
    Set MyChart = Sheets("PerfMap").ChartObjects(1).Chart 
    Fname = ThisWorkbook.Path & "\temp1.gif" 
    MyChart.Export Filename:=Fname, FilterName:="GIF" 
    Fname = ThisWorkbook.Path & "\temp1.gif" 
    'set live data chart image to most recent image 
    UserForm3.Image1.Picture = LoadPicture(Fname) 


    Loop Until sLastData = "" 
    UpdateLogStatus "" 



    Exit Sub 

ErrorHandler: 
    BuildErrorMessage "GetLastLoggedData", "Failed to get last logged data." 
    UpdateLogStatus "" 



End Sub' 

Aber immer wenn ich das tue bekomme ich einen Laufzeitfehler 1004, der vom Fehlerhandler erstellt wird. Jede Hilfe, warum dies nicht funktioniert, wird sehr geschätzt.

BEARBEITEN: Nachdem ich 24 Stunden weggegangen bin, habe ich festgestellt, dass das fragliche Blatt ein Diagrammblatt ist und kein eingebettetes Diagramm, daher funktionierte die oben beschriebene Methode nicht.

Die Grafik ist auf einem Diagrammblatt genannt PerfMap, aber der Planname ist Tabelle 7.

Antwort

0

Der Code unten mein Problem gelöst.

'create .gif file of current PerfMap chart 
    Set PerfMap = Charts("PerfMap") 
    Fname = ThisWorkbook.Path & "\temp1.bmp" 
    PerfMap.Export Filename:=Fname, FilterName:="BMP" 

    'set live data chart image to most recent image 
    UserForm3.Image1.Picture = LoadPicture(Fname) 

Nach diesem MSDN https://support.microsoft.com/en-us/kb/175918 muss man BMP verwenden Sie das Bild zu bekommen richtig zu arbeiten.

Jetzt ist mein neues Problem, dass der oben genannte Code meine Schleife zu einem Crawl verlangsamt und im Laufe der Zeit 99% meines Systemspeichers benutze, bis ich Excel verlasse und es wieder öffne.