数十年来剔除蜱虫

bri*_*ium 11 excel charts vba excel-vba

我有一个图表,其中一些数据具有线性y轴和对数x轴.问题是关于对数(x-)轴.

我希望x轴上的对数刻度与精确的十年(10的幂)对齐,但我不希望轴必须在确切的几十年开始; 我希望它从我的数据开始的地方开始.例如,轴可以从3开始; 但是第一个主要刻度应该是10.我该怎么做?

目前,当我将轴设置为从3开始时,主网格线为3,这是不好的.

当我设置以下属性时,网格和刻度很好,但这是因为我强制轴开始十年(我不想这样做).

.Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
.Chart.Axes(xlCategory).HasMajorGridlines = True
.Chart.Axes(xlCategory).HasMinorGridlines = True
.Chart.Axes(xlCategory).MinimumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START, 6))))
.Chart.Axes(xlCategory).MaximumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START + n, 6)) - 0.00001) + 1)
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:漂亮的网格,但轴不在正确的位置开始.

在此输入图像描述

现在,当我没有专门将我的轴的最小值和最大值绕到十年时,

' ...
.Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(DATA_START, 6)
.Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(DATA_START + n, 6)
Run Code Online (Sandbox Code Playgroud)

它看起来像这样,轴从正确的位置开始,但网格/刻度看起来很傻:

在此输入图像描述

在这个例子中,我希望第一个刻度为100,在此之前只有次要刻度/网格线.

我已经想通了,我可以设置两个主要滴答之间的乘法因​​子.MajorUnit = 10.


我有一个SSCCE:只需在空白纸上运行此宏.它生成一个图表,其中包含主要的刻度线(和网格线)18, 180, 1800,但我想要它们100, 1000.

Sub CreateDemoPlot()
    Range("A1:A6") = Application.Transpose(Split("20,40,100,1000,4500,10000", ","))
    Range("B1:B6") = Application.Transpose(Split("-30,-50,-90,-70,-75,-88", ","))
    With ActiveSheet.ChartObjects.Add(Left:=100, Width:=400, Top:=100, Height:=200)
        .Chart.SeriesCollection.NewSeries
        .Chart.ChartType = xlXYScatterLinesNoMarkers
        .Chart.Axes(xlValue).ScaleType = xlLinear
        .Chart.Axes(xlValue).CrossesAt = -1000
        .Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
        .Chart.Axes(xlCategory).HasMajorGridlines = True
        .Chart.Axes(xlCategory).HasMinorGridlines = True
        .Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(1, 1)
        .Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(6, 1)
        .Chart.Axes(xlCategory).MajorUnit = 10
        .Chart.HasLegend = False

        .Chart.SeriesCollection.NewSeries
        .Chart.SeriesCollection(1).XValues = Range("A1:A6")
        .Chart.SeriesCollection(1).Values = Range("B1:B6")
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

use*_*125 9

如果您确实想要这样做,可以将垂直轴交叉更改为您想要开始的值.在这种情况下,我们将从18开始. 1

我们想要摆脱左边的丑陋轴,然后创建图表的副本并删除所有内容并删除除轴之外的所有填充颜色,如下图所示.然后,您创建一个没有边框的白色框,并覆盖原始图表Y轴.请注意,我忘记将线条颜色设置为"否",并将顶部图表的勾号设置为关闭. 2

接下来,您覆盖透明图表,您就可以获得所需内容.要使用VBA自动更新图表,您可以使用ActiveChart.Axes(xlCategory).CrossesAt = 20并对叠加图表和基础图表进行所有比例更改.

您可能想要使用另一个图形程序或只使用您发布的第一个图表,因为对于复杂的图表来说,这可能不值得您花时间. 3

代码自动执行:

Sub CreateDemoPlot()
    Dim chart2 As ChartObject
    Dim shape1 As shape

    Range("A1:A6") = Application.Transpose(Split("20,40,100,1000,4500,10000", ","))
    Range("B1:B6") = Application.Transpose(Split("-30,-50,-90,-70,-75,-88", ","))
    Range("D3:K15").Name = "ChartArea" 'Set Chart Area
    With ActiveSheet.ChartObjects.Add(Left:=100, Width:=400, Top:=100, Height:=200)
        .Chart.SeriesCollection.NewSeries
        .Chart.ChartType = xlXYScatterLinesNoMarkers
        .Chart.Axes(xlValue).ScaleType = xlLinear
        .Chart.Axes(xlValue).CrossesAt = -1000
        .Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
        .Chart.Axes(xlCategory).HasMajorGridlines = True
        .Chart.Axes(xlCategory).HasMinorGridlines = True
        .Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(1, 1)
        .Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(6, 1)
        .Chart.Axes(xlCategory).MajorUnit = 10
        .Chart.HasLegend = False

        .Chart.SeriesCollection.NewSeries
        .Chart.SeriesCollection(1).XValues = Range("A1:A6")
        .Chart.SeriesCollection(1).Values = Range("B1:B6")

        .Chart.Axes(xlCategory).CrossesAt = 18 'Or where ever the actual data starts
        .Chart.Axes(xlCategory).MinimumScale = 10 'Set to 10 instead of the above code

        'position to chart area
        .Top = Range("ChartArea").Top
        .Left = Range("ChartArea").Left
        .Copy

        'create white box
        ActiveSheet.Shapes.AddShape msoShapeRectangle, 50, 50, 45, 200
        Set shape1 = ActiveSheet.Shapes(2)
        shape1.Fill.ForeColor.RGB = RGB(255, 255, 255)
        shape1.Line.ForeColor.RGB = RGB(255, 255, 255)

        'Position whitebox
        shape1.Left = Range("ChartArea").Left
        shape1.Top = Range("ChartArea").Top

        'Paste overlay chart
        ActiveSheet.Paste
        Set chart2 = ActiveSheet.ChartObjects("Chart 3")

        'Position overlay Chart
        chart2.Top = Range("ChartArea").Top
        chart2.Left = Range("ChartArea").Left

        'Clear out overlay chart
        chart2.Chart.Axes(xlValue).Format.Line.Visible = msoFalse
        chart2.Chart.SeriesCollection(1).Format.Line.Visible = msoFalse
        chart2.Chart.PlotArea.Format.Fill.Visible = msoFalse
        chart2.Chart.Axes(xlCategory).Delete
        chart2.Chart.SetElement (msoElementPrimaryValueGridLinesNone)
        chart2.Chart.SetElement (msoElementPrimaryCategoryGridLinesNone)
        chart2.Chart.ChartArea.Format.Fill.Visible = msoFalse

        'Adjust Y axis position from overlay chart
        chart2.Chart.PlotArea.Left = 10
        chart2.Chart.PlotArea.Top = 0
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 有创意,如果不是很正统的话.当将OP渲染到可能意外处理矩形和隐藏文本的任何非传统输出设备时,OP需要小心. (2认同)