我正在编写一些软件来平衡来自不同测量的许多数据点。我发现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.
非常感谢任何帮助。
一切顺利,
布兰登
答案 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));
它有一些限制,即保存平均工作簿时的活动工作表必须是完成工作表,但它现在可以正常工作。