Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/35: Рейтинг темы: голосов - 35, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54

Работа с Excel. Суть: Если номер строки в Excel четный тогда объеденяем эту ячейку с последующей.

08.05.2012, 10:55. Показов 7662. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите, пожалуйста .Я вот в Delphi осуществляю работу с документов в Excel, как я могу записать, чтобы выполнялся алгоритм: если номер строки в Excel четный, тогда объеденяем эту ячейку с последующей.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2012, 10:55
Ответы с готовыми решениями:

Как получить результат, если формула в Excel вписана в ячейку!???
Как получить результат, если формула в Excel вписана в ячейку!??? Нужно, в ячейку вписывать формулу вида...

Cpp builder-Ole-Excel. WideString пишет в ячейку Excel минус перед нулем
Здравствуйте! Посмотрите пожалуйста: Когда аргумент val == 0, в ячейку Excel пишется "-0". Без WideString все нормально - в...

Excel: Очистить ячейку если та что справа окрашена в зеленый цвет
Могут ли макросы очищать ячейку когда ту что справа от нее окрасят в зеленый цвет? Прилагаю файл и его скриншот Понимаю что...

26
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54
09.05.2012, 17:42  [ТС]
Студворк — интернет-сервис помощи студентам
Да-да, так и нужно..) Только для второго) А первый весь вообще удалить можно)
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.05.2012, 18:40
Цитата Сообщение от timupa80 Посмотреть сообщение
А первый весь вообще удалить можно)
Ясно. Сейчас добавлю это действие...

Добавлено через 10 минут
А сортировку надо делать только в первом столбце? Или надо сортировать весь диапазон но с ключом по первому столбцу?
Например, пускай имеем данные на листе:
Code
1
2
3
3 c
2 b
1 a
Если сортировать только по первому столбцу, то получим такой результат:
Code
1
2
3
1 c
2 b
3 a
А если сортировать по ключу первого столбца весь диапазон, тогда после сортировки получим такое расположение:
Code
1
2
3
1 a
2 b
3 c
Какой способ надо применить?

Добавлено через 6 минут
Код получился такой:
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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  xlAscending = 1; //Для сортировки по возрастанию.
  xlDescending = 2; //Для сортировки по убыванию.
  xlYes = 1; //Верхняя строка диапазона не участвует в сортировке.
  xlNo = 2; //Верхняя строка диапазона участвует в сортировке.
  xlSortColumns = 1; //Сортировать по столбцам.
  xlSortRows = 2; //Сортировать по строкам.
var
  exApp, exBook, exSheet, exUsRng, exRng, exCell : Variant;
  Row, Col, RowCnt, ColCnt : Integer;
  S : String;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
  //Если начальная папка диалога не задана, то в качестве начальной берём ту папку,
  //в которой расположен исполняемый файл нашей программы.
  if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath(ParamStr(0));
  //Запуск диалога открытия файла.
  if not Od.Execute then Exit;
  //Если файла с заданным именем не существует - выходим.
  if not FileExists(Od.FileName) then begin
    MessageBox(
      0
      ,'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден'
      ,MB_OK + MB_ICONWARNING + MB_APPLMODAL
    );
    Exit;
  end;
 
  exApp := CreateOLEObject('Excel.Application'); // Создание OLE объекта
  exApp.Visible := True;
  exBook := exApp.WorkBooks.Open(Od.FileName);
  exSheet := exBook.Worksheets[1]; //Первый лист в рабочей книге.
 
  //Ссылка на интерфейс используемого диапазона.
  exUsRng := exSheet.UsedRange;
  //Номер нижней строки в используемом диапазоне относительно верхней строки листа.
  RowCnt := exUsRng.Row + exUsRng.Rows.Count - 1;
  //Номер правого столбца в используемом диапазоне относительно левого края листа.
  ColCnt := exUsRng.Column + exUsRng.Columns.Count - 1;
  //Теперь переопределим диапазон exUsRng - он будет иметь смысл диапазона,
  //который мы должны обрабатывать. Этот диапазон начинается со второй строки
  //листа и заканчивается последней строкой диапазона UsedRange.
  exUsRng := exSheet.Range[exSheet.Cells[2, 1], exSheet.Cells[RowCnt, ColCnt]];
 
  try
    //Выключаем перерисовку окна.
    exApp.ScreenUpdating := False;
 
    //Первый столбец.
    Col := 1;
 
    //Удаление строк.
    for Row := exUsRng.Rows.Count downto 1 do
      if exUsRng.Cells[Row, Col].Text = '5' then
        exUsRng.Rows[Row].Delete;
 
    //Удаляем заданный столбец.
    exUsRng.Columns[Col].Delete;
 
    //Сортировка диапазона по алфавиту.
 
    //Если надо отсортировать только один столбец:
    //exRng := exUsRng.Columns[Col]; //Диапазон, представляющий заданный столбец.
    //exRng.Sort(Key1:=exRng.Cells[1, 1], Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns);
 
    //Если надо отсортировать весь диапазон по ключу заданного столбца:
    exUsRng.Sort(Key1:=exUsRng.Cells[1, Col], Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns);
 
    //Объединение ячеек в заданном столбце.
 
    //Чтобы Excel не выводил диалоговых окон с предупреждениями при объединениях ячеек,
    //отключаем режим показа предупреждений.
    exApp.DisplayAlerts := False;
    //В заданном столбце диапазона попарно объединяем ячейки.
    Row := 1;
    while Row <= exUsRng.Rows.Count do begin
      //Ссылка на текущую ячейку.
      exCell := exUsRng.Cells[Row, Col];
      //Определяем объединяемый диапазон.
      exRng := exSheet.Range[exCell, exCell.Offset[1, 0]];
      //Собираем значения в одну строку.
      S := exRng.Cells[1, 1].Text + #13#10 + exRng.Cells[2, 1].Text;
      //Объединение ячеек.
      exRng.MergeCells := True;
      //Для объединённого диапазона устанавливаем режим переноса по словам.
      exRng.WrapText := True;
      //Записываем текст.
      exRng.Cells[1, 1].Value := S;
      //Номер первой строки в следующей паре.
      Inc(Row, 2);
    end;
  finally
    //Теперь включаем перерисовку окна и включаем режим показа предупреждений.
    exApp.ScreenUpdating := True;
    exApp.DisplayAlerts := True;
  end;
