Как отключить автоматическое создание SeriesCollection в Excel Chart - PullRequest
0 голосов
/ 16 февраля 2011

У меня уже есть этот код

Excel::_ApplicationPtr app("Excel.Application");

app->Visible[0] = false;

Excel::_WorkbookPtr book = app->Workbooks->Add();
Excel::_WorksheetPtr sheet = book->Worksheets->Item[1];

RangePtr pRange = sheet->Cells;
RangePtr pCell;

pCell = pRange->Item[1][1]; // A1
pCell->Value2 = "1";
pCell = pRange->Item[1][2]; // B1
pCell->Value2 = "1";
pCell = pRange->Item[1][3]; // C1
pCell->Value2 = "10";

pCell = pRange->Item[2][1]; // A2
pCell->Value2 = "3";
pCell = pRange->Item[2][2]; // B2
Cell->Value2 = "1";
pCell = pRange->Item[2][3]; // C2
pCell->Value2 = "20";

и следующий

Excel::RangePtr pBeginRange = pRange->Item[1][1];
Excel::RangePtr pEndRange = pRange->Item[5][9];
Excel::RangePtr pTotalRange = sheet->Range[(Excel::Range *)pBeginRange][(Excel::Range *)pEndRange];

_ChartPtr  pChart2  = book->Charts->Add();
pChart2->ChartType = xlBubble3DEffect; 

pChart2->SetSourceData((Excel::Range *)pTotalRange, (long)Excel::xlColumns);

Как отключить автоматическое создание SeriesCollection в Excel ChartЯ хочу установить диапазоны вручную.В автоматическом создании все SeriesCollection имеет XValues ​​в первом столбце.Но мне это не нужно.

Ответы [ 3 ]

2 голосов
/ 28 июня 2012

Я тоже сталкивался с той же проблемой. Из экспериментов я думаю, что происходит следующее:

Когда вы создаете новую диаграмму в VBA, используя следующий код

Dim chSheet As Chart
Set chSheet = Charts.Add

Excel, стараясь быть полезным, держу пари, автоматически просматривает любой лист, выбранный вашим курсором, когда вы выполняете код из окна разработчика, и ищет ближайший набор данных, который, по его мнению, может представлять собой диапазон значений для графика. Затем он автоматически заполняется на графике. Единственный способ обойти это, как я обнаружил, - это выполнить следующий код, чтобы удалить все объекты серии в объекте коллекции серий на диаграмме сразу после его создания. Сенсорный счетчик интуитивно понятен, но работает ...

Public Sub DeleteChartSeries(chartSheet As Chart)

    'Shorter but perhaps less clean way of writing the code compared to below
    Do Until chartSheet.SeriesCollection.Count = 0
        chartSheet.SeriesCollection(1).Delete
    Loop

    'With chartSheet
    '    Do Until .seriesCollection.Count = 0
    '        .seriesCollection(1).Delete
    '    Loop
    'End With

End Sub
1 голос
/ 10 сентября 2013

Просто нажмите на обходной путь: сначала переместите курсор куда-нибудь за пределы UsedRange, затем создайте диаграмму: не будет выполнять автоопределение. Затем вернитесь назад.

Другими словами, следующий код работает для меня (Excel 2007):

' Assume src As Range (proposed source data for the chart) in the ActiveSheet.

' put the cursor somewhere outside the UsedRange to avoid Excel's
' 'helpful' auto detection.
Dim ur As Range
Set ur = src.Worksheet.UsedRange
ur.Cells(1, ur.Columns.Count).Offset(0, 2).Select

Dim crt As Chart
Set crt = src.Worksheet.Shapes.AddChart().Chart
' ^ does NOT do auto-detection.
0 голосов
/ 17 февраля 2011

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

В VBA:

Set Chrt = wb.Charts.Add()
Chrt.SeriesCollection(1).Delete
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...