Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/117: Рейтинг темы: голосов - 117, средняя оценка - 4.50
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279

Запись в ячейки Excel со сдвигом

15.06.2013, 12:45. Показов 22488. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста, у меня есть DBGrid и есть Button, как мне сделать так что при нажатии на кнопку активная строка столбца в DBGride перемещалась в ексель в столбец А1 при выборе другой записи и нажатии на кнопку, в тот же документ екселя переносилась запись, но уже ниже в А2. Сделал как добавлять в ексель, но не могу сделать добавление со сдвигом. За ранее большое спасибо. Тапками не кидайтесь если плохо написал

Добавлено через 1 час 13 минут
Помогите пожалуйста кто может.

Добавлено через 15 часов 19 минут
Что никто не может помочь?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2013, 12:45
Ответы с готовыми решениями:

Запись в ячейки Excel со сдвигом
Здраствуйте. Помогите плиз реализовать следующую задачу. К примеру у нас есть форма на которой одно поле Textbox и кнопка Button ...

Перенос комментариев Excel в ячейки со сдвигом
Добрый день! Имеется код VBA(ниже), забирает комментарий из рецензии и кладет в ячейку со сдвигом + 1, если ячейка занята ...

Как удалить программно ячейки со сдвигом? (Excel)
Word: http://www.relib.com/forums/topic.asp?id=840206 Как удалить программно ячейки в таблице ActiveDocument.Tables(1).... со...

29
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
15.06.2013, 22:43
Студворк — интернет-сервис помощи студентам
Здесь ещё выяснилось, что есть проблема с тем, что при добавлении новой строки в таблицу, нижние строки сдвигаются, но высоты строк не смещаются!
Код с исправлением этой проблемы. Теперь перед вставкой новой строки, высоты всех строк, которые ниже идут смещаются вниз на 1 строку.
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const
  //Адрес левой верхней ячейки в области данных таблицы (т. е., прямо под шапкой таблицы).
  gAddr = 'A9';
 
var
  //Ссылка на интерфейс рабочего листа в книге MS Excel.
  gExSh : Variant;
 
procedure TForm1.Button7Click(Sender: TObject);
const
  //Идентификатор типа ячейки в диапазоне - последняя (справа внизу) ячейка диапазона.
  xlCellTypeLastCell = 11;
  //Вид линии.
  xlContinuous = 1;
  //Расположение линии.
  xlInsideVertical = 11;
  //Толщина линий.
  xlMedium = -4138;
  xlThick = 4;
  xlThin = 2;
  //Сдвиг вниз.
  xlShiftDown = -4121;
var
  exApp, exBook, exCell, exRng, exComm : Variant;
  i, RowE, Col, Offs : Integer;
  Od : TOpenDialog;
  S : String;
