【问题标题】:Add Data Labels with VBA使用 VBA 添加数据标签
【发布时间】:2018-01-17 13:41:57
【问题描述】:

我有一个基于 checkboxSub,我想在图表上显示数据标签和隐藏它们之间切换。我录制了宏并将其更改为不再显示 "Selection""ActiveChart",因为我不想让用户选择图表。我认为这就是我的问题所在,因为它完全没有任何作用。

我似乎无法缩小问题的范围,因为它是一个相当长的块。任何帮助将不胜感激!

Sub Checkbox()
Dim Cht As ChartObject
Set Cht = Sheet5.ChartObjects("Chart 12")
    If Sheet1.Range("W11") = "TRUE" Then
    Cht.Chart.SetElement (msoElementDataLabelTop)
    Cht.Chart.ApplyDataLabels
    Cht.Chart.FullSeriesCollection(1).DataLabels.Select
    Cht.ShowCategoryName = True
    Cht.Separator = "" & Chr(13) & ""
    With Cht.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(127, 127, 127)
        .Solid
    End With
    With Cht.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent1
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0
        .Transparency = 0
        .Solid
    End With
    With Cht.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(68, 114, 196)
        .Transparency = 0.75
        .Solid
    End With
    Application.CommandBars("Format Object").Visible = False
    Else: Cht.Chart.SetElement (msoElementDataLabelNone)
    End If
End Sub

不久前有人告诉我,最好引用一个单元格而不是一个复选框,因此我让代码在 W11 中查找“TRUE”或“FALSE”的原因。如果看起来可行,我宁愿使用复选框。

【问题讨论】:

  • 我建议单步执行您的代码(或使用debug.print)来检查您的If 语句是否按照您的预期进行。

标签: excel vba


【解决方案1】:

问题是

If Sheet1.Range("W11") = "TRUE"

不是true

如果您Debug.Print Sheet1.Range("W11") = "TRUE",它将返回false,而不是预期的true。原因是 Sheet1.Range("W11") 在这种情况下返回 boolean 而不是 string

您可以使用验证返回类型

Debug.Print VarType(Sheet1.Range("W11"))

它返回11,这意味着boolean(参见VarType Function)。


所以你应该把它改成

If Sheet1.Range("W11") = True

如果单元格 W11 包含 TRUE,则为 true

【讨论】:

  • 有道理,如果我想使用复选框引用而不是链接单元格,我可以将该行替换为If CheckBox1.Value = True Then
  • @KevinP。如果它是一个 ActiveX 复选框,那么是,如果它是一个表单元素复选框,那么不是。如果代码在模块中,您可能需要指定工作表 If Sheet1.CheckBox1.Value = True Then。如果您使用表单元素复选框而不是 ActiveX,那么您需要使用 If Sheet1.Shapes("CheckBox 1").OLEFormat.Object.Value = xlOn Then 之类的东西。如果可能,我建议远离 ActiveX。注意CheckBox 1中可能有空格。
  • 除了我的原始代码和 Xabiers 的复选框问题之外,我仍然遇到功能错误。
  • @KevinP。如果您不告诉我们您遇到了哪个错误以及原始代码的哪一行,我们将无法提供帮助。
  • 对不起,我在另一个答案中发表了评论。取消选中时,它会很好地删除标签。检查时我得到“对象不支持此属性或方法”。它指向Sheet5.Shapes("Chart 12").ShowCategoryName = True
【解决方案2】:

试试下面的方法,我相信你引用的图表不正确,通过使用 Shapes 对象,你可以得到你想要的图表:

Sub Checkbox()
    If Sheet1.Range("W11") = True Then
        Sheet1.Shapes("Chart 1").Chart.SetElement (msoElementDataLabelShow)
        Sheet1.Shapes("Chart 1").Chart.ApplyDataLabels
        Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(1).DataLabels.Select
        Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(1).DataLabels.ShowCategoryName = True
        Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(1).DataLabels.Separator = "" & Chr(13) & ""
        With Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(1).Format.Fill
            .Visible = msoTrue
            .ForeColor.RGB = RGB(127, 127, 127)
            .Solid
        End With
        With Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(1).Format.Fill
            .Visible = msoTrue
            .ForeColor.ObjectThemeColor = msoThemeColorAccent1
            .ForeColor.TintAndShade = 0
            .ForeColor.Brightness = 0
            .Transparency = 0
            .Solid
        End With
        With Sheet1.Shapes("Chart 1").Chart.FullSeriesCollection(2).Format.Fill
            .Visible = msoTrue
            .ForeColor.RGB = RGB(68, 114, 196)
            .Transparency = 0.75
            .Solid
        End With
        Application.CommandBars("Format Object").Visible = False
    Else
        Sheet1.Shapes("Chart 1").Chart.SetElement (msoElementDataLabelNone)
    End If
End Sub

【讨论】:

  • 取消选中时,它会很好地删除标签。检查时我得到“对象不支持此属性或方法”。它指向Sheet5.Shapes("Chart 12").ShowCategoryName = True
  • @Kevin 我忘了添加一些东西,它现在应该可以按预期工作,请参阅我的更新答案。另外,如果这有帮助,请您将我的回复标记为答案吗?谢谢。
  • 如果单元格 W11 包含 True@Xabier Sheet1.Range("W11") = "True" 将是 false,因为它将返回布尔值而不是字符串。所以这不会按预期工作:请参阅我的答案。
  • @Peh,点已更新,感谢您的观察... :)
  • @Xabier 我在同一个地方仍然遇到同样的错误:(
【解决方案3】:

感谢帮助,我能够找出问题所在。下面是最终代码:

Sub Checkbox()
    If Sheet1.Range("W11") = True Then
    Sheet5.Shapes("Chart 12").Chart.SetElement (msoElementDataLabelTop)
    Sheet5.Shapes("Chart 12").Chart.ApplyDataLabels
    Sheet5.Shapes("Chart 12").Chart.FullSeriesCollection(1).DataLabels.Select
    Selection.ShowCategoryName = True
    Selection.Separator = "" & Chr(13) & ""
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(127, 127, 127)
        .Solid
    End With
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent1
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(68, 114, 196)
        .Transparency = 0.75
        .Solid
    End With
    Application.CommandBars("Format Object").Visible = False
        Else
        Sheet5.Shapes("Chart 12").Chart.FullSeriesCollection(1).DataLabels.Select
        Sheet5.Shapes("Chart 12").Chart.SetElement (msoElementDataLabelNone)
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多