微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何区分以编程方式创建的图表/形状与工作表上的所有图表/形状?

如何解决如何区分以编程方式创建的图表/形状与工作表上的所有图表/形状?

我正在寻找一种方法来区分由我的代码创建的图表和用户“手动”创建的图表。 如果我为图表设置特定的 name_prefix 或其他内容,则使用 chart.name 会起作用,但此属性对我没有用,因为名称可以由用户动态更改。我曾想过像查看形状一样查看图表并更改其 ID,但也没有运气。 我检查了图表/形状对象模型,但找不到可以用来以某种方式将“我的图表”与工作表集合中的所有图表区分开来的属性

总体思路是我用 VBA 创建一个图表,当用户激活它时,chart.activate 事件会打开一个用户表单。当用户激活由我的代码创建的图表而不是激活工作表上的任何图表时,此用户表单应该打开。除了如何区分图表,我什么都知道。

任何想法如何做到这一点? 提前致谢!

编辑:我还考虑过向系列名称添加一些信息,同样是信息的前缀类型。这会起作用,但再一次 - 最终用户可以轻松更改它,这是我想要避免的。

解决方法

如果您发布了您使用的代码应该会很好。我(仅)可以假设您激活了图表事件。

请尝试下一种方法,该方法是否适用于已激活的事件:

  1. 复制标准模块中的下一个代码。它是一个 Sub,将分配给所有创建的图表。它可以用来代替(现有的)事件,或与事件一起使用:
Sub CreatedChart()
   Dim ch As Chart
   Set ch = ActiveSheet.ChartObjects(Application.Caller).Chart
   'you can call the form in discussion here...
   Select Case ch.Parent.Name
    Case "CrChart1","CrChart2"
        MsgBox "Here you can do something in case of Chart 1 or Chart 2..."
    Case "CrChart3"
        MsgBox "Here you can do something in case of Chart 3..."
   End Select
End Sub
  1. 也复制模块中的下一个代码。它将创建图表并将上述 Sub 分配给它们:
Sub testChartsCreate()
   Dim ws As Worksheet,ch As ChartObject,i As Long
   Set ws = ActiveSheet
   For i = 1 To 3
        Set ch = ws.ChartObjects.Add(left:=1,_
                    top:=10,width:=100,height:=100)
        ch.Name = "CrChart" & i
        ws.Shapes(ch.Name).OnAction = "CreatedChart"
        ch.Chart.ChartType = xlLine
        'do here all your charts configuration...
   Next i
End Sub
  1. 您可以确定工作表上所有现有图表中的哪些是由上述代码创建的。请注意也有一些手动创建的图表,或以编程方式,但不是通过上面的代码(类型),分配特定的 Sub:
Sub testIdentifCrCharts()
   Dim sh As Worksheet,i As Long
   
   Set sh = ActiveSheet ' use here the necessary sheet
   For Each ch In sh.ChartObjects
        Debug.Print ch.Name,isCreatedChart(ch.Chart,sh)
   Next
End Sub

Private Function isCreatedChart(ch As Chart,sh As Worksheet) As Boolean
  If sh.Shapes(ch.Parent.Name).OnAction = "CreatedChart" Then
    isCreatedChart = True
  End If
End Function

我使用 ch As Chart 作为第一个函数参数,用于检查图表的情况,而不是 ChartObjects...

上面的解决方案可能看起来很复杂,但实际上很容易理解和应用。

请测试上述建议并发送一些反馈。

,

一个潜在的想法是将您的魔法值放在 MailEnvelope.Introduction 中。这是一个 VBA 可设置的字符串属性,您可能永远不会将其用于其预期目的,并且不会在用户创建的图表的 UI 中公开。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。