我正在尝试将此Excel VBA代码转换为Delphi:
ActiveSheet.Rows(r & ":5000").WrapText = True
ActiveSheet.Rows(r & ":5000").AutoFit
但是在Delphi Excel2010
的{{1}}单元中,它是一个对象,而不是函数或数组对象,我也找不到任何_Worksheet.Rows
属性或类似属性。
Items
编译器消息为:
uses
Excel2010;
procedure Test;
var
Sheet: ExcelWorksheet;
R: Integer;
begin
R := 3;
Sheet.Rows[R.ToString + ':5000'].WrapText := True;
// Sheet.Rows.WrapText := True;
end;
VBA代码的正确翻译是什么?
如何在Excel中访问特定范围的行?
答案 0 :(得分:3)
使用早期绑定,请选择A
列(行3..5000)并使用EntireRow
,例如:
uses Excel2010;
procedure TForm14.Button1Click(Sender: TObject);
var
Excel: ExcelApplication;
Wbook: ExcelWorkbook;
Sheet: ExcelWorksheet;
begin
Excel := CoExcelApplication.Create;
Wbook := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
Sheet := Wbook.ActiveSheet as ExcelWorksheet;
Excel.Visible[LOCALE_USER_DEFAULT] := True;
Sheet.Range['A3','A5000'].EntireRow.WrapText := True;
Sheet.Range['A3','A5000'].EntireRow.AutoFit;
//...
end;
答案 1 :(得分:3)
问题是,如果您使用早期绑定(例如,使用CoExcelApplication.Create)从Delphi中使用Excel,则您 正在使用Excel公开的原始接口,而不是变体 您可以使用后期绑定(使用CreateOleObject('Excel.Application'))进行工作。
这两种方法都有其长处,尽早进行绑定对于提高速度和发挥优势是最好的 Delphi的类型检查和代码完成的内容,而后期绑定则很有用 为了避免必须指定具有 很多。
在Excel_Tlb(或任何称为Excel导入单元的东西)中,也许是思考的最佳方法
Rows
接口的_Worksheet
成员的函数是作为一个函数返回
与ExcelRange对象的Dispinterface。返回ExcelRange接口的成员采用两个参数,它们指定定义范围的左上角和右下角单元格。因此,一种按照自己的方式做事的方法
问以下内容:
这就是您要使用和使用的Item
属性的原因。
procedure TDefaultForm.TestRange;
var
WB : _Workbook;
vWB,
vRange,
vSheet : OleVariant;
Sheet: _Worksheet;
Range : ExcelRange;
begin
lcid := LOCALE_USER_DEFAULT;
Excel := CoExcelApplication.Create;
Excel.Visible[LOCALE_USER_DEFAULT] := True;
WB := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
Sheet := WB.ActiveSheet as ExcelWorksheet;
Range := Sheet.Range['A1', 'B2'];
Range.RowHeight := 33;
Range.Item[1, 1] := 'some text long enough to wrap';
Range.Item[1, 1].WrapText := True;
Range.Item[1, 2] := 'more text long enough to wrap';
Range.Item[2, 2] := 'other text long enough to wrap';
// The following shows how to use the special syntax for passing arguments
// in late-binding
Excel.DisplayAlerts[LOCALE_USER_DEFAULT] := False; // suppresses "Overwrite?" prompt if file already exists
vWB := WB;
// Compare the following with what you would need if you called WB.SaveAs()
vWB.SaveAs(FileName := ExtractFilePath(Application.ExeName) + 'Test.Xlsx');
// some things using late binding
vSheet := Sheet;
vRange := vSheet.Range['c3'];
vRange.Value := 'some value';
vRange := vSheet.Range['d3:e4'];
vRange.Value := 'another value';
// retrieve the ExcelRange object from the vRange variant
Range := IDispatch(vRange) as ExcelRange;
end;
答案 2 :(得分:1)
这里是如何使用ExcelRange的示例
var
lcid: Integer;
Range: ExcelRange;
Worksheet: _WorkSheet;
Row: Integer;
begin
lcid := LOCALE_USER_DEFAULT;
Wbk := ExcelApplication1.Workbooks.Open(Filename,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,lcid);
WorkSheet := Wbk.Worksheets.Item['Sheet1'] as _Worksheet;
WorkSheet.Activate(lcid);
Row := 1;
Range := WorkSheet.Range['A'+IntToStr(row), 'F'+IntToStr(row)];
Range.Insert(xlShiftDown, xlFormatFromLeftOrAbove); // shift down and copy
WorkSheet.Cells.Item[row, 6] := edtVatRate.Value;
end;