【问题标题】:How to disable automatic creation SeriesCollection in Excel Chart如何在 Excel 图表中禁用自动创建 SeriesCollection
【发布时间】:2011-06-28 07:21:32
【问题描述】:

我已经有了这个代码

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

如何在 Excel 图表中禁用自动创建 SeriesCollection。我想手动设置范围。在自动创建中,所有 SeriesCollection 在第一列中都有 XValues。但我不需要它。

【问题讨论】:

    标签: c++ excel visual-c++ com


    【解决方案1】:

    我也遇到过同样的问题。根据实验,我认为正在发生以下情况:

    当您使用以下代码在 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
    

    【讨论】:

      【解决方案2】:

      只需找到一个解决方法:首先将光标移动到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.
      

      【讨论】:

        【解决方案3】:

        可能无法阻止创建,但您可以在创建图表后立即将其删除,然后根据需要创建您自己的系列。

        在 VBA 中:

        Set Chrt = wb.Charts.Add()
        Chrt.SeriesCollection(1).Delete
        

        【讨论】:

        • 不,此代码适用于 VBA,但在 C++ Win32 应用程序中这不起作用
        • [code](pChart2->SeriesCollection(_variant_t((long)1))->Delete();) 错误:错误 C2039:“删除”:不是“IDispatch”的成员,因为SeriesCollection 返回 IDispatch
        • 尝试添加中间结果以查看中断的位置(图表的 SeriesCollection,然后是 SeriesCollection 的 Item(1),然后将 Delete 方法应用于系列)。
        • 在_ChartPtr pChart2 = book->Charts->Add()之后;正在创建默认 SeriesCollections。如何禁用此创建或清除所有默认系列(一个方法),接下来我已经通过调用和调度的 NewSerios 方法手动创建了系列
        • 如果 excel 自动创建多个系列,这不起作用
        猜你喜欢
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 2013-07-31
        相关资源
        最近更新 更多