2017-01-11 8 views
0

Hey, ich bin neu in Foren und das ist mein erster Beitrag. Ich bin neu in Excel, aber habe in ThinkorSwim ein Denkschrift geschrieben.Wie man ein Bereichsbalkendiagramm erstellt

Wenn jemand mit einer Bereich Aktienkurve vertraut ist, ist das, was ich nachgehen werde.

Ich habe Code für ein Liniendiagramm gefunden und verwende es, aber es basiert darauf, wo der Preis zu einem bestimmten Zeitpunkt ist. Ich möchte dieses Liniendiagramm so ändern, dass nur Werte angezeigt werden, die über oder unter einem Bereich liegen, sodass es einem Candlestick-Diagramm ohne Dochte ähnelt. Sobald die Daten in diesen Bereich gelangen, möchte ich nur, dass sie aktualisiert wird, wenn in diesem Bereich ein neuer Höchst- oder Tiefstwert erreicht wird. Die Bereiche müssen voreingestellt werden (zB 50 Ticks). Sobald der Bereich überschritten ist, möchte ich die Daten im nächsten Bereich aufzeichnen und den Vorgang wiederholen. Zeit und Datum sollten ignoriert werden, und nur die Handlung basierend auf der Preisaktion.

Hat jemand irgendwelche Ideen?

Option Explicit 

'Update the values between the quotes here: 
Private Const sChartWSName = "Chart" 
Private Const sSourceWSName = "Sheet1" 
Private Const sTableName = "tblValues" 
Public RunTime As Double 

Private Sub Chart_Setup() 
'Create the structure needed to preserve and chart data 
    Dim wsChart As Worksheet 
    Dim lstObject As ListObject 
    Dim cht As Chart 
    Dim shp As Button 
    'Create sheet if necessary 
    Set wsChart = Worksheets.Add 
    wsChart.Name = sChartWSName 
    'Set up listobject to hold data 
    With wsChart 
     .Range("A1").Value = "Time" 
     .Range("B1").Value = "Value" 
     Set lstObject = .ListObjects.Add(_ 
         SourceType:=xlSrcRange, _ 
         Source:=.Range("A1:B1"), _ 
         xllistobjecthasheaders:=xlYes) 
     lstObject.Name = sTableName 
     .Range("A2").NumberFormat = "h:mm:ss AM/PM (mmm-d)" 
     .Columns("A:A").ColumnWidth = 25 
     .Select 
    End With 
    'Create the chart 
    With ActiveSheet 
     .Shapes.AddChart.Select 
     Set cht = ActiveChart 
     With cht 
      .ChartType = xlLine 
      .SetSourceData Source:=Range(sTableName) 
      .PlotBy = xlColumns 
      .Legend.Delete 
      .Axes(xlCategory).CategoryType = xlCategoryScale 
      With .SeriesCollection(1).Format.Range 
       .Visible = msoTrue 
       .Weight = 1.25 
      End With 
     End With 
    End With 
    'Add buttons to start/stop the routine 
    Set shp = ActiveSheet.Buttons.Add(242.25, 0, 83.75, 33.75) 
    With shp 
     .OnAction = "Chart_Initialize" 
     .Characters.Text = "Restart Plotting" 
    End With 
    Set shp = ActiveSheet.Buttons.Add(326.25, 0, 83.75, 33.75) 
    With shp 
     .OnAction = "Chart_Stop" 
     .Characters.Text = "Stop Plotting" 
    End With 
End Sub 

Public Sub Chart_Initialize() 
'Initialize the routine 
Dim wsTarget As Worksheet 
Dim lstObject As ListObject 

'Make sure worksheet exists 
On Error Resume Next 
Set wsTarget = Worksheets(sChartWSName) 
If Err.Number <> 0 Then 
    Call Chart_Setup 
    Set wsTarget = Worksheets(sChartWSName) 
End If 
On Error GoTo 0 

'Check if chart data exists 
With Worksheets(sChartWSName) 
    Set lstObject = .ListObjects(sTableName) 
    If lstObject.ListRows.Count > 0 Then 
     Select Case MsgBox("You already have data. Do you want to clear it and start fresh?", vbYesNoCancel, "Clear out old data?") 

      Case Is = vbYes 
       'User wants to clear the data 
       lstObject.DataBodyRange.Delete 

      Case Is = vbCancel 
       'User cancelled so exit routine 
       Exit Sub 

      Case Is = vbNo 
       'User just wants to append to existing table 
     End Select 
    End If 

    'Begin appending 
    Call Chart_AppendData 
End With 
End Sub 

Private Sub Chart_AppendData() 
'Append data to the chart table 
Dim lstObject As ListObject 
Dim lRow As Long 

With Worksheets(sChartWSName) 
    Set lstObject = .ListObjects(sTableName) 
    If lstObject.ListRows.Count = 0 Then 
     lRow = .Range("A1").End(xlDown).Row 
    End If 
    If lRow = 0 Then 
     lRow = .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0).Row 
    End If 
    If lRow > 2 Then 
     If .Range("B" & lRow - 1).Value = Worksheets(sSourceWSName).Range("C10").Value Then 
      'Data is a match, so do nothing 
     Else 
      'Data needs appending 
      .Range("A" & lRow).Value = CDate(Now) 
      .Range("B" & lRow).Value = Worksheets(sSourceWSName).Range("C10").Value 
     End If 
    Else 
      'Data needs appending 
      .Range("A" & lRow).Value = CDate(Now) 
      .Range("B" & lRow).Value = Worksheets(sSourceWSName).Range("C10").Value 
    End If 
End With 

RunTime = Now + TimeValue("00:00:01") 
Application.OnTime RunTime, "Chart_AppendData" 
End Sub 

Public Sub Chart_Stop() 
'Stop capturing data 
On Error Resume Next 
Application.OnTime EarliestTime:=RunTime, Procedure:="Chart_AppendData", Schedule:=False 
End Sub 
+0

Eine Möglichkeit, die beim Ändern von Bereichen für Diagramme funktioniert, ist das Filtern des Inhalts. Wenn Sie den Bereich für das Diagramm festlegen, würden Sie A) das Blatt filtern, B) den Bereich basierend auf Ihren Parametern auswählen, C) in einem Diagramm ausgeben. Durch Filtern/Verbergen werden Werbebuchungen im Diagramm nicht sichtbar. – Cyril

+0

Können Sie bitte ein Beispiel zeigen? –

+0

Ich versuche, das Diagramm hochzuladen, um Ihnen zu zeigen, was ich habe, aber kann nicht herausfinden, wie es geht –

Antwort

0

Nehmen Sie Bogen von Daten und Filter ... Beispiel wäre:

Columns("A:C").Sort key1:=Range("C2"), _ 
    order1:=xlAscending, header:=xlYes 

Sortieren info: https://msdn.microsoft.com/en-us/library/office/ff840646.aspx

Sie dann definieren, können Sie den gewünschten Bereich auszuwählen. Spalte A unter der Annahme, x-Achse und B y-Achse (wo Ihre Parameter für Notwendigkeit Modifizieren bewertet werden):

Dim High1 as integer 
Dim Low1 as integer 

High1 = Match(Max(B:B),B:B) 'This isn't tested, just an idea 
Low1 = Match(Max(B:B)+50,B:B) 'Again, not tested 

und Verwendung dieser definierten Parameter:

.Range(Cells(High1,1),Cells(Low1,2).Select 

Dies sollte eine Idee für High1/Low1, wo Sie durchgehen können, wie Sie die Zeile definieren möchten, in der der Maximalwert auftritt.

Sie CreateObject für das Diagramm, das Sie möchten, nachdem Sie den Datenbereich ausgewählt haben, den Sie verwenden möchten.

+0

Option Explicit Private Sub Workbook_BeforeClose (Cancel As Boolean) ‚Stop Arbeitsmappe erfrischende Anruf Chart_Stop End Sub –

+0

ich kann immer noch nicht den gesamten Code senden. Es sagt seine zu viele Charaktere. Gibt es eine Möglichkeit, ich kann sie Ihnen in einer Nachricht senden? –

+0

Ok Ich habe den Originalcode in die ursprüngliche Frage oben eingegeben. Wo sollte ich den von Ihnen gesendeten Code platzieren? –