【问题标题】:What does the number in the AddChart2 VBA macro represent?AddChart2 VBA 宏中的数字代表什么?
【发布时间】:2021-03-11 11:56:37
【问题描述】:

我使用 Excel 2013 记录了插入图表的宏,在我的例子中是列聚集图表。在查看代码选项中,它显示了如下一行代码:

ActiveSheet.Shapes.Addchart2(286,xl3DColumnClustered).Select

请帮助我,因为我无法理解数字 286 代表什么。我知道 Addchart2 的语法是:

expression.AddChart2(Style,XlChartType,Left,Top,Width,Height,NewLayout)

如果我将“286”更改为“285”,图表将以蓝色背景显示。如果数字为 100,则会出现错误。

谁能告诉我这个数字代表什么?

【问题讨论】:

  • 非常有趣的问题突出了specifications 的缺失。我只能找到 48 种样式(范围从 1 到 48),所以这可能不是答案(如果您能够插入 286 或 285),但这是一个很好的起点。不过official documentation里什么都没说,还是等有其他人知道的吧。
  • 根据this article,显然风格范围从201-353。
  • 上述文章有很多其他图表样式的信息,并提到原来的1-48继续工作。
  • Style 既不是结构也不是枚举。从来没有,因为直到 2013 年还没有可用的 AddChart2 方法。微软没有枚举它,可能也不会。 StyleLong,但基本上你可以输入任何可接受的范围内的数字,正如@peege 在书中指出的那样。我同意缺乏文件
  • @peege 非常缺乏文档,但非常感谢你的文章,尽管它需要花费一点时间来试验图表样式,可能一个一个。欣赏它。

标签: excel vba charts excel-2013


【解决方案1】:

也可以只提供 ChartType,应用程序将使用默认样式。

Set oShp = ActiveSheet.Shapes.AddChart2(XlChartType:=xl3DColumnClustered)
oShp.Chart.SetSourceData Source:=RngDta

此图显示所有 ChartType 的默认 ChartStyle(不包括 StockHLC 和 StockVOHLC)

【讨论】:

    【解决方案2】:

    这不会直接回答您的问题,但会帮助您弄清楚发生了什么。

    这纯粹是我的猜想,但我猜这是一个未记录的位域。您可能知道位域只是使用数字的一种方式。所以图像我们有一个字节变量,它可以是 8 位(或标志)。所以在一个字节中我们最多可以存储 8 个值。

    示例:我们有一个名为“DaysOpen”的字段,位 1-7 表示商店在一周中的那一天营业。 (我们将忽略第 8 位。)因此,如果商店是开放的 M-F,那将是二进制 0111 1100。

    然后您只需将该数字转换为十进制,我们就会看到它是 124。

    该变量是一个 Variant,因此它可以是从 Byte 到 Long 的任何内容,这意味着它可以存储多达 64 个不同的标志。

    作为旁注(如果您有兴趣),您可以像这样使用位字段:

    Option Explicit
    
    Public Enum DayFlags
        'Notice these are power of 2.
        dfSunday = 1
        dfMonday = 2
        dfTuesday = 4
        dfWednesday = 8
        dfThursday = 16
        dfFriday = 32
        dfSaturday = 64
    End Enum
    
    Sub Example()
        Dim openHours As DayFlags
        'Set the flags:
        openHours = dfMonday Or dfTuesday Or dfThursday
        'See the binary?
        MsgBox Right$("00000000" & Excel.WorksheetFunction.Dec2Bin(openHours), 8)
        'Notice the order is right to left. This is call endianness.
        'You can check for a specific flag like this:
        MsgBox IsOpenOnDay(openHours, dfMonday) & vbNewLine & IsOpenOnDay(openHours, dfFriday)
        'You can add a flag like this:
        openHours = openHours Or dfFriday
        MsgBox IsOpenOnDay(openHours, dfMonday) & vbNewLine & IsOpenOnDay(openHours, dfFriday)
        'You can remove a flag like this:
        openHours = openHours Xor dfFriday
        MsgBox IsOpenOnDay(openHours, dfMonday) & vbNewLine & IsOpenOnDay(openHours, dfFriday)
    End Sub
    
    Private Function IsOpenOnDay(ByVal openHours As DayFlags, ByVal day As DayFlags) As Boolean
        IsOpenOnDay = ((openHours And day) = day)
    End Function
    

    【讨论】:

      【解决方案3】:

      嗯,我曾经遇到过同样的情况,这些基本上都是图表样式。我试图找出确切的编号,但后来我意识到录制是一种更容易了解样式编号的方法,就像您在此处所做的那样。

      要回答您的问题,请记录宏以了解您要在宏中实现哪种样式。

      【讨论】:

        【解决方案4】:

        只是看看 5 年后是否有人有更好的答案。我当然可以使用图表样式的枚举;我不喜欢在我的代码中放入简单的数字而不解释它的含义。当然,我可以使用注释,但如果这些数字被记录在案,那么这意味着它们可能会改变。

        【讨论】:

          【解决方案5】:

          我找到了部分列表:https://docs.microsoft.com/en-us/office/vba/api/excel.xlcharttype

          我确信这些数字,加上上面 Pillgram 建议的用于控制其他各种图表方面的位域变化,可以回答这个问题。可能的组合数以千计,因此完整的列表将毫无用处。录音仍然是您的最佳选择。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-29
            • 1970-01-01
            • 2011-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多