Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
kertiz
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 14
#1

Вывести адреса ячеек excel - Delphi

08.10.2013, 12:36. Просмотров 1371. Ответов 1
Метки нет (Все метки)

Задание: дан файл Excel, в ячейках которого написаны целые числа. Найти максимальное из них, вывести число и адрес ячейки. Искал похожее, нашел Delphi+Excel поиск максимума по модулю , модифицировал код (в архивном файле), считает вроде как верно, но осталось вывести адрес максимального значения (несколько адресов если максимальное значение в разных ячейках). Как это сделать?
0
Вложения
Тип файла: rar 1.RAR (181.5 Кб, 14 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2013, 12:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывести адреса ячеек excel (Delphi):

Выравнивание высоты объединённых ячеек Excel по их содержимому. AutoFit для объединённых ячеек Excel. - Delphi
В ячейку вставляется очень длинный текст, который при печати просто не виден. Нужно, чтобы продолжение текста переносилось в сторку ниже. ...

Оформление ячеек в excel - Delphi
Суть такова на форме сделать 4 edit и 1 кнопку и сервер TExcelApplication. В итоге должно получиться вот такая таблица. ...

Объединение ячеек в excel - Delphi
подскажите как объединить ячейки в excel типа такого формата st := Excel.ActiveWorkBook.WorkSheets.Cells; st1 :=...

Сумма значений ячеек Excel - Delphi
Здравствуйте, возникла следующая проблема. При сложении значений двух ячеек из Excel, e.Sheets.Cells.FormulaR1C1:=...

Заполнение ячеек по порядку в Excel - Delphi
Здравствуйте. Есть программа по генерации свободного числа,при нажатие кнопки "Сохранить в Excel" происходит запись в ячейку A1. Если...

Ошибка в выборе и соединении ячеек EXCEL - Delphi
Соответственно говоря вот такой код var ExcelApp, Workbook: Variant; MAS_ID : array of string; ...

1
Mawrat
12800 / 5708 / 674
Регистрация: 19.09.2009
Сообщений: 8,807
08.10.2013, 15:16 #2
kertiz, вот таким образом можно сделать:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
implementation
 
{$R *.dfm}
 
function ExRangeToVArr(aExSh : Variant; const aRow, aCol : Integer) : Variant;
const
  SelfName = 'ExRangeToVArr()';
var
  exCell1, exCell2 : Variant;
  Row, Col : Integer;
begin
  VarClear(Result);
  if VarIsClear(aExSh) then
    raise Exception.Create(SelfName + '. Пустая ссылка на интерфейс листа MS Excel.');
  //Левая верхняя ячейка искмого диапазона.
  exCell1 := aExSh.Cells[aRow, aCol];
  //Координаты правой нижней ячейки используемого диапазона (UsedRange) на листе.
  Col := aExSh.UsedRange.Column + aExSh.UsedRange.Columns.Count - 1;
  Row := aExSh.UsedRange.Row + aExSh.UsedRange.Rows.Count - 1;
  if (Row < exCell1.Column) or (Col < exCell1.Column) then
    Exit;
  //Правая нижняя ячейка искмого диапазона.
  exCell2 := aExSh.Cells[Row, Col];
  //Данные искомого диапазона.
  Result := aExSh.Range[exCell1, exCell2].Value;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
const
  Capacity = 10; //Величина приращения длины динамического массива.
var
  exApp, exBook, exSh : Variant;
  VArr : Variant;
  //Массив, в который мы будем записывать координаты элементов с наибольшим значением.
  ArrMax : array of TPoint;
  i, j, Cnt, Row, Col : Integer;
  Num, NumMax : Extended;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
 
  exApp := CreateOleObject('Excel.Application');
  try
    exApp.Visible := False;
    //Открываем файл рабочей книги.
    exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
    //Получаем ссылку на первый лист рабочей книги.
    exSh := exBook.Worksheets[1];
 
    //Координаты левой верхней ячейки в диапазоне данных на листе MS Excel.
    Row := 1; //Номер строки.
    Col := 1; //Номер столбца.
    {Получаем данные с листа рабочей книги MS Excel.
    Здесь предполагается, что верхняя левая ячейка в области данных
    на листе MS Excel имеет координаты: aRow = Row, aCol = Col.}
    VArr := ExRangeToVArr(exSh, Row, Col);
  finally
    exApp.Quit; //Выход из MS Excel.
  end;
 
  Cnt := 0; //Количество значимых элементов в массиве ArrMax.
  NumMax := 0;
  for i := 1 to VarArrayHighBound(vArr, 1) do
    for j := 1 to VarArrayHighBound(vArr, 2) do
      if VarType(VArr[i, j]) = varDouble then begin
        Num := VArr[i, j];
        {Если мы обнаружили элемент, который больше всех ранее просмотренных,
        то, значит, все элементы, которые ранее мы принимали за наибольшие,
        таковыми не являются. Поэтому, массив ArrMax начинаем заполнять заново.}
        if (Num > NumMax) or (Cnt = 0) then begin
          NumMax := Num;
          //Сброс количества элеметов в массиве.
          Cnt := 0;
          //Если требуется, увеличиваем размер массива.
          if Length(ArrMax) = Cnt then SetLength(ArrMax, Cnt + Capacity);
          //Записываем в массив координаты найденного элемента.
          ArrMax[Cnt].X := i;
          ArrMax[Cnt].Y := j;
          //Количество значимых элементов в массиве ArrMax стало на 1 больше.
          Inc(Cnt);
        {Если мы обнаружили элемент, который равен текущему наибольшему,
        то, добавляем его координаты в массив ArrMax.}
        end else if Num = NumMax then begin
          //Если требуется, увеличиваем размер массива.
          if Length(ArrMax) = Cnt then SetLength(ArrMax, Cnt + Capacity);
          //Записываем в массив координаты найденного элемента.
          ArrMax[Cnt].X := i;
          ArrMax[Cnt].Y := j;
          //Количество значимых элементов в массиве ArrMax стало на 1 больше.
          Inc(Cnt);
        end;
      end;
  //Приводим длину массива в соответствие с количеством записанных в него
  //значимых элементов.
  if Cnt < Length(ArrMax) then SetLength(ArrMax, Cnt);
 
  //Распечатываем координаты ячеек, которые содержат наибольшие значения.
  if Length(ArrMax) = 0 then
    Memo1.Text := 'Числа в заданном диапазоне на листе MS Excel не обнаружены.'
  else begin
    Memo1.Text := 'Наибольшее значение: ' + FloatToStr(NumMax);
    Memo1.Lines.Add('Список координат ячеек, содержащих наибольшие числа:');
    for i := 0 to High(ArrMax) do
      Memo1.Lines.Add('Cell[' + IntToStr(ArrMax[i].X + Row - 1)
        + ', ' + IntToStr(ArrMax[i].Y + Col - 1) + ']');
  end;
end;
 
end.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 15:16
Привет! Вот еще темы с ответами:

Экспорт цветных ячеек из Stringgrid в excel - Delphi
Здравствуйте, Форумчане! Столкнулся с такой проблемой Необходимо экспортировать текст+цветные ячейки в Excel Вот код для экспорта...

Выделить множество непустых ячеек Excel - Delphi
Cкажите, есть какое-нибудь свойство, позволяющее выделить множество непустых ячеек или максимальный номер непустой строки/столбца на листе...

Подсчет неокрашенных ячеек Excel из Delphi - Delphi
Стоит задача обработать анкету,заполненную в Excel 2007,в Delphi XE. Требуется подсчитать неокрашенные ячейки из трех столбцов,но...

[Excel] Изменить формат ячеек на числовой - Delphi
Доброго времени суток, форумчане! Пишем программу, в которой часть работы завязана на считывание и обработки ячеек Excel, и наткнулись на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru