【问题标题】:Create Temporary Excel Chart创建临时 Excel 图表
【发布时间】:2013-06-26 17:55:30
【问题描述】:
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

这段代码创建了我想要的数据图表。有没有办法使创建的图表成为临时图表,以便当您单击图表外部的任何位置时它会删除?

【问题讨论】:

    标签: vba excel excel-2010 excel-2013


    【解决方案1】:

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

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

    有可能(我相信)动态附加此事件,然后将其删除。不过,我认为这有点复杂。

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

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

    将在 40 秒后运行名为“ProcedureToDelete”的过程。在此过程中,您可能希望确保所选内容在工作表中,而不是在您要删除的图表中。

    您可以在定时过程中检查图表当前是否被选中。如果没有,删除它,否则重新设置计时器。

    【讨论】:

    • 您认为这是一个明智/可靠的解决方案吗?
    • @varocarbas 好吧,就个人而言,我宁愿在工作表中添加一个按钮,用户可以单击该按钮来删除图表。不过,我更喜欢我的解决方案,而不是附加外部程序。
    • 别误会我!我的解决方案是:您想要的没有实际的解决方案。外部程序就像在说“这太难了,除非有外部程序做这样的事情......”。无论如何,它可能不太可靠,但是使用 Application.OnTime 是您在这里最接近的选择,我没有意识到:干得好。
    • @varocarbas 我不会说我的解决方案是完美的,但是通过更多的错误处理代码(检查Selection 的位置等),它可以变得可靠。如果您涉及外部应用程序,它会有多可靠:)。正如我所说,我宁愿根本不使用SelectionChange,而是更喜欢一个按钮。 OnTime 不是问题,因为如果出现问题,我们不能重新启动它,它会悄悄消失。
    • 你不需要说服我;我是对你的答案投赞成票的人。
    【解决方案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
    

    【讨论】:

    • 我真的很惊讶。我真的没想到 _SelectionChange 事件会运行得这么好。我认为这是非常不可靠的。我完全和绝对错误,因此我必须删除我的答案。感谢您的代码。
    • PS:这是我第二次说某事是不可能的,而你证明我错了。我不太重视第一次,因为我根本不喜欢提问者,没有分析问题;但这一次我很确定……活着是为了学习;我想我应该消除我对 VBA 的一些偏见。
    • 许多事情都是可能的,但并不是所有的都是好主意......这取决于你需要它有多强大。例如,如果用户在创建绘图后立即保存并关闭工作簿,我的代码将中断。一个很好的补充是让AddPlot 删除任何已经存在的图表。
    • 如果其他人正在使用它,一个建议是在启动宏之前创建一个要转到的范围名称。因此在 Sub Tester() 中首先选择一个范围。在我的情况下,它是 Range("TCKWH.V.1")。选择这将阻止任何错误,以免意外将额外数据添加到图表中。
    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2011-11-03
    • 2021-01-30
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2023-02-21
    • 2022-01-21
    相关资源
    最近更新 更多