procedure TForm1.Button1Click(Sender: TObject);  var  ExcelAll,ExcelPart :  OleVariant;
          MaxRowAll,MaxColAll,MaxRowPart,MaxColPart,I,J :  integer;
begin
      try
      begin
          ExcelAll := CreateOLEObject('Excel.Application');
          ExcelPart := CreateOLEObject('Excel.Application');
      end;
      except
          ShowMessage('Excel没有安装');
          Exit;
      end;
      try
          ExcelAll.WorkBooks.Open(DBEditEh1.Text);
          MaxRowAll:=ExcelAll.WorkSheets[1].UsedRange.Rows.Count;
          MaxColAll:=ExcelAll.WorkSheets[1].UsedRange.Columns.Count;          ExcelPart.WorkBooks.Open(DBEditEh2.Text);
          MaxRowPart:=ExcelPart.WorkSheets[1].UsedRange.Rows.Count;
          MaxColPart:=ExcelPart.WorkSheets[1].UsedRange.Columns.Count;          ProgressBar1.Max :=  MaxRowPart ; //进度条
          ProgressBar1.Position :=1 ;          I:=1;
          while  i<= MaxRowPart do
          begin
            J:=1;
            while J <=MaxRowAll do
            begin
              if ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value then
                  ExcelAll.Cells[i,MaxColAll+1].value :='T';
              J :=J+1 ;
            end ;
            ProgressBar1.Position := ProgressBar1.Position +1 ;
            I := I+1 ;
          end;      finally
        begin
          ExcelAll.ActiveWorkBook.Save  ;
          Excelall.Visible   :=   True;          ExcelPart.WorkBooks.Close ;
          ExcelPart.Quit;       end;      end;
end;

解决方案 »

  1.   

    下面——
    ExcelAll.Cells[i,MaxColAll+1].value :='T'; 
    这个会出现重复给Cells[i,MaxColAll+1]赋值T的动作,因该加上Break;
    修改后——红色字体
              I:=1; 
              while  i <= MaxRowPart do 
              begin 
                J:=1; 
                while J <=MaxRowAll do 
                begin 
                  if ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value then 
                  begin
                      ExcelAll.Cells[i,MaxColAll+1].value :='T'; 
                      Break; // 避免重复给Cells[i,MaxColAll+1]赋值T的动作
                  end; 
                  J :=J+1 ; 
                  Application.ProcessMessages; // 不会造成假死机,用于循环语句。
                end ; 
                ProgressBar1.Position := ProgressBar1.Position +1 ; 
                I := I+1 ; 
                Application.ProcessMessages; // 不会造成假死机,用于循环语句。
              end; 
      

  2.   

    如果加上"Break; // 避免重复给Cells[i,MaxColAll+1]赋值T的动作 "有可能表A有两条以上相同记录,加上break后,后面的这边记录就不能写入"T"了
      

  3.   


    你研究下你的语句,你是在J的循环中,给Cells[i,MaxColAll+1]赋值
                while J <=MaxRowAll do 
                begin 
                  if ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value then 
                      ExcelAll.Cells[i,MaxColAll+1].value :='T'; 
                  J :=J+1 ; 
    假设J=1时,ExcelAll.Cells[1,1].value = ExcelPart.Cells[I,1].value,
    那么,ExcelAll.Cells[i,MaxColAll+1].value :='T'
    然后J=J+1=1+1=2,这时,ExcelAll.Cells[2,1].value = ExcelPart.Cells[I,1].value,
    那么,ExcelAll.Cells[i,MaxColAll+1].value :='T'
    这个不是就重复赋值了么?
    所以,就加上Break;
    如果,你是给ExcelAll.Cells[J,MaxColAll+1].value :='T'; 
    那么,Break;就不能加上了。
      

  4.   

    谢谢你的提醒,我是本意是ExcelAll.Cells[J,MaxColAll+1].value :='T'; 修改后代码如下:
    速度不是这样慢!
    procedure TForm1.Button1Click(Sender: TObject);  var  ExcelAll,ExcelPart :  OleVariant;
              MaxRowAll,MaxColAll,MaxRowPart,MaxColPart,I,J :  integer;
    begin
          try
          begin
              ExcelAll := CreateOLEObject('Excel.Application');
              ExcelPart := CreateOLEObject('Excel.Application');
          end;
          except
              ShowMessage('Excel没有安装');
              Exit;
          end;
          try
              ExcelAll.WorkBooks.Open(DBEditEh1.Text);
              MaxRowAll:=ExcelAll.WorkSheets[1].UsedRange.Rows.Count;
              MaxColAll:=ExcelAll.WorkSheets[1].UsedRange.Columns.Count;          ExcelPart.WorkBooks.Open(DBEditEh2.Text);
              MaxRowPart:=ExcelPart.WorkSheets[1].UsedRange.Rows.Count;
              MaxColPart:=ExcelPart.WorkSheets[1].UsedRange.Columns.Count;          ProgressBar1.Max :=  MaxRowPart ; //进度条
              ProgressBar1.Position :=1 ;          I:=1;
              while  i<= MaxRowPart do
              begin
                J:=1;
                while J <=MaxRowAll do
                begin
                  if ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value then
                      ExcelAll.Cells[J,MaxColAll+1].value :='T';
                  J :=J+1 ;
                  Application.ProcessMessages;
                end ;
                ProgressBar1.Position := ProgressBar1.Position +1 ;
                I := I+1 ;
                Application.ProcessMessages;
              end;      finally
            begin
              ExcelAll.ActiveWorkBook.Save  ;
              Excelall.Visible   :=   True;          ExcelPart.WorkBooks.Close ;
              ExcelPart.Quit;       end;      end;
    end;
      

  5.   

    OLE效率太低了,转用ADO,速度还算可以,代码如下:procedure TForm1.Button1Click(Sender: TObject);
      var ConnStrPart,ConnStrAll : String ;
      Var I : Integer ; //统计配对笔数。
    begin
      ConnStrAll :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBEditEh1.Text
          +';Extended Properties=Excel 8.0;Persist Security Info=False';
      ConnStrPart :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBEditEh2.Text
          +';Extended Properties=Excel 8.0;Persist Security Info=False';  AdoAll.ConnectionString := ConnStrAll ;
      AdoPart.ConnectionString := ConnStrPart ;
      
      AdoPart.Open;
      AdoAll.Open;  I :=0 ;
      AdoPart.First;
      cxProgressBar1.Properties.Max := AdoPart.RecordCount ;  //进度条  while not AdoPart.Eof do
      begin
         AdoAll.First;
         while not AdoAll.Eof do
         begin
           if AdoAll.Fields[0].Value = AdoPart.Fields[0].Value then
           begin
              AdoAll.Edit;
              AdoAll.Fields[6].Value := 'T';
              AdoAll.Post;
              I := I+1 ;
           End;
           Application.ProcessMessages;
           AdoAll.Next ;
         end;   cxProgressBar1.Position :=AdoPart.RecNo  ;  //进度条   Application.ProcessMessages;
       AdoPart.Next ;
      end;   AdoPart.Close;
       AdoAll.Close ;
       ShowMessage('数据处理完成,共成功'+IntToStr(I)+ '笔。');
    end;
      

  6.   

    呵呵,我也学习了。
    谢谢你!
    我来试试ADO模式……