Vba 如何制作范围条形图

Vba 如何制作范围条形图,vba,excel,charts,range,Vba,Excel,Charts,Range,嘿,我是论坛新手,这是我的第一篇帖子。我不熟悉excel中的vba,但已经用ThinkorSwim编写了thinkscript 如果有人熟悉区间股价图,那就是我要找的 我找到了折线图的代码,并且正在使用它,但它是基于任何给定时间的价格。我想修改此折线图,使其仅在值高于或低于某个范围时绘制值,使其类似于没有灯芯的烛台图。一旦数据进入该范围,我只希望它在该范围内产生新的高点或低点时更新。一旦超出范围,需要预设范围(例如50个刻度),我希望在下一个范围内绘制数据,并重复该过程。应忽略时间和日期,并且仅

嘿,我是论坛新手,这是我的第一篇帖子。我不熟悉excel中的vba,但已经用ThinkorSwim编写了thinkscript

如果有人熟悉区间股价图,那就是我要找的

我找到了折线图的代码,并且正在使用它,但它是基于任何给定时间的价格。我想修改此折线图,使其仅在值高于或低于某个范围时绘制值,使其类似于没有灯芯的烛台图。一旦数据进入该范围,我只希望它在该范围内产生新的高点或低点时更新。一旦超出范围,需要预设范围(例如50个刻度),我希望在下一个范围内绘制数据,并重复该过程。应忽略时间和日期,并且仅基于价格动作进行绘图

有人有什么想法吗

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
选项显式
'更新此处引号之间的值:
Private Const sChartWSName=“图表”
专用Const sSourceWSName=“Sheet1”
Private Const sTableName=“tblValues”
公共运行时作为双
专用子图表\u设置()
'创建保存和图表数据所需的结构
将图表设置为工作表
将对象设置为ListObject
暗海隧As图
调暗shp As按钮
'必要时创建工作表
设置wsChart=工作表。添加
wsChart.Name=sChartWSName
'设置listobject以保存数据
使用wsChart
.Range(“A1”).Value=“时间”
.Range(“B1”).Value=“Value”
设置lstObject=.ListObjects.Add(_
SourceType:=xlSrcRange_
来源:=.范围(“A1:B1”)_
XLListObjectHashHeaders:=xlYes)
lstObject.Name=sTableName
.Range(“A2”).NumberFormat=“h:mm:ss AM/PM(mmm-d)”
.列(“A:A”)。列宽=25
.选择
以
'创建图表
使用ActiveSheet
.Shapes.AddChart.Select
设置cht=ActiveChart
与红隧
.ChartType=xlLine
.SetSourceData源:=范围(sTableName)
.PlotBy=xlColumns
.Legend.Delete
.Axes(xlCategory).CategoryType=xlCategoryScale
With.SeriesCollection(1).Format.Range
.Visible=msoTrue
.重量=1.25
以
以
以
'添加启动/停止例程的按钮
设置shp=ActiveSheet.Buttons.Add(242.25,0,83.75,33.75)
小水电
.OnAction=“图表\u初始化”
.Characters.Text=“重新开始打印”
以
设置shp=ActiveSheet.Buttons.Add(326.25,0,83.75,33.75)
小水电
.OnAction=“图表\停止”
.Characters.Text=“停止打印”
以
端接头
公共子图_Initialize()
'初始化例程
将目标设置为工作表
将对象设置为ListObject
'确保工作表存在
出错时继续下一步
Set wsTarget=工作表(sChartWSName)
如果错误号为0,则
呼叫图表设置
Set wsTarget=工作表(sChartWSName)
如果结束
错误转到0
'检查图表数据是否存在
带工作表(sChartWSName)
设置lstObject=.ListObjects(sTableName)
如果lstObject.ListRows.Count>0,则
选择Case MsgBox(“您已经有数据了。是否要清除数据并重新开始?”,vbYesNoCancel,“清除旧数据?”)
Case Is=vbYes
'用户希望清除数据
lstObject.DataBodyRange.Delete
Case Is=vbCancel
'用户已取消,因此退出例程
出口接头
Case Is=vbNo
'用户只想附加到现有表
结束选择
如果结束
'开始追加
调用图表附加数据
以
端接头
私有子图_AppendData()
'将数据附加到图表表中
将对象设置为ListObject
暗淡的光线和长的一样
带工作表(sChartWSName)
设置lstObject=.ListObjects(sTableName)
如果lstObject.ListRows.Count=0,则
lRow=.Range(“A1”).End(xlDown).Row
如果结束
如果lRow=0,则
lRow=.Range(“A”&.Rows.Count).End(xlUp).Offset(1,0).Row
如果结束
如果lRow>2,则
如果.Range(“B”和lRow-1).Value=工作表(sSourceWSName).Range(“C10”).Value,则
“数据是匹配的,所以什么都不要做
其他的
"数据需要追加,
.Range(“A”&lRow).Value=CDate(现在)
.Range(“B”和lRow).Value=工作表(sSourceWSName).Range(“C10”).Value
如果结束
其他的
"数据需要追加,
.Range(“A”&lRow).Value=CDate(现在)
.Range(“B”和lRow).Value=工作表(sSourceWSName).Range(“C10”).Value
如果结束
以
运行时=现在+时间值(“00:00:01”)
Application.OnTime运行时,“图表\附加数据”
端接头
公共子图_Stop()
'停止捕获数据
出错时继续下一步
Application.OnTime EarliestTime:=运行时,过程:=“图表\附加数据”,计划:=False
端接头

拿出你的数据表并过滤。。。例如:

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

然后可以定义以选择所需的范围。假设A列为x轴,B列为y轴(需要评估修改参数):

并使用这些定义的参数:

.Range(Cells(High1,1),Cells(Low1,2).Select
这应该为High1/Low1提供了一个概念,在这里,您可以了解如何定义出现最大值的行


然后,在选择要使用的数据范围后,为所需的图表创建对象。

修改图表范围时,对我有效的一种方法是过滤内容。设置图表的范围时,应A)过滤工作表,B)根据参数选择范围,C)在图表中输出。过滤/隐藏将使行项目在图表中不可见。请举个例子好吗?我正在尝试上载图表以向您显示我得到的内容,但无法确定如何执行。如果您有一些代码,请上载好吗?您可以将其编辑到您的问题中,也可以将代码添加到原始问题中。谢谢你的关注!选项显式
.Range(Cells(High1,1),Cells(Low1,2).Select