我正在为Delphi XE6中的Excel编写插件。我不得不复制"从一张纸到另一张纸的行。挑战在于我的操作比我想象的要花费更长的时间。例如,要将500张(23列)从一张纸复制到另一张,需要28秒左右......
部分挑战是我必须逐行处理。我有一个INT数组,每行一个INT。 INT值告诉我是否需要复制该行...
...for loop i ... through entire array....
...if row I am interested in...
// Set the Original Sheet Active
MasterOrigSheet.Select;
// Build my row numbers
SourceRangeCell := 'A' + IntToStr(i);
DestRangeCell := 'A' + IntToStr(DestRowNumber);
// Copy the row from source to destination
MasterOrigSheet.Range[SourceRangeCell, SourceRangeCell].EntireRow.Copy
(NewSheet.Range[DestRangeCell, DestRangeCell].EntireRow);
Inc(DestRowNumber);
有更快的方法吗?我正在复制整行。我没有使用COPY / PASTE缓冲区......任何帮助或想法都很受欢迎。
答案 0 :(得分:9)
目标是限制您需要对Excel进行的调用次数。
为此,请利用Worksheet.Range
属性接受单个字符串中的多个单元格这一事实。使用union运算符(逗号)一次描述多个单元格。也就是说,在循环中,构建一个以逗号分隔的要复制的单元格列表。然后致电Range
以获取范围参考,并在该单一范围内使用EntireRow.Copy
。
另外,避免重复不需要做的工作。例如,原始工作表应在整个循环中保持选中状态,因此您无需继续告诉Excel在每次迭代时选择它。即使操作没有净效应,您的程序仍然需要完成打包COM调用并将其传递给Excel的工作。