begin
  //Проверка подключения к БД.
  if not ADOQuery1.Active then begin
    MessageBox(0, 'Таблица закрыта. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка, выбрана ли запись.
  if ADOQuery1.Eof then begin
    MessageBox(0, 'Запись не выбрана. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Проверка, есть ли подключение к MS Excel.
  if not VarIsClear(gExSh) then
  try
    S := gExSh.Name;
  except
    VarClear(gExSh);
  end;
  //Если подключения к Excel нет, то запускаем диалог открытия раб. книги Excel.
  if VarIsClear(gExSh) then begin
    Od := OpenDialog1; //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_ICONEXCLAMATION + MB_APPLMODAL);
      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;
    //Открываем файл рабочей книги.
    exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
    //Получаем ссылку на ВТОРОЙ лист рабочей книги.
    if exBook.Worksheets.Count < 2 then begin
      MessageBox(0, 'В книге нет второго листа! Действие отменено.',
        'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
      Exit;
    end;
    gExSh := exBook.Worksheets[2];
  end;
 
  gExSh.Application.ScreenUpdating := False;
  try
    //Верхняя левая ячейка в области данных таблицы на листе MS Excel.
    exCell := gExSh.Range[gAddr];
 
    //Номер нижней занятой строки для всего используемого диапазона на листе Excel.
    RowE := gExSh.UsedRange.SpecialCells(xlCellTypeLastCell).Row;
    //Поиск метки последней строки и определение смещения до этой ячейки.
    Col := exCell.Column;
    Offs := -1;
    for i := exCell.Row to RowE do begin
      exComm := gExSh.Cells[i, Col].Comment;
      if not VarIsClear(exComm) and (exComm.Text = 'end') then begin
        Offs := i - exCell.Row;
        Break;
      end;
    end;
 
    //Для всех строк, которые расположены ниже таблицы, высоты переносим
    //на 1 строку вниз.
    for i := RowE downto exCell.Row do
      gExSh.Cells[i + 1, 1].RowHeight := gExSh.Cells[i, 1].RowHeight;
 
    //Если метка найдена, то удаляем её и добавляем новую строку.
    if Offs > -1 then begin
      //Удаление метки.
      exCell.Offset[Offs, 0].ClearComments;
      //Добавление новой строки.
      exRng := gExSh.Range[exCell.Offset[Offs + 1, 0]
        ,exCell.Offset[Offs + 1, 0].Offset[0, 15]];
      exRng.Insert(xlShiftDown);
      //Заново определяем диапазон, так как при вызове Insert() диапазон меняется.
      exRng := gExSh.Range[exCell.Offset[Offs + 1, 0]
        ,exCell.Offset[Offs + 1, 0].Offset[0, 15]];
      //Оформление строки.
      //exCell.Offset[Offs + 1, 0].RowHeight := exCell.RowHeight;
      exRng.Borders.Weight := xlThin;
    end;
    //Записываем данные
    exCell.Offset[Offs + 1, 0] := ADOQuery1.Fields[0].AsString;
    exCell.Offset[Offs + 1, 5] := ADOQuery1.Fields[5].AsString;
    exCell.Offset[Offs + 1, 8] := ADOQuery1.Fields[8].AsString;
    //Устанавливаем метку конца данных.
    exCell.Offset[Offs + 1, 0].AddComment('end');
  finally
    gExSh.Application.ScreenUpdating := True;
  end;
end;
Добавлено через 1 минуту
Цитата Сообщение от MrViper Посмотреть сообщение
Mawrat, ругается на Od := OpenDialog1;
Я специально в эту строку добавил комментарий.
Delphi
1
Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
Т. е., на форму надо положить компонент:
OpenDialog1 : TOpenDialog;
---
И ещё прикрепил XLS файл. - Он в том виде, который нужен для правильной работы программы. Т. е. там в первой строке области данных таблицы убрано объединение по вертикали.
Вложения
Тип файла: xls акт-02.xls (37.0 Кб, 28 просмотров)
1
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279
15.06.2013, 23:39  [ТС]
Mawrat, как я понял когда нажимаю на кнопку вылазит опен диалог и там нужно выбрать файл екселя? Если да то у меня после открытия файла екселя появляется ошибка
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
15.06.2013, 23:57
У меня такой ошибки не возникает... Прикладываю проект вместе с файлом Excel.
Вложения
Тип файла: rar DBRowToExcel-02.rar (336.9 Кб, 110 просмотров)
1
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279
16.06.2013, 00:07  [ТС]
Mawrat, странно у меня и в вашем проекте тоже ошибку выдает, сейчас попробую делфи переустановить
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.06.2013, 00:15
Delphi, скорее всего не нужно переустанавливать. Можно запустить готовый EXE файл, из архива, который я в предыдущем сообщении приложил. И посмотреть, как отработает программа.
А какая версия операционной системы и MS Office?
1
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279
16.06.2013, 00:19  [ТС]
Mawrat, ОС windows 7, Microsoft Office 2010. Если запускать с EXE файла, то вылазит другая ошибка, но добавляет только в 1 строчку, если я нажимаю добавить другую строчку, то предыдущая запись удаляется а появляется новая.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.06.2013, 00:24
И ещё по смыслу задачи надо заменить строки:
Delphi
1
2
3
4
    //Записываем данные
    exCell.Offset[Offs + 1, 0] := ADOQuery1.Fields[0].AsString;
    exCell.Offset[Offs + 1, 5] := ADOQuery1.Fields[5].AsString;
    exCell.Offset[Offs + 1, 8] := ADOQuery1.Fields[8].AsString;
на:
Delphi
1
2
3
4
    //Записываем данные
    exCell.Offset[Offs + 1, 0] := ADOQuery1.Fields[0].AsString;
    exCell.Offset[Offs + 1, 5] := ADOQuery1.Fields[1].AsString;
    exCell.Offset[Offs + 1, 8] := ADOQuery1.Fields[2].AsString;
Добавлено через 1 минуту
Цитата Сообщение от MrViper Посмотреть сообщение
Mawrat, ОС windows 7, Microsoft Office 2010. Если запускать с EXE файла, то вылазит другая ошибка, но добавляет только в 1 строчку, если я нажимаю добавить другую строчку, то предыдущая запись удаляется а появляется новая.
А файл какой открывается? - Тот что в моём архиве лежит? Или другой какой-нибудь?

Добавлено через 1 минуту
Цитата Сообщение от MrViper Посмотреть сообщение
ОС windows 7, Microsoft Office 2010.
Я проверял на Windows XP PRO RU SP3 и MS Office 2003 PRO.

Добавлено через 1 минуту
Возможно есть какие-то особенности в Microsoft Office 2010 (относительно MS Office 2003)...
1
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279
16.06.2013, 00:52  [ТС]
Mawrat, файл открывал который и в вашем архиве лежит и который вы мне скинули

Добавлено через 10 минут
Mawrat, все сделал все работает большое спасибо вам.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.06.2013, 00:58
Хорошо. А ошибка из-за чего возникала?
1
56 / 31 / 1
Регистрация: 25.04.2013
Сообщений: 279
16.06.2013, 18:49  [ТС]
Mawrat, у меня в таблице только 5 полей а указанно было 8 поле, я исправил и все заработало. Еще раз большое спасибо.

Добавлено через 17 часов 47 минут
Тему можно закрывать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2013, 18:49

Запись в ячейки из другого документа excel
Доброго времени суток, помогите пожалуйста, задача перенос данных из одного файла excel в другой в определенные столбцы, но столкнулся с...

Запись числа в отдельные ячейки excel
В таблице бд хранится семизначное число. Нужно с помощью рнр и phpexcel записать это число в файл excel в таком формате: 1-я цифра числа-в...

Запись данных из одной ячейки в несколько - MS Excel
Эта тема не однократно обсуждалась в интернете, знаю, и решение имеет не сложное. Единственное дополнение - что делать если разделитель...

Считывание/запись ячейки в Excel - LibXL (C, CodeBlocks)
Скачал бесплатную версию библиотеки, установил, пытаюсь проверить простые примеры с главной сайта: 1. Чтение ячейки. int main() { ...

Как удалить программно ячейки со сдвигом?
Как удалить программно ячейки в таблице ActiveDocument.Tables(1).... со сдвигом?


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru