创建临时Excel图表

时间:2013-06-26 17:55:30

标签: excel vba excel-vba excel-2010 excel-2013

Sub aaGraphing()
'
' aaGraphing Macro
'

'
    Range("L948:W949,D948:D949").Select
    Range("D949").Activate
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlLineMarkers
    ActiveChart.SetSourceData Source:=Range( _
        "Analytics!$L$948:$W$949,Analytics!$D$948:$D$949")
End Sub

此代码创建了我想要的数据图表。有没有办法让创建的图表成为临时图,这样当你点击图表之外的任何地方时它会被删除?

2 个答案:

答案 0 :(得分:3)

您可以使用工作表的SelectionChange事件删除图表。下面我假设只有一个形状 - 图表 - 可能在工作表上。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Me.Shapes.Count = 1 Then
        Me.Shapes(1).Delete
    End If
End Sub

可以(我相信)动态附加此事件并将其删除。但是,我认为它是 little 复杂。

另一种方法可能是在一段时间后使用Application.OnTime删除它。

Application.OnTime Now + TimeValue("00:00:40"), "ProcedureToDelete"

将在40秒后运行名为'ProcedureToDelete'的过程。在此过程中,您可能希望确保选择位于工作表中,而不是在要删除的图表中。

您可以在定时程序中检查当前是否选择了图表。如果没有,删除它,否则再次设置计时器。

答案 1 :(得分:2)

常规模块......

Option Explicit


Public PlotName As String
Public PlotRange As Range


Sub Tester()
AddPlot ActiveSheet.Range("B3:B7,D3:D7")
End Sub

Sub AddPlot(rng As Range)
    With ActiveSheet.Shapes.AddChart
        PlotName = .Name
        .Chart.ChartType = xlLineMarkers
        .Chart.SetSourceData Source:=Range(rng.Address())
    End With
    Set PlotRange = rng
    Application.EnableEvents=False    
    rng.Select
    Application.EnableEvents=True
End Sub

Sub RemovePlot(rng As Range)
    If Not PlotRange Is Nothing Then
        If Application.Intersect(rng, PlotRange) Is Nothing Then
            On Error Resume Next
            rng.Parent.Shapes(PlotName).Delete
            On Error GoTo 0
        End If
    End If
End Sub

表格代码模块:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    RemovePlot Target
End Sub