当Excel单元格值为 #Null! 时,读这个单元格就会出错..怎么处理啊?
  请指点下,谢谢.

解决方案 »

  1.   

    具体什么错?delphi接收的值是不是用Variant? 估计是类型转换出的错吧 可以先用  VarIsNull 方法判断一下。
      

  2.   

      具体情况是这样的:
      Excel表格里,单元格A1里的填写的可能是任意字符串,也可能是 #Null!;
      我将单元格的值读出来赋值给的s(s: String; s := ExcelApp.Cells[1, 1].Value);
      A1值为 #Null! 时就提示错误了,其它字符串则运行正常.
      

  3.   

      然后,我试了用变体类型.
      v: Variant; 
      v := ExcelApp.Cells[1, 1].Value;
      if not(VarIsNull(v)) then
        s := ExcelApp.Cells[1, 1].Value;
      依然出错.  还有,
      祝你节日快乐!!!!
      

  4.   

    我试了一下,没有出现你所说的问题:procedure TForm1.Button1Click(Sender: TObject);
    var
      ExcelApplication1: TExcelApplication;
      WorkBk : _WorkBook;
      WorkSheet : _WorkSheet;
      x,y : integer;
      RangeMatrix: Variant;
      OpenDialog1: TOpenDialog;
      iRE: integer;  item_no: String;
      item_name: String;
    begin
      OpenDialog1:=TOpenDialog.Create(nil);
      ExcelApplication1:=TExcelApplication.Create(nil);
      try
        //记得在uses中引入文件EXCEL2000这个单元
        OpenDialog1.FileName:='*.csv;*.xls';
        if not OpenDialog1.Execute then
        begin
          exit;
        end;    try
          ExcelApplication1.Connect;
        except
          Application.Messagebox('连接Excel失败,请重试!','提示',MB_ICONERROR);
          exit;
        end;
        try
          ExcelApplication1.Visible[0]:=false;
          Excelapplication1.Workbooks.Open(OpenDialog1.FileName,null,null,null,null,null,null,null,null,null,null,null,null,0);
          WorkBk  := ExcelApplication1.WorkBooks.Item[1];
          WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
          WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
          X := Excelapplication1.ActiveCell.Row;
          Y := Excelapplication1.ActiveCell.Column;
          RangeMatrix := Excelapplication1.Range['A1',Excelapplication1.Cells.Item[X,Y]].Value;
          //for iRE:=2 to X do
          for iRE:=2 to X do
          begin
            //从Excel开始取信息
            Item_NO := Trim(RangeMatrix[iRE,1]);
            item_name := Trim(RangeMatrix[iRE,2]);
            Memo1.Lines.Add(item_no+'    /     '+item_name);
            Application.ProcessMessages;
          end;
        except
          messagebox(handle,'出错','提示',MB_ICONERROR);
          exit;
        end;
      finally
        ExcelApplication1.Disconnect;
        ExcelApplication1.Quit;
        ExcelApplication1.Free;
        OpenDialog1.Free;
      end;
      

  5.   

    try
     s := ExcelApp.Cells[1, 1].Value); 
    except 
     s:='#Null!';
    end;
      

  6.   

      zxf_feng,
      你好!
    我做了一段简单的代码,访问也是出错.
    请你帮我看看是什么问题:当Excel表格A1所填的是'#Null!'以外的字符串时,可以正常Show出,'#Null!'时提示错误.
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ComObj, ComCtrls, ExtCtrls, ImgList, fcButton,
      ExcelXP, jpeg, Variants;procedure TForm1.Button1Click(Sender: TObject);
    var
      S: String;
      ExcelApp: Variant;
      Path: String;
    begin
        if not OpenDialog1.Execute then
        begin
          exit;
        end;
        Path := OpenDialog1.FileName; { 返回選擇的EXCEL文件路徑 }
        ExcelApp := CreateOleObject('Excel.Application');
        ExcelApp.WorkBooks.Open(Path);
        s := ExcelApp.Cells[1, 1].Value;
        ExcelApp.WorkBooks.Close;
        ExcelApp.Quit;
        ShowMessage(s);
    end;
      

  7.   

    上面我已经给你写好了,没看见吗,再给你写一下,你看着啊
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: String;
      ExcelApp: Variant;
      Path: String;
    begin
        if not OpenDialog1.Execute then
        begin
          exit;
        end;
        Path := OpenDialog1.FileName; { 返回選擇的EXCEL文件路徑 }
        ExcelApp := CreateOleObject('Excel.Application');
        ExcelApp.WorkBooks.Open(Path);
        try
        s := ExcelApp.Cells[1, 1].Value;
        except
        s:='#Null!';
        end;
        ExcelApp.WorkBooks.Close;
        ExcelApp.Quit;
        ShowMessage(s);
    end;
      

  8.   

    #Null!在excel里是出错信息,其类型不定,所以直接把它赋给一个字符串肯定要出问题的,所以在这种情况下,最后用try except,它既然给你出错信息,你就用错误处理语句处理,我觉的也是未尝不可的,何必一个根绳上吊死,非要求个了丑寅卯来呢?
      

  9.   

    tryexceptend;
    你说的也对,我目前就是用这种方法。
    如果我只停留在try except就不用上来这里寻求答案了。