无法得到Delphisorting与Excel工作

我正在编写Delphi 10 / Seattle中的程序来控制Excel 2013.我需要根据列进行sorting。 该列有标题。 当我的代码编译时,实际的SORT命令给出错误'不能将types(错误)的变体转换为types(布尔)“。 总之,我有一个参数错误,但我不能确定WHICH参数。 我已经通过MS语法(下面列出的URL),但无法find任何错误。 这是一个显示问题的工作示例。 我DID生成我自己的types库,这是在USES子句中。

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ComObj, Excel_TLB; .. procedure TForm1.Button2Click(Sender: TObject); var oExcel : ExcelApplication; RawDataSheet :_Worksheet; myChart: Shape; begin oExcel := CreateOleObject('Excel.Application') as ExcelApplication; oExcel.Visible[LOCALE_USER_DEFAULT] := True; // Add a New Workbook, with a single sheet oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); // Get the handle to the active Sheet, and insert some dummy data RawDataSheet := oExcel.ActiveSheet as _Worksheet; RawDataSheet.Range['A1', 'F10'].value2 := 10; RawDataSheet.Sort.SortFields.Clear; // Now actually do the sort... // SYNTAX at https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.sort.aspx RawDataSheet.UsedRange[LOCALE_USER_DEFAULT].Sort ( RawDataSheet.Range['A1:A10', EmptyParam], xlAscending, // Key1, Order1 EmptyParam, EmptyParam, xlAscending, // key2, Type_, Order2 EmptyParam, xlAscending, // key3, Order3 xlYes, EmptyParam, False, xlSortRows, // Header, OrderCustom, MatchCase, Orientation xlPinYin, EmptyParam, EmptyParam, EmptyParam); // Sort, Data Option1, Data Option2, Data Option3 end; 

有不止一个违规参数。 他们有什么问题是他们不喜欢EmptyParam ,虽然这是我们应该传递一个未使用的可选参数。

由于两个原因很难定位哪一个。 其中一个就是,当你使用后期绑定的时候,你提供参数的方式工作得很好。 另一个是误导性的错误信息:

…带有消息的EVariantTypeCastError'无法将types(错误)的变体转换为types(布尔)“。

EmptyParam是设置为varErrortypes的变体,所以第一部分build议我们应该怀疑EmptyParam 。 转换为布尔值失败,那么我们要查找的是一个EmptyParamparameter passing给一个可选的布尔参数。 不幸的是,没有什么,甚至没有什么布尔样。 事实上,任何一个“DataOption”枚举都会导致上述错误信息。

这是一个可能的系统方法,可能有助于find一个可行的解决scheme:

  • 先使用后期绑定,按要求传递尽可能less的参数。
  • EmptyParam填充所有剩下的参数,testing,然后调用早期绑定。
  • 从右向左,将未使用的可选参数replace为实际值,直到出现不同的错误或使其工作。

这是我的工作示例:

 procedure TForm1.Button1Click(Sender: TObject); var oExcel : ExcelApplication; RawDataSheet :_Worksheet; begin oExcel := CreateOleObject('Excel.Application') as ExcelApplication; oExcel.Visible[LOCALE_USER_DEFAULT] := True; // Add a New Workbook, with a single sheet oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); // Get the handle to the active Sheet, and insert some dummy data RawDataSheet := oExcel.ActiveSheet as _Worksheet; RawDataSheet.Range['A1', 'F1'].value2 := 'head'; RawDataSheet.Range['A2', 'F2'].value2 := 8; RawDataSheet.Range['A3', 'F3'].value2 := 17; RawDataSheet.Range['A4', 'F4'].value2 := 4; RawDataSheet.Range['A5', 'A5'].value2 := 10; RawDataSheet.Range['B5', 'F5'].Value2 := 11; RawDataSheet.Range['A6', 'F6'].value2 := 7; RawDataSheet.Range['A7', 'F7'].value2 := 1; RawDataSheet.Range['A8', 'F8'].value2 := 2; RawDataSheet.Range['A9', 'A9'].value2 := 10; RawDataSheet.Range['B9', 'B9'].value2 := 11; RawDataSheet.Range['C9', 'F9'].value2 := 9; RawDataSheet.Range['A10', 'F10'].value2 := 10; RawDataSheet.Sort.SortFields.Clear; // Now actually do the sort... // SYNTAX at https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.sort.aspx RawDataSheet.UsedRange[LOCALE_USER_DEFAULT].Sort (RawDataSheet.Range['A1', 'A10'], xlAscending, RawDataSheet.Range['B1', 'B10'], EmptyParam, xlAscending, RawDataSheet.Range['C1', 'C10'], xlAscending, xlYes, NULL, False, xlSortColumns, xlPinYin, xlSortNormal, xlSortNormal, xlSortNormal); end; 

