Excel 使用VBA添加数据标签
我有一个基于复选框的子,我想在图形上显示数据标签和隐藏数据标签之间切换。我录制了宏并将其更改为不再说“Selection”或“ActiveChart”,因为我不想让用户选择图表。我想这就是我的问题所在,因为它完全不起作用 我似乎无法缩小这个问题的范围,因为这是一个相当长的问题。任何帮助都将不胜感激Excel 使用VBA添加数据标签,excel,vba,Excel,Vba,我有一个基于复选框的子,我想在图形上显示数据标签和隐藏数据标签之间切换。我录制了宏并将其更改为不再说“Selection”或“ActiveChart”,因为我不想让用户选择图表。我想这就是我的问题所在,因为它完全不起作用 我似乎无法缩小这个问题的范围,因为这是一个相当长的问题。任何帮助都将不胜感激 Sub Checkbox() Dim Cht As ChartObject Set Cht = Sheet5.ChartObjects("Chart 12") If Sheet1.Range(
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我忘了添加一些东西,现在应该可以正常工作了,请查看我的更新答案。另外,如果这有帮助,请您将我的回答标记为答案?谢谢。@XabierSheet1。如果单元格W11包含True
,则范围(“W11”)=“True”将为false
,因为它将返回布尔值而不是字符串。所以这不会像预期的那样起作用:请看我的答案。@Peh,观点已被采纳并更新,感谢您的观察…:)@Xabier我仍然在同一点上遇到同样的错误:(取消选中时,它会很好地删除标签。选中时,我得到一个“对象不支持此属性或方法”。它指向Sheet5.Shapes(“图12”).ShowCategoryName=True
@Kevin我忘了添加一些内容,现在应该可以正常工作了,请查看我的更新答案。如果这有帮助,请将我的回答标记为答案。谢谢。@XabierSheet1.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