在DELPHI中使用表单 - ActiveCell.Column返回错误的值

问题描述 投票:-1回答:2

我想从excel表中获取行数和列数。我目前正在使用此代码:

function TFprofiles.XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
    xlCellTypeLastCell = $0000000B;
var
    XLApp, Sheet: OLEVariant;
    RangeMatrix: Variant;
    x, y, k, r: Integer;            
begin
  Result:=False; 
  XLApp:=CreateOleObject('Excel.Application');
try     

    XLApp.Visible:=False;
    XLApp.Workbooks.Open(AXLSFile);

    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Select;

    y := XLApp.ActiveCell.Row;

    x := XLApp.ActiveCell.Column;

    AGrid.RowCount:=24;
    AGrid.ColCount:=x;     

    RangeMatrix := XLApp.Range['B2', XLApp.Cells.Item[y,x]];
    RangeMatrix := RangeMatrix.Value;

    (...)

end;

一切正常,除了这一行:

 x := XLApp.ActiveCell.Column;;

我的工作表有2个COLUMNS和ActiveCell.Column返回5,9,或除2之外的任何其他值!我选择并删除了其他单元格/列中的所有值

可能是什么问题?

谢谢!

excel delphi
2个回答
1
投票

您将Sheet定义为工作簿中的第一个工作表,然后在任何时候任意地决定是否打扰使用它。

Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

y := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row;
x := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Column;

...     

RangeMatrix := Sheet.Range['B2', Sheet.Cells.Item[y,x]];

在尝试避免使用xlApp时,我用Sheet替换了几次.Select。如果这不完美,那是因为我没有德尔福,但你应该得到一般的想法。


0
投票

我发现它不是乱用“... SpecialCells(xlCellTypeLastCell ......”)。

像这样使用“UsedRange”更容易>>

x := Sheet.UsedRange.Rows.Count;
y := Sheet.UsedRange.Columns.Count;

SpecialCells的问题在于您无法在受保护的工作表上使用它。

© www.soinside.com 2019 - 2024. All rights reserved.