2014-02-17 2 views
0

У меня динамический график рассеяния, который изменяется с помощью кнопки ползунка. Для этого я использую два именованных диапазона со смещенной функцией, эти именованные диапазоны меняются, когда я перемещаю кнопку ползунка, увеличивая или уменьшая конечное значение диапазона X и Y. Проблема возникает, когда я делаю копию этого листа. График в новом листе не будет иметь именованный диапазон по формуле серии, но вместо этого он принимает диапазон, который был рассчитан на первом листе, как это:Изменить рассеянную диаграмму XY-серии с указанными диапазонами с VBA

В первом листе я есть это:

=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) 

Я спрашиваю, может ли кто-нибудь помочь мне реализовать простую кнопку, которая меняет формулу серии на то, что я хочу.

Я попытался записать макрос шагов, которые я делаю, чтобы изменить формулу ... но это не всегда работает.

Вид застрял здесь ... я был бы признателен за любую помощь!

С уважением

+0

'новый лист' или новая книга?Являются ли указанные диапазоны рабочей книги? 'это не всегда работает' звучит так, как будто вы, возможно,« почти там », считаете ли вы, что это код, или его часть, проблема? – pnuts

ответ

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

Следующая процедура является немного боли, но он сохраняет хрупкие рабочий лист в области видимости имен.

  1. Сохраните книгу с рабочим листом и диаграммой.
  2. Переместить (не копировать) лист с диаграммой в новую книгу.
  3. Закройте первую книгу без сохранения, поэтому при повторном открытии будет все еще есть рабочий лист и диаграмма.
  4. Сохраните и закройте новую книгу с перемещенным рабочим листом и диаграммой (например, TempChart.xlsx). Эта книга теперь может служить шаблоном, если используется как на шаге 6 ниже.
  5. Повторно открыть оригинальную книгу.
  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 
Смежные вопросы