1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 54

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

08.05.2012, 10:55. Показов 7863. Ответов 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
13117 / 5898 / 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
13117 / 5898 / 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
13117 / 5898 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru