Delphi-Excel-如何加速操作

Delphi-Excel-如何加速操作,excel,performance,delphi,Excel,Performance,Delphi,我正在用DelphiXe6编写Excel插件。我不得不将行从一张纸“复制”到另一张纸。挑战在于,我的手术时间比我想象的要长得多。例如,将500行(23列)从一张图纸复制到另一张图纸需要28秒左右 部分挑战是我必须逐行处理。我有一个INT数组,每行一个INT。INT值告诉我是否需要复制该行 ...for loop i ... through entire array.... ...if row I am interested in... // Set the Original She

我正在用DelphiXe6编写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);

有没有更快的方法?我正在复制整行。我没有使用复制/粘贴缓冲区。。。感谢任何帮助或想法。

目标是限制您需要拨打Excel的电话数量

为此,请充分利用
Worksheet.Range
属性在一个字符串中接受多个单元格这一事实。使用联合运算符(逗号)一次描述多个单元格。也就是说,在循环中,建立一个以逗号分隔的要复制的单元格列表。然后调用
Range
获取范围引用,并在单个范围上使用
EntireRow.Copy


另外,避免重复不需要做的工作。例如,在整个循环中,原始工作表应该保持选中状态,因此您不需要一直告诉Excel在每次迭代中选择它。即使该操作没有净效果,您的程序仍然需要完成打包COM调用并将其发送到Excel的工作。

最快的方法是调用
Copy
一次。在单个范围内指定整个源代码,并对其调用
Copy
。@@David,在600行中,我可能需要第1、2、4、5、7、8、9、13、14、17行。。。基本上我会做大部分,但我肯定会跳过一些/许多。。。我的行不是连续的。我找不到任何方法来定义这样的范围…这是我唯一可以调用COPY一次的方法,对吗?你不能选择多行吗?如果在Excel中,按住控制键并选择第二个区域,效果相同。或者只复制所有行,然后删除不需要的行want@Zibelas,我怀疑这会带来很大的改善。我强烈怀疑这个操作中的主要时间消耗不是从一个工作表到下一个工作表的实际数据复制,而是正在进行的COM调用的数量。如果我是对的,那么你的建议只会在复制超过50%的行时改善情况。Rob,我喜欢这个想法,但我找不到任何语法允许这样做。我试过我的范围:=sheet.range[A5..H5 A6..H6];MyRange:=表范围[A5:H5 A6:H6];MyRange:=表范围[A5 H5 A6 H6];和MyRange:=表范围单元格[A5 H5 A6 H6];我知道我可以使用UNION命令,但似乎无法使UNION运算符(空格)起作用。我说要构建一个字符串:
sheet.range['A5 A7 A9']。EntireRow
要创建一个包含三个非相邻行的范围。但这仍然不起作用。工作表。范围为['A5,A6']。EntireRow有效。很好。如果我把它改成。。。表.范围['A5 A6'].整个流程;它进行编译,但在运行时抛出COM错误。在行列表之间使用空格是无效的语法(据我所知)。顺便说一下,我正在运行Excel 2013。对不起。我一定是看错了什么。空格运算符用于交叉点。逗号运算符表示并集。用逗号,这样就行了。。。表.范围['A5,A7,A9'].整条线;非常感谢。我查看了Excel的开发人员文档,但找不到对该语法的任何引用。你在哪里找到的?