Matlab / ActiveX Excel - 将特定工作表复制到一个工作簿中

时间:2015-06-11 15:43:03

标签: excel matlab activex

我正在编写一些软件来平衡来自不同测量的许多数据点。我发现excel更适合处理偶尔的数据点(用户可以轻松查看和删除它)。

摄取测量值的脚本会生成.xlsx文件,并将格式化数据转储到带有序列号作为名称的工作表中,因此很容易明确引用该工作表。输出如下:

http://i.stack.imgur.com/wHgKN.png(抱歉,无法发布图片)

有5-50个工作簿,这些工作簿将以此格式复制。目标工作簿有一个空白表“开始”和一个空白表“完成”,后面是一个表单“summary1”,它通过=AVERAGE(start:finish!B53)和许多类似命令的开始 - 结束进行平均。

我使用matlab代码

Excel = actxserver('excel.application');
Excel.Visible = 1;
[ AVGWBFilename, AVGWBPath ] = uigetfile('path\*.xlsx','Locate Average Spreadsheet','MultiSelect','off');
AVGWBLoc = strcat(AVGWBPath,AVGWBFilename);
AVGWB = Excel.Workbooks.Open(AVGWBLoc); % get filename and path of average workbook, then open
LensDirectories = regexp(genpath(AVGWBPath),['[^;]*'],'match');

让用户选择要复制到的工作簿。 LensDirectories单元格数组由子目录的目录填充,子目录包含我要复制的xlsx文件。然后他们通过:

for i = 2 : length(LensDirectories);
    tempdir = dir(LensDirectories{i});
    tempfile = tempdir(7,1).name;
    temppath = fullfile(LensDirectories{i},tempfile);
    LensNum = str2num(sprintf('%s',LensDirectories{i}(end-5:end)));
        eval(sprintf('Workbook_%d = Excel.Workbook.Open(temppath);',LensNum));
        eval(sprintf('LensSheet_%.0f = Workbook_%d.Sheets("%d");',i,LensNum,LensNum));

但这是我被卡住的地方。最终的嵌套sprintf生成一个工作字符串,但是eval会抛出一个错误“输入字符在MATLAB语句或表达式中无效”。 - 我认为这是由于字符串中的引号?

一旦工作簿打开,我应该能够创建一个变量来引用工作表,但我也坚持使用代码在工作簿之间成功复制。目标工作簿和源工作簿将对操作开放 - 我认为代码类似'Workbook_222045("222045").Copy Before:=AVGWB("finish")'Workbook_222045("222045").Copy(AVGWB("finish"),但我不知道visualbasic,这是我第一次使用ActiveX控件用matlab,所以我不知道该怎么做。

我还发现这个片段看起来更好,但索引取决于工作表编号,当填充平均xlsx工作簿时,工作表编号将更改为完成。

WS = Excel.ActiveWorkbook.Sheets;
WS.Item(1).Copy([],WS.Item(1)); %to copy after first sheet.
WS.Item(1).Copy([],WS.Item(WS.count)); % to keep duplicating, new sheet will be after all existing sheets. 

非常感谢任何帮助。

一切顺利,

布兰登

1 个答案:

答案 0 :(得分:0)

更新:已调试并找到解决方案,新的for循环如下。

for i = 2 : length(LensDirectories);
    tempdir = dir(LensDirectories{i});
    tempfile = tempdir(7,1).name;
    temppath = fullfile(LensDirectories{i},tempfile);
    LensNum = str2num(sprintf('%s',LensDirectories{i}(end-5:end)));
    eval(sprintf('Workbook_%d = Excel.Workbook.Open(temppath);',LensNum));
    eval(sprintf('Workbook_%d.ActiveSheet.Copy(AVGWB_finish);',LensNum));

它有一些限制,即保存平均工作簿时的活动工作表必须是完成工作表,但它现在可以正常工作。