我在Excel 2010中生成值,最初将它们放入一个数组中,然后将它们复制到工作表中以用作logarithmix 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数据标签出现以下两种方式之一:
其他一些有趣的异常,当最大值为100时,100的数据标签也会消失。随着最大值增加到1000以上,数据标签似乎都没有出现问题。
我已经尝试将数字格式(一般情况下)更改为数字,小数点后两位,没有运气。改为文字和背面,没有运气。
我认为这是一个错误,但是没有在信息中找到,那里的任何专家能否对此有所启发?
答案 0 :(得分: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标签,即使它与用于生成值的数学相同。
也许有人可以解释为什么会这样,并提供更优雅的解决方案!
谢谢,
拉斯