宏记录的VBA不创建相同的柱状图
这是我在Excel中的数据,我正在尝试从中创建柱状图 A列中的数据用于列标签,B列中的数据用于列高度 这是我正在寻找的图表的图片: 我需要通过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
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
和带有数组转置的两行,就可以将数据从工作表中删除。我将为此更新代码。谢谢,这很有效,我可以问一下删除行和转置行的目的是什么吗?当然-那是在我测试代码时,每次都需要一个空白工作表和相同的测试数据,而不必重新输入。