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;
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;
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;
你研究下你的语句,你是在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;就不能加上了。
速度不是这样慢!
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;
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;
谢谢你!
我来试试ADO模式……