Excel 使用VBA添加数据标签

Excel 使用VBA添加数据标签,excel,vba,Excel,Vba,我有一个基于复选框的子,我想在图形上显示数据标签和隐藏数据标签之间切换。我录制了宏并将其更改为不再说“Selection”或“ActiveChart”,因为我不想让用户选择图表。我想这就是我的问题所在,因为它完全不起作用 我似乎无法缩小这个问题的范围,因为这是一个相当长的问题。任何帮助都将不胜感激 Sub Checkbox() Dim Cht As ChartObject Set Cht = Sheet5.ChartObjects("Chart 12") If Sheet1.Range(

我有一个基于复选框的,我想在图形上显示数据标签和隐藏数据标签之间切换。我录制了宏并将其更改为不再说“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中查找“真”或“假”。如果可行,我宁愿使用复选框。

尝试以下操作,我相信您引用的图表不正确,通过使用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

尝试以下操作,我相信您没有正确引用图表,通过使用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
问题是

If Sheet1.Range("W11") = "TRUE"
不是
真的

如果
Debug.Print Sheet1.Range(“W11”)=“TRUE”
它将返回
false
,而不是预期的
TRUE
。原因是在这种情况下,
Sheet1.Range(“W11”)
返回的是
布尔值,而不是
字符串

您可以使用验证返回类型

Debug.Print VarType(Sheet1.Range("W11"))
它返回
11
,这意味着
boolean
(请参阅)


所以你应该把它改成

If Sheet1.Range("W11") = True
如果单元格W11包含
true
,则问题在于

If Sheet1.Range("W11") = "TRUE"
不是
真的

如果
Debug.Print Sheet1.Range(“W11”)=“TRUE”
它将返回
false
,而不是预期的
TRUE
。原因是在这种情况下,
Sheet1.Range(“W11”)
返回的是
布尔值,而不是
字符串

您可以使用验证返回类型

Debug.Print VarType(Sheet1.Range("W11"))
它返回
11
,这意味着
boolean
(请参阅)


所以你应该把它改成

If Sheet1.Range("W11") = True

这是
true
如果单元格W11包含
true

多亏了帮助,我才能够解决问题。以下是最终代码:

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

多亏了我的帮助,我才弄清了这个问题。以下是最终代码:

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


我建议单步检查代码(或使用
debug.print
)以检查
语句是否按预期的方式运行。我建议单步检查代码(或使用
debug.print
)以检查
语句是否按预期的方式运行。取消选中时,它会很好地删除标签。检查时,我得到一个“对象不支持此属性或方法”。它指向
Sheet5.Shapes(“图表12”).ShowCategoryName=True
@Kevin我忘了添加一些东西,现在应该可以正常工作了,请查看我的更新答案。另外,如果这有帮助,请您将我的回答标记为答案?谢谢。@Xabier
Sheet1。如果单元格W11包含
True
,则范围(“W11”)=“True”将为
false
,因为它将返回布尔值而不是字符串。所以这不会像预期的那样起作用:请看我的答案。@Peh,观点已被采纳并更新,感谢您的观察…:)@Xabier我仍然在同一点上遇到同样的错误:(取消选中时,它会很好地删除标签。选中时,我得到一个“对象不支持此属性或方法”。它指向
Sheet5.Shapes(“图12”).ShowCategoryName=True
@Kevin我忘了添加一些内容,现在应该可以正常工作了,请查看我的更新答案。如果这有帮助,请将我的回答标记为答案。谢谢。@Xabier
Sheet1.Range(“W11”)=“True”如果单元格W11包含
True
,则
将为
false
,因为它将返回一个布尔值,而不是字符串。因此,这将无法按预期工作:请参阅我的答案。@Peh,获取并更新了要点,感谢您的观察…:)@Xabier我仍然在同一位置遇到相同的错误:(这很有意义,如果我想使用复选框引用而不是链接的单元格,我可以用
如果CheckBox1.Value=True,那么
替换该行。@KevinP。如果它是ActiveX复选框,那么是,如果它是表单元素复选框,那么是。如果
Sheet1.CheckBox1.Value=True,那么你可能需要指定工作表,如果
ode位于模块中。如果使用表单元素复选框而不是ActiveX,则需要使用类似于
If Sheet1.Shapes(“复选框1”)的内容.OLEFormat.Object.Value=xlOn然后
。如果可能的话,我建议远离ActiveX。请注意,
复选框1
中可能有一个空格。除了我的原始代码和Xabiers的复选框问题之外,我仍然收到一个功能错误。@KevinP。如果您不告诉我们您收到的错误以及原始代码的哪一行代码我们无法帮助。抱歉,我已在另一个答案中发布了注释。取消选中时,它会很好地删除标签。选中时,我得到一个“对象不支持此属性或方法”。它指向
Sheet5.Shapes(“图12”).ShowCategoryName=True
这很有意义,如果我想使用复选框引用而不是链接的单元格,我可以将该行替换为
如果CheckBox1.Value=True,那么
如果我想使用复选框引用而不是链接的单元格?@KevinP。如果它是ActiveX复选框,那么是,如果它是表单元素复选框,那么是。如果
Sheet1.CheckBox1.Val,您可能需要指定工作表ue=True然后
如果代码在模块中。如果使用表单元素复选框而不是ActiveX,则需要使用类似于
if Sheet1.Shapes(“复选框1”)的内容.OLEFormat.Object.Value=xlOn然后
。如果可能的话,我建议远离ActiveX。请注意,
复选框1
中可能有一个空格。除了我的原始代码和Xabiers的复选框问题之外,我仍然收到一个功能错误。@KevinP。如果你不告诉我们是哪个er