首页 文章

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

提问于
浏览
0

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

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

http://i.stack.imgur.com/wHgKN.png(抱歉,还不能发布图片)

有5-50个工作簿,这些工作簿将以此格式进行复制 . 目标工作簿有一个空白工作表"start"和一个空白工作表"finish",后跟一个工作表"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会抛出错误"The input character is not valid in MATLAB statements or expressions." - 我认为这是由于字符串中的引号?

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

我也发现这个片段似乎更好,但索引取决于工作表编号,当填充平均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

    更新:已调试并找到解决方案,新的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));
    

    它有一些限制,即平均工作簿保存时的活动工作表 must 是完成工作表,但它现在是有用的 .

相关问题