2017-01-11 2 views
0

안녕하세요 저는 포럼에 처음 왔으며 이것이 내 첫 번째 게시물입니다. 나는 Excel에서 vba를 처음 사용하지만 ThinkorSwim에서 thinkscript를 작성했습니다.범위 막대 차트를 만드는 방법

누군가가 범위 주식 차트에 익숙하다면, 그게 무슨 일 이니?

꺾은 선형 차트의 코드를 찾았으며 사용하고 있지만 가격은 주어진 시간에 따라 달라집니다. 이 꺾은 선형 차트가 범위 위 또는 아래에있을 때 값을 플롯하도록 수정하여 위크가없는 촛대 형 차트와 유사하게 만듭니다. 데이터가 해당 범위에 들어가면 해당 범위에서 새로운 높음 또는 낮음이 만들어 질 때마다 업데이트하기를 원합니다. 범위를 미리 설정해야합니다 (예 : 50 ticks). 범위를 초과하면 다음 범위에 표시된 데이터를 원하고 프로세스를 반복합니다. 시간과 날짜는 무시되어야하며 가격 결정에 기초한 계획 만 사용해야합니다.

누구에게 아이디어가 있습니까?

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

나를 위해 일하는 한 가지 방법은 차트의 범위를 수정할 때 내용을 필터링하는 것입니다. 차트의 범위를 설정하면 A) 시트 필터링, B) 매개 변수를 기반으로 범위 선택, C) 차트 출력. 필터링/숨기기를 사용하면 광고 항목이 차트에 표시되지 않습니다. – Cyril

+0

예를 보여 주시겠습니까? –

+0

내가 얻은 것을 보여주기 위해 차트를 업로드하려하고 있지만 수행 방법을 알아낼 수 없습니다. –

답변

0

데이터 및 필터의 당신의 시트를 가지고 ... 예는 다음과 같습니다

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

정렬 정보 : 그런 다음 정의 할 수 있습니다 https://msdn.microsoft.com/en-us/library/office/ff840646.aspx

가 원하는 범위를 선택합니다. 열 A를 가정하면, X 축이며, B는 (필요한 수정을위한 파라미터를 평가하기 위해), Y 축이다

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 

및하여 그 정의 파라미터 :

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

것은이 아이디어를 제공한다 High1/Low1의 경우 최대 값이 발생하는 행을 정의하는 방법을 통해 작업 할 수 있습니다.

원하는 차트에 대해 CreateObject를 사용하고 사용할 데이터 범위를 선택했습니다.

+0

명시 적 옵션 개인 서브 Workbook_BeforeClose (부울으로 취소) 전화 Chart_Stop 최종 하위 –

+0

새로 고침 '정지 통합 문서 난 아직도 캔트 모든 코드를 보냅니다. 그것은 너무 많은 문자를 말합니다. 메시지로 보낼 수있는 방법이 있습니까? –

+0

Ok 위의 원래 질문에 원래 코드가 입력되었습니다. 내가 보낸 코드는 어디에 두어야합니까? –

관련 문제