使用VBA将散点图XY系列更改为命名范围

时间:2014-02-17 16:08:07

标签: excel vba scatter named-ranges

我有一个动态散点图,它随滑块按钮而变化。为了做到这一点,我使用具有偏移功能的两个命名范围,当我移动滑块按钮增加或减少X和Y范围结束值时,这些命名范围会发生变化。当我复制这张表时会出现问题。新工作表中的图表不会在系列公式中具有命名范围,而是采用第一个工作表中计算的范围,如下所示:

在第一张表中我有:

=Serie('old_sheet'!$AD$3;'old_sheet'!DEF_RANGE;'old_sheet'!STRESS_RANGE;1)

但是当我复制时,新表中的图表将变为:

=Serie('new_sheet'!$AD$3;'new_sheet'!$G$19:$G$578;'new_sheet'!$F$19:$F$578;1)

所以我需要手动更改公式:

=Serie('new_sheet'!$AD$3;'new_sheet'!DEF_RANGE;'new_sheet'!STRESS_RANGE;1)

我问是否有人可以帮我实现一个简单的按钮,将系列公式更改为我想要的。

我试图记录我改变公式的步骤的宏...但它并不总是有效。

有点卡在这里......我将不胜感激任何帮助!

问候

3 个答案:

答案 0 :(得分:0)

我自己已经弄清楚了...这是我使用的代码:

Private Sub CommandButton1_Click()


    sheet_name = ActiveSheet.Name
    MsgBox ("some message")
    ActiveSheet.ChartObjects("Graph_1").Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveSheet.ChartObjects("Graph_1").Chart.SeriesCollection(1).Values = " '" & sheet_name      & "'!stress_range"
    ActiveSheet.ChartObjects("Graph_1").Chart.SeriesCollection(1).XValues = " '" & sheet_name & "'!def_range"


End Sub

希望这对与我有同样问题的人有用。

由于

答案 1 :(得分:0)

以下过程有点痛苦,但它保留了脆弱的工作表范围名称。

  1. 使用工作表和图表保存工作簿。
  2. 将带有图表的工作表移动(不复制)到新工作簿。
  3. 关闭第一个工作簿而不保存,因此在重新打开时它会 仍然有工作表和图表。
  4. 使用移动的工作表和图表保存并关闭新工作簿 (例如TempChart.xlsx)。如果,此工作簿现在可以作为模板 用作下面的步骤6。
  5. 重新打开原始工作簿。
  6. 重新打开新工作簿。移动(不复制)工作表和图表 从新工作簿到原始工作簿。
  7. 每当您需要此工作表和图表的另一个副本时,请按照步骤6重新打开新工作簿,然后将工作表移动到所需的现有工作簿中。

答案 2 :(得分:0)

我想出了一个关于我所拥有的大型程序的小变体,它假定复制的工作表上有一个图表,而该图表中有一个绘制的系列。

Sub FixSeriesRangeRefs()
  Const sXVALNAME As String = "DEF_RANGE"
  Const sYVALNAME As String = "STRESS_RANGE"

  Dim sFormula As String
  Dim vFormula As Variant
  Dim sXVals As String
  Dim sYVals As String

  With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
    sFormula = .Formula
    vFormula = Split(sFormula, ",")

    sXVals = vFormula(LBound(vFormula) + 1)
    sXVals = Left$(sXVals, InStr(sXVals, "!")) & sXVALNAME
    vFormula(LBound(vFormula) + 1) = sXVals

    sYVals = vFormula(LBound(vFormula) + 2)
    sYVals = Left$(sYVals, InStr(sYVals, "!")) & sYVALNAME
    vFormula(LBound(vFormula) + 2) = sYVals

    sFormula = Join(vFormula, ",")
    .Formula = sFormula
  End With
End Sub