1

我在 Excel 2010 中生成值,最初将它们放入数组中,然后将它们复制到工作表中以用作对数混合 x 轴的数据标签(实际上调用 Chart Labeller 来执行此操作,但是当我通过 Excel 手动应用时也会发生这种情况)。在大多数情况下,这可以正常工作,没有问题。然而,在某些情况下,一些(但不是全部)数据标签不可见,即使工作表中的数据在那里,手动选择数据标签也会显示选择的不可见标签。

我发现了什么,我认为这可能是 Excel 中的一个错误,当我转到工作表并重新输入图表上未显示的值时,它会显示在图表上。

这是我对数组的点心:

Dim chart_labeler_info_x()

这是我填充数组的方式:

'Assuming we are going to do the x-axis

ReDim chart_labeler_info_x(1 To x_axis_interval_num, 1 To 3)
For k = 1 To x_axis_interval_num
    'Column 1 is the new chart label value, column 2 is the y value of the new series , column 3 is the x value(equivalent to 111...)

    '--------------------------------------------------------
    chart_labeler_info_x(k, 1) = suf_ize(10 ^ (Log(x_axis.MinimumScale) / Log(10#) + (k - 1)))
    chart_labeler_info_x(k, 2) = y_axis.MinimumScale
    chart_labeler_info_x(k, 3) = 10 ^ (Log(x_axis.MinimumScale) / Log(10#) + (k - 1))
    '--------------------------------------------------------
Next k

这是我在工作表上初始化范围的方法:

Set new_labeler_ws_x_axis = Sheets.Add
new_labeler_ws_x_axis.Name = Chart_for_series & "Eng_Labels_X_Axis"

new_labeler_ws_x_axis.Range("a1:c" & x_axis_interval_num).Value = chart_labeler_info_x
new_labeler_ws_x_axis.Range("a1:c" & x_axis_interval_num).Font.Name = "Arial"
new_labeler_ws_x_axis.Range("a1:c" & x_axis_interval_num).Font.Size = 7

我还创建了一个附加到这个范围的新系列:

With ActiveChart.SeriesCollection.NewSeries
    .XValues = Sheets(new_labeler_ws_x_axis.Name).Range("C1:C" & x_axis_interval_num)
    .Values = Sheets(new_labeler_ws_x_axis.Name).Range("B1:B" & x_axis_interval_num)
    .Name = "=""Labeller_x"""
    .Border.Color = RGB(0, 0, 0)
    .Format.line.Visible = True
End With

工作表中生成的数据如下所示:

1m          100 0.001
10m         100 0.01
100m        100 0.1
1           100 1
10          100 10
100         100 100
1k          100 1000

第 1 列包含将用作新数据标签的值。第 2 列是 y 值,第 3 列是实际 x 值。(如果有帮助,我可以附上工作表。)

这是我正在谈论的图像:

图表标签

您注意到应该在那里的 1k 数据标签不可见。

我可以使 1k 数据标签出现以下两种方式之一:

  1. 扩展系列的最大值,在本例中为 10,000 (10k),在这种情况下显示 1k 标签。
  2. 手动转到工作表,选择具有 1000 值的单元格,重新输入值 1000 并按回车,然后数据标签显示为 1k。

其他一些有趣的异常,当最大值为 100 时,100 的数据标签也消失了。随着最大值增加到超过 1000,数据标签都显示出来似乎没有问题。

我尝试将数字格式(一般是数字格式)更改为带两位小数的数字,但没有运气。更改为文本并返回,没有运气。

我认为这是一个错误,但尚未在信息中找到,那里的任何专家都可以对此有所了解吗?

4

1 回答 1

1

我找到了一个解决方案,虽然有点破解,但我认为它强调了问题的实际可能,也许有人可以提出一个更优雅的解决方案。

我添加了这个代码块的最后一行:

    chart_labeler_info_x(k, 1) = suf_ize(10 ^ (Log(x_axis.MinimumScale) / Log(10#) + (k - 1)))
    chart_labeler_info_x(k, 2) = y_axis.MinimumScale
    chart_labeler_info_x(k, 3) = 10# ^ (Log(x_axis.MinimumScale) / Log(10#) + (k - 1#))
    'This line did the trick
    If chart_labeler_info_x(k, 3) >= 1 Then chart_labeler_info_x(k, 3) = Round(chart_labeler_info_x(k, 3), 0)

正如我之前所说,我们发现手动更新单元格中的值会导致标签可见。我们尝试将 Round 函数应用于单元格中的值,并且有效,因此我将其作为代码中的检查,以检查 1 或更高的值。

看起来,即使显示的单元格值为 1000,但在内部,它一定不是。(我检查了 .value 和 .value2,它们都报告了 1000。)我认为错误在于有时会发生这种情况。如果序列的最大值增加,则会出现 1k 标签,即使它使用相同的数学来生成值。

也许有人可以解释为什么会发生这种情况并提供更优雅的解决方案!

谢谢,

拉斯

于 2013-07-19T14:31:33.150 回答