end;
Здесь выполняется сортировка всего диапазона по ключу первого столбца. В закоментованной части приведена сортировка по отдельному столбцу.
0
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54
09.05.2012, 18:53  [ТС]
Не так немного сортирует..((( Мне нужно чтобы просто то что в ячейках было объединенных написано, как бы считалось за 1 строку.. и вот вот эти объединенные ячейки уже и сортировались.. ладно. Объясню конкретнее. У меня база вопросов) В ней удаляются лишние варианты ответов. Позже вопрос объединяется с ответом. и вот вопросы должны отсортироваться. но ответ от них никуда деться не должен))))))))
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.05.2012, 19:39
Тогда ещё вариант. - С сортировкой столбца, в котором расположены объединённые ячейки:
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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  xlAscending = 1; //Для сортировки по возрастанию.
  xlDescending = 2; //Для сортировки по убыванию.
  xlYes = 1; //Верхняя строка диапазона не участвует в сортировке.
  xlNo = 2; //Верхняя строка диапазона участвует в сортировке.
  xlSortColumns = 1; //Сортировать по столбцам.
  xlSortRows = 2; //Сортировать по строкам.
var
  exApp, exBook, exSheet, exUsRng, exRng, exCell : Variant;
  Row, Col, RowCnt, ColCnt : Integer;
  S : String;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
  //Если начальная папка диалога не задана, то в качестве начальной берём ту папку,
  //в которой расположен исполняемый файл нашей программы.
  if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath(ParamStr(0));
  //Запуск диалога открытия файла.
  if not Od.Execute then Exit;
  //Если файла с заданным именем не существует - выходим.
  if not FileExists(Od.FileName) then begin
    MessageBox(
      0
      ,'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден'
      ,MB_OK + MB_ICONWARNING + MB_APPLMODAL
    );
    Exit;
  end;
 
  exApp := CreateOLEObject('Excel.Application'); // Создание OLE объекта
  exApp.Visible := True;
  exBook := exApp.WorkBooks.Open(Od.FileName);
  exSheet := exBook.Worksheets[1]; //Первый лист в рабочей книге.
 
  //Ссылка на интерфейс используемого диапазона.
  exUsRng := exSheet.UsedRange;
  //Номер нижней строки в используемом диапазоне относительно верхней строки листа.
  RowCnt := exUsRng.Row + exUsRng.Rows.Count - 1;
  //Номер правого столбца в используемом диапазоне относительно левого края листа.
  ColCnt := exUsRng.Column + exUsRng.Columns.Count - 1;
  //Теперь переопределим диапазон exUsRng - он будет иметь смысл диапазона,
  //который мы должны обрабатывать. Этот диапазон начинается со второй строки
  //листа и заканчивается последней строкой диапазона UsedRange.
  exUsRng := exSheet.Range[exSheet.Cells[2, 1], exSheet.Cells[RowCnt, ColCnt]];
 
  try
    //Выключаем перерисовку окна.
    exApp.ScreenUpdating := False;
 
    //Первый столбец.
    Col := 1;
 
    //Удаление строк.
    for Row := exUsRng.Rows.Count downto 1 do
      if exUsRng.Cells[Row, Col].Text = '5' then
        exUsRng.Rows[Row].Delete;
 
    //Удаляем заданный столбец.
    exUsRng.Columns[Col].Delete;
 
    //Объединение ячеек в заданном столбце.
 
    //Корректируем обрабатываемый диапазон таким образом, чтобы он содержал
    //чётное число строк. Для этого, в случае, если диапазон имеет нечётное
    //число строк, мы добавим в него ещё одну строку снизу.
    if exUsRng.Rows.Count mod 2 <> 0 then
      exUsRng := exApp.Union(exUsRng, exUsRng.Rows[1].Offset[exUsRng.Rows.Count, 0]);
 
    //Чтобы Excel не выводил диалоговых окон с предупреждениями при объединениях ячеек,
    //отключаем режим показа предупреждений.
    exApp.DisplayAlerts := False;
    //В заданном столбце диапазона попарно объединяем ячейки.
    Row := 1;
    while Row <= exUsRng.Rows.Count do begin
      //Ссылка на текущую ячейку.
      exCell := exUsRng.Cells[Row, Col];
      //Определяем объединяемый диапазон.
      exRng := exSheet.Range[exCell, exCell.Offset[1, 0]];
      //Собираем значения в одну строку.
      S := exRng.Cells[1, 1].Text + #13#10 + exRng.Cells[2, 1].Text;
      //Объединение ячеек.
      exRng.MergeCells := True;
      //Для объединённого диапазона устанавливаем режим переноса по словам.
      exRng.WrapText := True;
      //Записываем текст.
      exRng.Cells[1, 1].Value := S;
      //Номер первой строки в следующей паре.
      Inc(Row, 2);
    end;
 
    //Сортировка диапазона по алфавиту.
 
    //Если надо отсортировать только один столбец:
    exRng := exUsRng.Columns[Col]; //Диапазон, представляющий заданный столбец.
    exRng.Sort(Key1:=exRng.Cells[1, 1], Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns);
 
    //Если надо отсортировать весь диапазон по ключу заданного столбца:
    //exUsRng.Sort(Key1:=exUsRng.Cells[1, Col], Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns);
  finally
    //Теперь включаем перерисовку окна и включаем режим показа предупреждений.
    exApp.ScreenUpdating := True;
    exApp.DisplayAlerts := True;
  end;
