フィルターのクリア

I am getting problems with adding charts in Excel 2010 using activeX

2 ビュー (過去 30 日間)
Mirage
Mirage 2012 年 10 月 19 日
Hi, I'm using activex to access Excel 2010 through Matlab and I need to add several charts to each worksheet. I created a function called xlsgraphchart to do exactly this for me, however it gives me errors whenever I add a chart at a number greater than a certain row. This code also plots the trendlines and extracts the values from the trendlines and returns the slope. The problem lies when I use,
XLChartObject = XLActive.ChartObjects.Add(Left,Top,Width,Height);
in the following code. Anytime the 'Top' variable is greater than say 300 or so, it throws me an error.
function [LinSlope PolySlope LinSlope_Str PolySlope_Str] = xlsgraphchart(Excel,XseriesRange,YseriesRange,X_Axis_Title,Y_Axis_Title,Left,Top,Width,Height,PageIdx)
%% The Excel variable in the function argument is an application, e.g. Excel = actxserver('excel.application');
ExcelWs = Excel.Workbooks;
XLSheet = Excel.ActiveWorkBook.Sheets;
GetXLSheet = get(XLSheet, 'Item', PageIdx);
invoke(GetXLSheet,'Activate');
XLActive = Excel.ActiveSheet;
Excel.Visible = 0;
XLChartObject = XLActive.ChartObjects.Add(Left,Top,Width,Height);
XLChart = XLChartObject.Chart;
XLChart.SeriesCollection.NewSeries;
XLChart.SeriesCollection(1).Value = XLActive.Range(YseriesRange);
XLChart.SeriesCollection(1).XValue = XLActive.Range(XseriesRange);
XLChartObject.Chart.ChartType = 1; % view the chart before moving on
XLChartObject.Chart.ChartType = 65;
XLChartObject.Chart.HasTitle = true;
XLChartObject.Chart.ChartTitle.Text = [X_Axis_Title ' Vs. ' Y_Axis_Title]; % view it again
%Set X-axis Title
ChartAxes = invoke(XLChartObject.Chart,'Axes',1);
set(ChartAxes,'HasTitle',1);
set(ChartAxes.AxisTitle,'Caption',X_Axis_Title);
%Set Y-axis Title
ChartAxes = invoke(XLChartObject.Chart,'Axes',2);
set(ChartAxes,'HasTitle',1);
set(ChartAxes.AxisTitle,'Caption',Y_Axis_Title);
Type_Linear = -4132;
Type_Poly = 3;
% Type_Power = 4;
% Type_Exp = 5;
XLChart.SeriesCollection(1).Trendlines.Add(Type_Linear);
XLChart.SeriesCollection(1).Trendlines(1).DisplayRSquared = 1;
Lin_R_Squared = XLChart.SeriesCollection(1).Trendlines(1).DataLabel.Text
XLChart.SeriesCollection(1).Trendlines(1).DisplayRSquared = 0;
XLChart.SeriesCollection(1).Trendlines(1).DisplayEquation = 1;
Lin_y_Eq = XLChart.SeriesCollection(1).Trendlines(1).DataLabel.Text
XLChart.SeriesCollection(1).Trendlines(1).DisplayRSquared = 1;
Lin_R_squared_Cell = regexp(Lin_R_Squared,'[+-eE\d*\x\.]+','match');
Lin_y_Eq_Cell = regexp(Lin_y_Eq,'[+-eE\d*\x\.]+','match');
Lin_R_squared_Num = str2num(Lin_R_squared_Cell{length(Lin_R_squared_Cell)});
NewLength = int8(length(Lin_y_Eq_Cell)/2);
Temp = Lin_y_Eq_Cell;
Lin_y_Eq_Cell = cell(1,NewLength);
t=2;
for i=1:NewLength
Lin_y_Eq_Cell{i} = Temp{t};
t=t+2;
end
if ~isempty(strfind(Lin_y_Eq_Cell{1},'x'))
[xx yy] = find(Lin_y_Eq_Cell{1} == 'x');
if NewLength < 2
ExpMatch = [1;2];
Lin_y_Eq_Cell_Temp = Lin_y_Eq_Cell;
Lin_y_Eq_Cell = cell(1,length(ExpMatch));
for i=1:length(ExpMatch)
Lin_y_Eq_Cell{i} = '0';
end
Lin_y_Eq_Cell{1} = Lin_y_Eq_Cell_Temp{1};
end
end
for s=1:length(Lin_y_Eq_Cell)
if ~isempty(strfind(Lin_y_Eq_Cell{s},'x'))
if strcmpi(Lin_y_Eq_Cell{s}(1),'x')
Lin_y_Eq_Cell{s} = '1';
end
end
end
Lin_y_Eq_Cell_Final = cell(1,length(Lin_y_Eq_Cell));
for s=1:length(Lin_y_Eq_Cell)
if ~isempty(strfind(Lin_y_Eq_Cell{s},'x'))
[xx yy] = find(Lin_y_Eq_Cell{s} == 'x');
Lin_y_Eq_Cell_Final{s} = Lin_y_Eq_Cell{s}(1:yy-1);
else
Lin_y_Eq_Cell_Final{s} = Lin_y_Eq_Cell{s};
end
end
%%Polynomial 1
XLChart.SeriesCollection(1).Trendlines.Add(Type_Poly,2);
XLChart.SeriesCollection(1).Trendlines(2).DisplayRSquared = 1;
Poly1_R_Squared = XLChart.SeriesCollection(1).Trendlines(2).DataLabel.text
XLChart.SeriesCollection(1).Trendlines(2).DisplayRSquared = 0;
XLChart.SeriesCollection(1).Trendlines(2).DisplayEquation = 1;
Poly1_y_Eq = XLChart.SeriesCollection(1).Trendlines(2).DataLabel.text
XLChart.SeriesCollection(1).Trendlines(2).DisplayEquation = 0;
Poly1_R_squared_Cell = regexp(Poly1_R_Squared,'[+-eE\d*\x\.]+','match');
Poly1_y_Eq_Cell = regexp(Poly1_y_Eq,'[+-eE\d*\x\.]+','match');
Poly1_R_squared_Num = str2num(Poly1_R_squared_Cell{length(Poly1_R_squared_Cell)});
NewLength = int8(length(Poly1_y_Eq_Cell)/2);
Temp = Poly1_y_Eq_Cell;
Poly1_y_Eq_Cell = cell(1,NewLength);
t=2;
for i=1:NewLength
Poly1_y_Eq_Cell{i} = Temp{t};
t=t+2;
end
% e.g. if y = x2 + 5, the derivative will be 1 because it is missing the
% x^1 term, therefore the coefficient for the x^1 term must be appended
% even though it is 0
if ~isempty(strfind(Poly1_y_Eq_Cell{1},'x'))
[xx yy] = find(Poly1_y_Eq_Cell{1} == 'x');
if (str2num(Poly1_y_Eq_Cell{1}(yy+1))+1) > NewLength
ExpMatch = [1:str2num(Poly1_y_Eq_Cell{1}(yy+1))+1];
Poly1_y_Eq_Cell_Temp = Poly1_y_Eq_Cell;
Poly1_y_Eq_Cell = cell(1,length(ExpMatch));
for i=1:length(ExpMatch)
Poly1_y_Eq_Cell{i} = '0';
end
for i=1:length(Poly1_y_Eq_Cell_Temp)
if ~isempty(strfind(Poly1_y_Eq_Cell_Temp{i},'x'))
[xx yy] = find(Poly1_y_Eq_Cell_Temp{i} == 'x');
PosIdx = (str2num(Poly1_y_Eq_Cell_Temp{i}(yy+1)));
if length(Poly1_y_Eq_Cell_Temp{i}) == yy;
Poly1_y_Eq_Cell{length(Poly1_y_Eq_Cell)-1} = Poly1_y_Eq_Cell_Temp{i};
else
Poly1_y_Eq_Cell{length(Poly1_y_Eq_Cell)-(PosIdx)} = Poly1_y_Eq_Cell_Temp{i};
end
else
Poly1_y_Eq_Cell{length(Poly1_y_Eq_Cell)} = Poly1_y_Eq_Cell_Temp{length(Poly1_y_Eq_Cell_Temp)};
end
end
end
end
%
Poly1_y_Eq_Cell_Final = cell(1,length(Poly1_y_Eq_Cell));
for s=1:length(Poly1_y_Eq_Cell)
if ~isempty(strfind(Poly1_y_Eq_Cell{s},'x'))
if strcmpi(Poly1_y_Eq_Cell{s}(1),'x')
Poly1_y_Eq_Cell_Final{s} = '1';
else
[xx yy] = find(Poly1_y_Eq_Cell{s} == 'x');
Poly1_y_Eq_Cell_Final{s} = Poly1_y_Eq_Cell{s}(1:yy-1);
end
else
Poly1_y_Eq_Cell_Final{s} = Poly1_y_Eq_Cell{s};
end
end
%%Polynomial 2
XLChart.SeriesCollection(1).Trendlines.Add(Type_Poly,3);
XLChart.SeriesCollection(1).Trendlines(3).DisplayRSquared = 1;
Poly2_R_Squared = XLChart.SeriesCollection(1).Trendlines(3).DataLabel.text
XLChart.SeriesCollection(1).Trendlines(3).DisplayRSquared = 0;
XLChart.SeriesCollection(1).Trendlines(3).DisplayEquation = 1;
Poly2_y_Eq = XLChart.SeriesCollection(1).Trendlines(3).DataLabel.text
XLChart.SeriesCollection(1).Trendlines(3).DisplayEquation = 0;
Poly2_R_squared_Cell = regexp(Poly2_R_Squared,'[+-eE\d*\x\.]+','match');
Poly2_y_Eq_Cell = regexp(Poly2_y_Eq,'[+-eE\d*\x\.]+','match');
Poly2_R_squared_Num = str2num(Poly2_R_squared_Cell{length(Poly2_R_squared_Cell)});
% Gets rid of '=' sign from the first term of the equation in the cell and
% replaces the new value into the same position
NewLength = int8(length(Poly2_y_Eq_Cell)/2);
Temp = Poly2_y_Eq_Cell;
Poly2_y_Eq_Cell = cell(1,NewLength);
t=2;
for i=1:NewLength
Poly2_y_Eq_Cell{i} = Temp{t};
t=t+2;
end
if ~isempty(strfind(Poly2_y_Eq_Cell{1},'x'))
[xx yy] = find(Poly2_y_Eq_Cell{1} == 'x');
if (str2num(Poly2_y_Eq_Cell{1}(yy+1))+1) > NewLength
ExpMatch = [1:str2num(Poly2_y_Eq_Cell{1}(yy+1))+1];
Poly2_y_Eq_Cell_Temp = Poly2_y_Eq_Cell;
Poly2_y_Eq_Cell = cell(1,length(ExpMatch));
for i=1:length(ExpMatch)
Poly2_y_Eq_Cell{i} = '0';
end
for i=1:length(Poly2_y_Eq_Cell_Temp)
if ~isempty(strfind(Poly2_y_Eq_Cell_Temp{i},'x'))
[xx yy] = find(Poly2_y_Eq_Cell_Temp{i} == 'x');
PosIdx = (str2num(Poly2_y_Eq_Cell_Temp{i}(yy+1)));
if length(Poly2_y_Eq_Cell_Temp{i}) == yy;
Poly2_y_Eq_Cell{length(Poly2_y_Eq_Cell)-1} = Poly2_y_Eq_Cell_Temp{i};
else
Poly2_y_Eq_Cell{length(Poly2_y_Eq_Cell)-(PosIdx)} = Poly2_y_Eq_Cell_Temp{i};
end
else
Poly2_y_Eq_Cell{length(Poly2_y_Eq_Cell)} = Poly2_y_Eq_Cell_Temp{length(Poly2_y_Eq_Cell_Temp)};
end
end
end
end
Poly2_y_Eq_Cell_Final = cell(1,length(Poly2_y_Eq_Cell));
for s=1:length(Poly2_y_Eq_Cell)
if ~isempty(strfind(Poly2_y_Eq_Cell{s},'x'))
if strcmpi(Poly2_y_Eq_Cell{s}(1),'x')
Poly2_y_Eq_Cell_Final{s} = '1';
else
[xx yy] = find(Poly2_y_Eq_Cell{s} == 'x');
Poly2_y_Eq_Cell_Final{s} = Poly2_y_Eq_Cell{s}(1:yy-1);
end
else
Poly2_y_Eq_Cell_Final{s} = Poly2_y_Eq_Cell{s};
end
end
if Poly2_R_squared_Num <= Poly1_R_squared_Num
XLChart.SeriesCollection(1).Trendlines(2).DisplayRSquared = 1;
XLChart.SeriesCollection(1).Trendlines(2).DisplayEquation = 1;
Poly_y_Eq_Cell = cell(1,length(Poly1_y_Eq_Cell));
Poly_y_Eq_Cell = Poly1_y_Eq_Cell_Final;
Poly_R_Squared = Poly1_R_squared_Cell;
else
XLChart.SeriesCollection(1).Trendlines(3).DisplayRSquared = 1;
XLChart.SeriesCollection(1).Trendlines(3).DisplayEquation = 1;
Poly_y_Eq_Cell = cell(1,length(Poly2_y_Eq_Cell));
Poly_y_Eq_Cell = Poly2_y_Eq_Cell_Final;
Poly_R_Squared = Poly2_R_squared_Cell;
end
Equation = zeros(1,length(Poly_y_Eq_Cell));
for i=1:length(Poly_y_Eq_Cell)
Equation(1,i) = str2num(Poly_y_Eq_Cell{i});
end
PolySlope = polyder(Equation);
Equation = zeros(1,length(Lin_y_Eq_Cell_Final));
for i=1:length(Lin_y_Eq_Cell_Final)
Equation(1,i) = str2num(Lin_y_Eq_Cell_Final{1});
end
LinSlope = polyder(Equation);
Poly_Power = length(PolySlope)-1;
PolySlope_Str = '';
for i=1:length(PolySlope)
PolySlope_Temp = [num2str(PolySlope(i)) 'x' num2str(Poly_Power)];
if sign(PolySlope(i)) == -1
PolySlope_Str = [PolySlope_Str ' ' PolySlope_Temp];
else
PolySlope_Str = [PolySlope_Str ' + ' PolySlope_Temp];
end
Poly_Power = Poly_Power-1;
end
Lin_Power = length(LinSlope)-1;
LinSlope_Str = '';
for i=1:length(LinSlope)
LinSlope_Temp = [num2str(LinSlope(i)) 'x' num2str(Lin_Power)];
if sign(LinSlope(i)) == -1
LinSlope_Str = [LinSlope_Str ' ' LinSlope_Temp];
else
LinSlope_Str = [LinSlope_Str ' + ' LinSlope_Temp];
end
Lin_Power = Lin_Power-1;
end
  2 件のコメント
Image Analyst
Image Analyst 2012 年 10 月 19 日
You forgot to post the error message. Paste it exactly as it appears - don't paraphrase.
Mirage
Mirage 2012 年 10 月 25 日
There was no specific error, the error was that it just simply wouldn't graph and would return an empty string because I suppose the position where I added the chart was out of bounds or out of the dimensions of the excel sheet which I didn't think was possible. Maybe this question might be better paraphrased http://www.mathworks.com/matlabcentral/answers/51893-how-can-i-add-multiple-charts-in-excel-with-activex Thanks.

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File ExchangeSpreadsheets についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by