用于主轴标记的Excel宏

时间:2014-06-15 21:37:56

标签: excel vba excel-vba

我正在尝试编写一个宏来格式化图表以实现一致性。我坚持认为最简单的部分。标记轴。它不会标记主值轴(y轴)。我在2010年和2013年多次录制这个宏。出了什么问题?我运行宏,它在第3行调试,几乎就像标签不存在一样。只运行前两行证明了这一点。有什么帮助吗?

    ActiveChart.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)
    Selection.Format.TextFrame2.TextRange.Characters.Text = "Primary Y-Axis"
      With Selection.Format.TextFrame2.TextRange.Characters(1, 14).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
      End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 14).Font
      .BaselineOffset = 0
      .Bold = msoTrue
      .NameComplexScript = "+mn-cs"
      .NameFarEast = "+mn-ea"
      .Fill.Visible = msoTrue
      .Fill.ForeColor.RGB = RGB(0, 0, 0)
      .Fill.Transparency = 0
      .Fill.Solid
      .Size = 10
      .Italic = msoFalse
      .Kerning = 12
      .Name = "+mn-lt"
      .UnderlineStyle = msoNoUnderline
      .Strike = msoNoStrike
    End With

3 个答案:

答案 0 :(得分:3)

明显的运行时错误来源依赖于记录的宏。他们通常需要一些调整。在您的情况下,我认为问题可能是轴'.HasTitle属性仍设置为False,这会在您尝试访问.AxisTitle属性时引发该错误。

注意:您可以阅读this了解SelectActivate方法存在问题的原因。

在此代码中,我定义了一些变量来表示图表和轴,并确保.HasTitle属性为true。没遇到任何错误。 :)

Sub foo()
Dim cht As Chart
Dim ax As Axis

Set cht = Sheet1.ChartObjects(1).Chart '# modify as needed

cht.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)

'# set your axis in a variable
Set ax = cht.Axes(xlValue, xlPrimary)
'# Make sure your axis HAS a title
ax.HasTitle = True
With ax.AxisTitle.Format.TextFrame2.TextRange
    .Characters.Text = "Primary Y-Axis"
    With .Characters(1, 14).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
End With

End Sub

答案 1 :(得分:0)

我知道这很旧了,但是我遇到了同样的问题(对于实际的轴标签,而不是标题),并且找到了解决方案:不要在SetElement语句中使用msoElementPrimaryValueAxisTitleAdjacentToAxis,而是使用数字307。

在我的情况下,msoElementPrimaryValueAxisTitleAdjacentToAxis被解释为306,它对应于msoElementPrimaryValueAxisTitleNone(将轴设置为none)。因此,在关闭轴后,尝试对其进行修改时,会出现错误,因为您无法修改不存在的内容。

请参阅此处以供参考:MsoChartElementType enumeration

答案 2 :(得分:0)

已录制的宏将引导您进入一些讨厌的兔子洞。例如:

cht.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)

SetElement的文献资料不多,且存在错误。记录器会在参数周围给您不必要的括号,反正这只是一个已命名的常量。

录制的宏的另一个问题是,不必要地列出了所有默认值,以及一些无用的东西,例如

  .NameComplexScript = "+mn-cs"
  .NameFarEast = "+mn-ea"

会吗?

最好只使用逐个元素的语法并明确地执行所需的操作,而不要依赖一些不可思议的,可能会被错误命名的,包罗万象的常量。

使用对象浏览器,但首先,右键单击它,然后选择“显示隐藏的成员”。它显示了一些据认为已过时的成员,但是,来吧,他们实际上不会删除AxisTitle.Font.Bold来支持AxisTitle.Format.TextFrame2.TextRange.Font.Bold

因此,只需要将轴标题设置为所需的格式就可以了:

Sub FormatAxis()
  With ActiveChart
    .HasAxis(xlValue, xlPrimary) = True
    With .Axes(xlValue, xlPrimary)
      .HasTitle = True
      With .AxisTitle
        .Text = "Primary Y Axis"
        With .Font
          .Bold = True
          .Size = 10
        End With
      End With
    End With
  End With
End Sub