宏记录的VBA不创建相同的柱状图

宏记录的VBA不创建相同的柱状图,vba,excel,graph,charts,Vba,Excel,Graph,Charts,这是我在Excel中的数据,我正在尝试从中创建柱状图 A列中的数据用于列标签,B列中的数据用于列高度 这是我正在寻找的图表的图片: 我需要通过VBA来实现这一点,所以我在录制宏时手动创建了图形。我得到了这个密码: Sub Macro5() Range("A1:B10").Select ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select ActiveChart.SetSourceData Source:=Range("Repo

这是我在Excel中的数据,我正在尝试从中创建柱状图

A列中的数据用于列标签,B列中的数据用于列高度

这是我正在寻找的图表的图片:

我需要通过VBA来实现这一点,所以我在录制宏时手动创建了图形。我得到了这个密码:

Sub Macro5()
Range("A1:B10").Select
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=Range("Report!$A$1:$B$10")
ActiveChart.FullSeriesCollection(1).Select
ActiveChart.ChartGroups(1).Overlap = 0
ActiveChart.ChartGroups(1).GapWidth = 0
ActiveChart.ChartTitle.Select
ActiveChart.ChartTitle.Text = "Frequency"
Selection.Format.TextFrame2.TextRange.Characters.Text = "Frequency"
With Selection.Format.TextFrame2.TextRange.Characters(1, 9).ParagraphFormat
    .TextDirection = msoTextDirectionLeftToRight
    .Alignment = msoAlignCenter
End With
With Selection.Format.TextFrame2.TextRange.Characters(1, 9).Font
    .BaselineOffset = 0
    .Bold = msoFalse
    .NameComplexScript = "+mn-cs"
    .NameFarEast = "+mn-ea"
    .Fill.Visible = msoTrue
    .Fill.ForeColor.RGB = RGB(89, 89, 89)
    .Fill.Transparency = 0
    .Fill.Solid
    .Size = 14
    .Italic = msoFalse
    .Kerning = 12
    .Name = "+mn-lt"
    .UnderlineStyle = msoNoUnderline
    .Spacing = 0
    .Strike = msoNoStrike
End With
ActiveChart.ChartArea.Select
End Sub
现在,当我再次运行此宏时,它不会给出与录制此宏时创建的图形相同的图形

这是我运行宏时得到的图形:

所以,我的问题是,它为什么要这样做,我如何修复它?我如何根据现有数据制作一个类似于我手工制作的图形

录制宏对我来说根本不起作用,正如您所看到的,它给了我一个完全不同的图形


总而言之,我手动创建了一个图形并录制了一个宏,但运行宏不会创建我以前创建的图形。

以下是复制图表所需的编程步骤

您最初必须执行与图表向导所执行的步骤不同的步骤。从图表向导生成的代码并不总是那么有用

步骤如下:

  • 在工作表中创建数据
  • 使用图表创建新形状并获取图表引用
  • 数据分配给图表
  • 获取图表中的第一个系列
  • 标签指定给系列
  • 更改图表的第一个“ChartGroup”上的“GapWidth”属性,以获得粗块的外观
  • 设置图表标题
只需将此代码放入一个空模块并运行它:

Option Explicit

Sub CreateGraph()

    Dim ws As Worksheet
    Dim rngLabels As Range
    Dim rngData  As Range
    Dim shpChart As Shape
    Dim cht As Chart
    Dim srs As Series

    ' set a reference to worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' get ranges for labels and data
    Set rngLabels = ws.Range("A1:A10")
    Set rngData = ws.Range("B1:B10")

    'uncomment if you want to fake up some data for the this
    'ws.Cells.Delete
    'rngLabels.Value = WorksheetFunction.Transpose(Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100))
    'rngData.Value = WorksheetFunction.Transpose(Array(0, 1, 4, 9, 4, 3, 6, 4, 8, 6))

    ' create a chart shape, get chart reference and set source data
    Set shpChart = ws.Shapes.AddChart2(201, xlColumnClustered)
    Set cht = shpChart.Chart
    cht.SetSourceData Source:=rngData, PlotBy:=xlColumns

    ' update the series object with labels
    Set srs = cht.SeriesCollection(1)
    srs.XValues = rngLabels

    ' make the graph 'chunky'
    cht.ChartGroups(1).GapWidth = 0

    ' set chart title
    cht.ChartTitle.Text = "Frequency"

End Sub

以下是复制图表所需的编程步骤

您最初必须执行与图表向导所执行的步骤不同的步骤。从图表向导生成的代码并不总是那么有用

步骤如下:

  • 在工作表中创建数据
  • 使用图表创建新形状并获取图表引用
  • 数据分配给图表
  • 获取图表中的第一个系列
  • 标签指定给系列
  • 更改图表的第一个“ChartGroup”上的“GapWidth”属性,以获得粗块的外观
  • 设置图表标题
只需将此代码放入一个空模块并运行它:

Option Explicit

Sub CreateGraph()

    Dim ws As Worksheet
    Dim rngLabels As Range
    Dim rngData  As Range
    Dim shpChart As Shape
    Dim cht As Chart
    Dim srs As Series

    ' set a reference to worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' get ranges for labels and data
    Set rngLabels = ws.Range("A1:A10")
    Set rngData = ws.Range("B1:B10")

    'uncomment if you want to fake up some data for the this
    'ws.Cells.Delete
    'rngLabels.Value = WorksheetFunction.Transpose(Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100))
    'rngData.Value = WorksheetFunction.Transpose(Array(0, 1, 4, 9, 4, 3, 6, 4, 8, 6))

    ' create a chart shape, get chart reference and set source data
    Set shpChart = ws.Shapes.AddChart2(201, xlColumnClustered)
    Set cht = shpChart.Chart
    cht.SetSourceData Source:=rngData, PlotBy:=xlColumns

    ' update the series object with labels
    Set srs = cht.SeriesCollection(1)
    srs.XValues = rngLabels

    ' make the graph 'chunky'
    cht.ChartGroups(1).GapWidth = 0

    ' set chart title
    cht.ChartTitle.Text = "Frequency"

End Sub

这是可行的,但有没有一种方法可以做到这一点,而不必在代码中的转置函数中手动将这些值输入数组?有没有办法让它从表中获取数组?因为这些值并不总是相同的,所以只需注释掉
ws.Cells.Delete
和带有数组转置的两行,就可以将数据从工作表中删除。我将为此更新代码。谢谢,这很有效,我可以问一下删除行和转置行的目的是什么吗?当然-这是在我测试代码时,每次都需要一个空白工作表和相同的测试数据,而不必重新输入。这是可行的,但有没有办法做到这一点,而不必手动将这些值输入到密码?有没有办法让它从表中获取数组?因为这些值并不总是相同的,所以只需注释掉
ws.Cells.Delete
和带有数组转置的两行,就可以将数据从工作表中删除。我将为此更新代码。谢谢,这很有效,我可以问一下删除行和转置行的目的是什么吗?当然-那是在我测试代码时,每次都需要一个空白工作表和相同的测试数据,而不必重新输入。