首页 文章

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

提问于
浏览
0

我有一个动态散点图,用滑块按钮改变 . 为了做到这一点,我使用具有偏移功能的两个命名范围,当我移动滑块按钮增加或减少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

    我自己弄清楚了...这是我用过的代码:

    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
    

    希望这对任何遇到与我相同问题的人都有用 .

    谢谢

  • 0

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

    • 使用工作表和图表保存工作簿 .

    • 将带有图表的工作表移动(不复制)到新工作簿 .

    • 关闭第一个工作簿而不保存,因此在重新打开时,它仍然会包含工作表和图表 .

    • 使用移动的工作表和图表(例如TempChart.xlsx)保存并关闭新工作簿 . 如果按照下面的步骤6使用,此工作簿现在可以用作模板 .

    • 重新打开原始工作簿 .

    • 重新打开新工作簿 . 将工作表和图表从新工作簿移动(不复制)到原始工作簿 .

    每当您需要此工作表和图表的另一个副本时,请按照步骤6重新打开新工作簿,然后将工作表移动到所需的现有工作簿中 .

  • 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
    

相关问题