Помощь - Поиск - Пользователи - Календарь
Полная версия: Объединение ячеек в экселе
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Atreides
Уважаемые, подскажите, как выполнить проход по столбцу (столбец всего один) в эксельном файлике и при нахождении подряд одинаковых значений объединить их в одну ячейку? И как можно определить номер последней строки с записью. Или при нахождение значения "ИТОГО" закрасить сроку от итого до последнего столбца. Все данные на одном первом листе.
IUnknown
Как-то вот так:
procedure TForm1.Button1Click(Sender: TObject);
var
iFirstRow, iCurrentRow, CurrValue : Integer;
iLastCell : Integer;
s : string;
begin
XLApp := CreateOleObject('Excel.Application');
XLApp.Visible := True; // Это для тестов

// Чтоб при объединении ячеек Excel не вякал:
// "The selection contains multiple data values. Merging into
// one cell will keep the upper-left most data only."
// отключаем вообще все уведомления...

XLApp.DisplayAlerts := False;

XLApp.WorkBooks.Open(xlFileName);

// Для начала найдем последнюю ячейку в столбце "B"
iLastCell := XLApp.Sheets[1].Range['B65536'].End[xlUp].Rows.Row;
// Это - тоже проще сделать вручную, я думаю, шапка одинакова везде
iFirstRow := 6;

// Вот он, главный цикл
repeat
CurrValue := XLApp.Sheets[1].Cells.Item[iFirstRow, 2].Value;
iCurrentRow := iFirstRow + 1;
while (iCurrentRow <= iLastCell) and
(XLApp.Sheets[1].Cells.Item[iCurrentRow, 2].Value = CurrValue) do
begin
Inc(iCurrentRow);
end;
XLApp.Sheets[1].Range[ Format('B%d:B%d', [iFirstRow, iCurrentRow - 1]) ].MergeCells := True;
iFirstRow := iCurrentRow;
until (iFirstRow > iLastCell);

XLApp.Workbooks[1].SaveAs(xlFileName); // Записываем измененный файл под тем же именем
XLApp.Quit;
XLApp := Unassigned;
end;
Atreides
Огромное спасибо!
Еще вопросец возник, как сделать выделение ячеек бордером, но только по контор выделенной области, без внутренних выделений? А то обычным бордером он все перекладины делает жирным.
IUnknown
   XLApp.Sheets[1].Range[ 'F2:G7' ].Select;  // Тут выберешь нужный Range, который надо очертить
for i := xlEdgeLeft to xlEdgeRight do
begin
XLApp.Selection.Borders[i].LineStyle := xlContinuous;
XLApp.Selection.Borders[i].Weight := xlMedium;
end;
Atreides
А если нужно использовать только нижнюю толстую линию выделения под итогами. И толстую правую линию выделения в каждом столбце данных. Пробовал сделать, по ошибке вылетаю. Кинул пример для наглядности.
Код
begin
  XLApp.DisplayAlerts := False; //отмена ругани экселя

  iFirstRow := 10; //  начало поиска

    repeat
     CurrValue := XLApp.Cells.Item[iFirstRow, 1].Value;
     iCurrentRow := iFirstRow + 1;
     while  (CurrValue <> Unassigned) and
           (XLApp.Cells.Item[iCurrentRow, 1].Value = CurrValue) do
     begin
        Inc(iCurrentRow);
     end;
     //закрашивание строк "итого"
     XLApp.Range[Format('B%d', [iCurrentRow-1]), GetCellAddress(ColCount, iCurrentRow-1)].Interior.Color:=rgb(255,255,153);
     //XLApp.Range[Format('B%d', [iCurrentRow-1]), GetCellAddress(ColCount, iCurrentRow-1)].Borders.xlEdgeBottom.LineStyle := xlContinuous;
     //XLApp.Range[Format('B%d', [iCurrentRow-1]), GetCellAddress(ColCount, iCurrentRow-1)].Borders.xlEdgeBottom.Weight := xlMedium;
     //Report.Range[Format('B%d', [iCurrentRow-1]), GetCellAddress(ColCount, iCurrentRow-1)].Borders.Weight := xlMedium;
     //группировка значений
     XLApp.Range[ Format('A%d:A%d', [iFirstRow, iCurrentRow - 1]) ].MergeCells := True;
     XLApp.Range[ Format('A%d:A%d', [iFirstRow, iFirstRow]) ].HorizontalAlignment := xlCenter;
     XLApp.Range[ Format('A%d:A%d', [iFirstRow, iFirstRow]) ].VerticalAlignment := xlCenter;
     iFirstRow := iCurrentRow;
  until CurrValue = Unassigned;

end;
IUnknown
И на фиг мне этот пример, если ты какую-то левую GetCellAddress используешь?

Тысячу раз говорено: надо - не мне, а задающему вопрос. И его задача - привести код, который можно откомпилировать и запустить. Не компилируется - тут же уходит в мусорку... Твой код НЕ КОМПИЛИРУЕТСЯ у меня на машине. Надо - присоединяй реализацию функции.

Для того, чтобы ИСПРАВИТЬ ошибку, надо ее УВИДЕТЬ. Я - не вижу, где именно происходит ошибка, и что за ошибка - тоже...

P.S.
Что такое ColCount - я тоже должен ДОГАДАТЬСЯ? Где и как оно описано? Какое значение на момент входа в процедуру оно содержит?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.