最后我很高兴Type参数没有抱怨传递一个EmptyParam因为我不明白它是什么。

老答案如下:


我使用IDispatch / Invoke路由testing了你的参数,后期绑定,尽pipe失去了一些性能和types安全性,但它通常具有更高的工作可能性。 他们都没有错,我也testing了其他键。 虽然参数没有错误,但如果使用早期绑定,excel会引发错误。 这是一个工作的例子:

 procedure TForm1.Button1Click(Sender: TObject); var oExcel : ExcelApplication; RawDataSheet :_Worksheet; V: OleVariant; // Range begin oExcel := CreateOleObject('Excel.Application') as ExcelApplication; oExcel.Visible[LOCALE_USER_DEFAULT] := True; // Add a New Workbook, with a single sheet oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); // Get the handle to the active Sheet, and insert some dummy data RawDataSheet := oExcel.ActiveSheet as _Worksheet; RawDataSheet.Range['A1', 'F1'].value2 := 'head'; RawDataSheet.Range['A2', 'F2'].value2 := 8; RawDataSheet.Range['A3', 'F3'].value2 := 17; RawDataSheet.Range['A4', 'F4'].value2 := 4; RawDataSheet.Range['A5', 'A5'].value2 := 10; RawDataSheet.Range['B5', 'F5'].Value2 := 11; RawDataSheet.Range['A6', 'F6'].value2 := 7; RawDataSheet.Range['A7', 'F7'].value2 := 1; RawDataSheet.Range['A8', 'F8'].value2 := 2; RawDataSheet.Range['A9', 'A9'].value2 := 10; RawDataSheet.Range['B9', 'B9'].value2 := 11; RawDataSheet.Range['C9', 'F9'].value2 := 9; RawDataSheet.Range['A10', 'F10'].value2 := 10; RawDataSheet.Sort.SortFields.Clear; { // Now actually do the sort... // SYNTAX at https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.sort.aspx RawDataSheet.UsedRange[LOCALE_USER_DEFAULT].Sort ( RawDataSheet.Range['A1:A10', EmptyParam], xlAscending, // Key1, Order1 EmptyParam, EmptyParam, xlAscending, // key2, Type_, Order2 EmptyParam, xlAscending, // key3, Order3 xlYes, EmptyParam, False, xlSortRows, // Header, OrderCustom, MatchCase, Orientation xlPinYin, EmptyParam, EmptyParam, EmptyParam); // Sort, Data Option1, Data Option2, Data Option3 } V := RawDataSheet.Range['A1', 'F10']; V.Sort(RawDataSheet.Range['A1:A10', EmptyParam], xlAscending, RawDataSheet.Range['B1', 'B10'], EmptyParam, xlAscending, RawDataSheet.Range['C1', 'C10'], xlAscending, xlYes, EmptyParam, False, xlSortColumns, xlPinYin, EmptyParam, EmptyParam, EmptyParam); end; 

我认为你有一些不符合所需的参数。 你应该试试

 RawDataSheet.UsedRange.Sort (RawDataSheet.Range['A1:A10'], xlAscending, // Key1, Order1 EmptyParam, xlAscending, // key2, Type_, Order2 EmptyParam, xlAscending, // key3, Order3 xlYes, EmptyParam, EmptyParam, xlSortRows, // Header, OrderCustom, MatchCase, Orientation EmptyParam, EmptyParam, EmptyParam, EmptyParam); // Sort, Data Option1, Data Option2, Data Option3 

删除所有不清楚的参数并将其replace为Emptyparam,甚至“真”或“假”有时可能不清楚,有时我不得不在Delphi代码中使用“wordbool(1)”或“msotrue”