Если вы, скопировав диапазон в Excel, посмотрите содержимое буфера обмена, то увидите, что в буфере данные представлены как текст, в котором содержимое ячеек разделено табуляциями. Можно плясать от этого...
Вот вариант процедуры, с помощью которой можно вставить из буфера данные, скопированные из Excel. Вставка в StringGrid производится начиная от той ячейки, в которой сейчас установлен курсор.
Код:
procedure TForm1.DoClipbrdPaste;
var
ClipbrdData: TStringList;
ClipbrdRow: TStringList;
i, j, RowCnt: Integer;
begin
if not Clipboard.HasFormat(CF_TEXT) then Exit;
ClipbrdData := TStringList.Create;
ClipbrdRow := TStringList.Create;
try
ClipbrdData.Text := Clipboard.AsText;
RowCnt := ClipbrdData.Count;
// если не вмещается, увеличиваем число строк в StringGrid
if StringGrid1.RowCount - StringGrid1.Row < RowCnt then
StringGrid1.RowCount := RowCnt + StringGrid1.Row;
for i := 0 to RowCnt - 1 do
begin
ClipbrdData.Strings[i] := '"' + ClipbrdData.Strings[i] + '"';
ClipbrdData.Strings[i] := StringReplace(ClipbrdData.Strings[i], #9,
'"'#9'"', [rfReplaceAll]);
end;
ClipbrdRow.Delimiter := #9;
ClipbrdRow.DelimitedText := ClipbrdData.Strings[0];
// проверяем число столбцов в StringGrid. Если что, добавляем
if StringGrid1.ColCount - StringGrid1.Col < ClipbrdRow.Count then
StringGrid1.ColCount := ClipbrdRow.Count + StringGrid1.Col;
for i := 0 to RowCnt - 1 do
begin
ClipbrdRow.DelimitedText := ClipbrdData.Strings[i];
for j := 0 to ClipbrdRow.Count - 1 do
StringGrid1.Cells[j + StringGrid1.Col, i + StringGrid1.Row] := ClipbrdRow.Strings[j];
end;
finally
ClipbrdData.Free;
ClipbrdRow.Free;
end;
end;
// вставка в StringGrid по нажатию в нём Ctrl+V
procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = 86) and (ssCtrl in Shift) then DoClipbrdPaste();
end;
P.S. Если будете использовать, не забудьте подключить модуль Clipbrd в
uses.