Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2013, 13:29   #1
fcdk_pavel
 
Регистрация: 13.09.2013
Сообщений: 8
По умолчанию Редактирование в EXCEl

Есть программа делающая некие расчеты, потом сохраняет их в Эксель, после заполнения файла Эксель (конец месяца) делает отчет за месяц(суммирует результаты).
Как сделать корректировку данных в Эксель документе(если допущена ошибка при вводе данных для расчета) за определенный день с последующим сохранением в тот же файл Эксель на тоже место(например ошибка была допущена 5сентября, (а сейчас 25 сентября) нужно пересчитать результаты расчета с откорректированными данными и записать на тоже место где была запись 5 сентября)Дату ввожу с помощью Сombobox(месяц), Edit(число месяца)

вот код записи результата в файл Эксель
Код:
function SgToExcel(aSg : TStringGrid; aExSh : Variant; const aCol : Integer) : Variant;
const
  //Идентификатор типа ячейки в диапазоне - последняя (справа внизу) ячейка диапазона.
  xlCellTypeLastCell = 11;
var
  exCell, exRng : Variant;
  vArr : Variant;
  i, j, Row : Integer;
begin
  Result := Unassigned;
 
  //Создаём вариантный массив с размером, соответствующим размеру таблицы.
  vArr := VarArrayCreate([1, aSg.RowCount, 1, aSg.ColCount], varOleStr);
  //Записываем в вариантный массив данные таблицы.
  for i := 1 to aSg.RowCount do
  for j := 1 to aSg.ColCount do
    vArr[i, j] := aSg.Cells[j - 1, i - 1];
  //Определяем номер строки, которая расположена непосредственно ниже
  //используемого диапазона.
  Row := aExSh.UsedRange.SpecialCells(xlCellTypeLastCell).Row;
  //Определяем ячейку, начиная с которой мы запишем данные таблицы.
  exCell := aExSh.Cells[Row, aCol];
  //На листе MS Excel формируем диапазон, в который будут записаны данные.
  exRng := aExSh.Range[exCell,exCell.Offset[aSg.RowCount - aSg.FixedRows  - 1, aSg.ColCount - 1]];
  //Записываем данные вариантного массива в диапазон.
  exRng.Value := vArr;
 
  //Диапазон, в который записаны данные.
  Result := exRng;
end;
 
//Запись данных на лист MS Excel.
procedure TForm7.Button1Click(Sender: TObject);
const
  //Толщина линий.
  xlThin = 2;
  xlMedium = -4138;
  //Вид линии.
  xlContinuous = 1; //Непрерывная линия.
var
  exApp, exBook, exSh, exRng : Variant;
  i : Integer;
  Sg : TStringGrid;
  Od : TOpenDialog;
begin
  Sg := StringGrid1;
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if FileExists(Od.FileName) then begin
    i := MessageBox(0, PChar('Файл с заданным именем уже существует.'
      + ' Его данные будут изменены. Продолжить?'),
    'Перезаписать?', MB_YESNO + MB_ICONQUESTION + MB_APPLMODAL);
    if i <> IDYES then Exit;
  end;
 
  //Попытка подключиться к корневому объекту MS Excel.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(0, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Excel. Возможно - на время отладки.
  exApp.Visible := True;
  //Открываем файл рабочей книги или создаём новую книгу.
  if FileExists(Od.FileName) then
    exBook := exApp.WorkBooks.Open(FileName:=Od.FileName)
  else
    exBook := exApp.WorkBooks.Add;
  //Получаем ссылку на первый лист рабочей книги.
  exSh := exBook.Worksheets[1];
  //Для ускорения работы с MS Excel отключаем режим перерисовки окон MS Excel.
  exApp.ScreenUpdating := False;
  try
    {Передаём данные из таблицы на лист MS Excel. Таблица запишется
    непосредственно ниже используемого диапазона.
    Третий парамерт = 1 - это номер столбца, начиная с которого таблица
    расположится на листе.
    Функция возвращает ссылку на интерфейс диапазона, в который записались
    данные таблицы.}
    exRng := SgToExcel(Sg, exSh, 1);
    //Здесь можно произвести оформление диапазона. - Линовка, выравнивание
    //ширины столбцов, параметры шрифта и пр.
    if not VarIsClear(exRng) then begin
      //Обрамление ячеек.
      exRng.Borders.LineStyle := xlContinuous;
      exRng.Borders.Weight := xlThin;
      //Подбор ширины столбцов по содержимому.
      exRng.Columns.AutoFit;
    end;
  finally
    //Включаем режим перерисовки окон MS Excel.
    exApp.ScreenUpdating := True;
  end;

  //Сохраняем рабочую книгу.
  //Отключаем режим предупреждений. - Чтобы не выводился диалог о перезаписи
  //файла, если он уже существует.
  exApp.DisplayAlerts := False;
  try
    exBook.SaveAs(FileName:=Od.FileName);
  finally
    //Включаем режим предупреждений.
    exApp.DisplayAlerts := True;
  end;
 
  //Закрытие рабочей книги MS Excel.
  //exBook.Close;
  //Выход из MS Excel.
  //exApp.Quit;
end;
Помогите пожалуйста!

Последний раз редактировалось fcdk_pavel; 24.09.2013 в 13:31.
fcdk_pavel вне форума Ответить с цитированием
Старый 03.10.2013, 15:25   #2
cherry25
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 110
По умолчанию

суммируете, как и суммировали на 5 число, а далее перебираете в цикле все просуммированные ранее строчки, по уникальному полю находите нужную (или проверяете на несовпадение) и записываете новые данные
cherry25 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование уже запущенного документа Excel Crazy_Gamer Общие вопросы Delphi 6 07.09.2013 18:55
С++ редактирование Excel-документов Sylvesterr Фриланс 3 30.06.2013 15:40
Редактирование и сохранение excel из dbgrid Q012 БД в Delphi 5 22.08.2012 21:24
VB6 просмотр и редактирование excel файлов в приложение Hey4 Помощь студентам 1 28.09.2011 16:56
Редактирование Excel книг через Delphi? DA-corp. БД в Delphi 3 01.03.2008 09:50