如何在Excel中访问一系列行?

时间:2018-09-24 10:50:14

标签: excel delphi delphi-10.1-berlin

我正在尝试将此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中访问特定范围的行?

3 个答案:

答案 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;