end;
Здесь сортировке подвергается только один столбец - в котором расположены объединённые ячейки. Если нужно сортировать весь диапазон с ключом по заданному столбцу, тогда понадобится предварительно сделать объединения ячеек в других столбцах диапазона. Потому что сортировка может происходить только в диапазоне с одинаковым устройством ячеек.
0
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54
09.05.2012, 22:52  [ТС]
Как-то странно сортирует.. ну ладно..)) Огромное спасибо..)
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.05.2012, 23:07
Сортировку можно дополнительно настроить. Можно добавить опции:
MatchCase = True/False - учитывать/не учитывать регистр букв.
DataOption1 = xlSortNormal/xlSortTextAsNumbers. Здесь xlSortNormal - сортировать числовые и текстовые данные раздельно. xlSortTextAsNumbers - рассматривать текст наравне с числовыми данными.
Здесь можно поэкспериментировать.
Delphi
1
2
3
4
5
6
7
8
9
10
11
const
  xlSortNormal = 0;
  xlSortTextAsNumbers = 1;
  
...
begin
...
  exRng.Sort(
    Key1:=exRng.Cells[1, 1], Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns,
    MatchCase:=True, DataOption1:=xlSortNormal
  );
0
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54
10.05.2012, 16:46  [ТС]
Ладненько..)) Спасибо))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2012, 16:46
Помогаю со студенческими работами здесь

Сформировать новый массив по правилу: если номер элемента четный, то Ai=Ci; если номер элемента нечетный, то Ai=2
Помогите составить программу,пожалуйста. С Графическим интерфейсом. Из элементов одномерного массива С сформировать массив А той же...

Embarcadero, excel, ошибка записи в ячейку строки (не верный тип данных)
Просидел всю ночь, в поисках хоть какой-либо информации! Открывается книга нормально, записываются данные типа bool, числа, а строка (даже...

Выделение цветом строки в Excel 2007, при нажатии на соседнюю ячейку
Здравствуйте. В поиске ничего подходящего не нашел, поэтому прошу помощи. Действо происходит в Excel 2007. Есть 2 таблицы на одном...

Выгрузка строки файла в ячейку Excel средствами VBA. Требуется подсказка
Добрый день. Нужно организовать выгрузку каждой очередной строки в отдельную ячейку. Образно говоря первую строку в ячейку А1, вторую -...

Сформировать массив из исходного по правилу: если номер четный, то Р1=М1+i,если нечетный, то Р1=М1
2. из семи элементов массива Р, введенных случайно на сформировать массив М того же размера по правилу: если номер четный, то...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru