С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
1

Excel. Вставка строки с разделителями

25.01.2016, 14:10. Показов 2322. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Есть задача, сделать программку, которая формирует отчет.
Сейчас я реализовал так, что каждая ячейка заполняется из динамического массива отдельно. А хочется, чтобы формировалась строка с разделителями #9 и ограничителем строк #13#10, а потом эта сформированная строка-таблица вставлялась бы на нужный лист excel. Но при xl.ActiveWorkbook.ActiveSheet.Range['A1:A1']:= str вся строка вставляется в указанную ячейку и значение обрамлено двойными кавычками(в строке формул).
Пробовал через clipboard и задуманное получается. Но очень не хочется работать через буфер винды, т.к. составление отчета может занять несколько часов, в течение которых пользователь может пользоваться буфером и запороть отчет.
Как можно вставить сформированную строку, как таблицу?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2016, 14:10
Ответы с готовыми решениями:

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

вставка строки
Здравствуйте! Помогите пожалуйста исправить ошибку. Давн вумерный массив размерностью m*n. После...

Вставка строки
Всем добрый вечер! Необходимо переменную VAR1 вставить в строку VAR2: var: VAR1 : string...

Вставка строки, Excel
Всем привет. Подскажите пожалуйста как вставить новую строку правильно в эксель. Дело в том что в...

17
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
25.01.2016, 15:04 2
Лучший ответ Сообщение было отмечено boscher как решение

Решение

Цитата Сообщение от boscher Посмотреть сообщение
Сейчас я реализовал так, что каждая ячейка заполняется из динамического массива отдельно. А хочется, чтобы формировалась строка с разделителями #9 и ограничителем строк #13#10, а потом эта сформированная строка-таблица вставлялась бы на нужный лист excel.
Сначала данные надо записать в вариантный массив, а затем этот массив целиком, одним действием, передать по нужным координатам на лист MS Excel.
Пример, как это делается: Экспорт StringGrid в Excel
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
25.01.2016, 15:22  [ТС] 3
Спасибо!
Но по скорости получится тоже самое, что и заполнение из динамического массива.
Нужно просто сделать вставку в ячейку без обрамления значения в кавычки, чтобы эксель учел char(9) и char(13) для перехода в другую ячейку. Таким способом можно выиграть кучу времени...
Попробуйте вставить строку с разделителями char(9) и char(13) непосредственно в ячейку и просто встав на ячейку и вы поймете о чем я.
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
25.01.2016, 15:59 4
Цитата Сообщение от boscher Посмотреть сообщение
Но по скорости получится тоже самое, что и заполнение из динамического массива.
Нет - скорость будет на порядок выше. Причём, чем больше данных, тем больше будет выигрыш в скорости - в пользу использования вариантного массива.

Добавлено через 3 минуты
Использование вариантного массива - это самый быстрый способ передачи данных в MS Excel.
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
26.01.2016, 16:48  [ТС] 5
Почему может не закрываться Excel после использования этой функции? Он исчезает из процессов только после закрытия приложения.
Закрываю excel так:
XL.ActiveWorkbook.Close;
XL.Application.Quit;

Эти операции никак не влияют на созданный ранее процесс...
0
Эксперт Pascal/Delphi
4918 / 2786 / 855
Регистрация: 04.10.2012
Сообщений: 10,148
26.01.2016, 17:04 6
boscher,
Delphi
1
2
3
4
 //отвязываем Excel
  ExcelApp.Workbooks.Close;
  ExcelApp.Quit;
  ExcelApp := Unassigned;
0
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
26.01.2016, 17:35  [ТС] 7
Цитата Сообщение от droider Посмотреть сообщение
boscher,
Delphi
1
2
3
4
 //отвязываем Excel
  ExcelApp.Workbooks.Close;
  ExcelApp.Quit;
  ExcelApp := Unassigned;
Не помогло. Процесс висит, пока не закроешь приложение...
В функции ничего отвязывать не нужно?

Добавлено через 18 минут
Переделал функцию в процедуру и все стало ок.
Может это из-за result'a функции?
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
27.01.2016, 08:07 8
Цитата Сообщение от boscher Посмотреть сообщение
Почему может не закрываться Excel после использования этой функции? Он исчезает из процессов только после закрытия приложения.
Надо обнулить переменные, содержащие ссылки на интерфейсы. В этом случае интерфейсы будут освобождены и не будут удерживать в памяти связанные с ними объекты COM-сервера (это объекты MS Excel, в данном случае). Если переменные интерфейсов объявлены на локальном уровне (процедуры, функции, методы), то перед выходом управления из этого уровня, происходит их автоматическое обнуление и, как следствие - освобождение связанных интерфейсов. Если такие переменные объявлены на глобальном уровне, то для того, чтобы освободить интерфейсы до завершения программы, надо самостоятельно в нужном месте программы выполнить их обнуление.
Delphi
1
2
3
4
5
6
  //Обнуление переменных интерфейсов, объявленных на глобальном уровне.
  //Порядок обнуления не имеет значения.
  exApp := Unassigned;
  exBook := Unassigned;
  exSh := Unassigned;
  exRng := Unassigned;
В примере по ссылке из моего предыдущего поста, все переменные интерфейсов - локальные. Поэтому там явное обнуление не требуется.

Пример для случая, когда используются глобальные переменные. В программе надо стараться избавляться от использования глобальных переменных.
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
uses
  ComObj;
 
{Передача данных из таблицы типа TStringGrid на лист рабочей книги MS Excel.
Функция возвращает ссылку на интерфейс диапазона MS Excel, в который записалась таблица.
aSg - экземпляр типа TStringGrid, из которого берутся данные.
aExSh - ссылка на интерфейс рабочего листа MS Excel, на который следует поместить данные.
aRow, aCol - координаты ячейки на листе aExSh, начиная с которой следует разместить таблицу.}
function SgToExcel(aSg : TStringGrid; aExSh : OleVariant; const aRow, aCol : Integer) : OleVariant;
var
  vArr : Variant;
  exCell : OleVariant;
  i, j : Integer;
begin
  //Создаём вариантный массив с размером, соответствующим размеру таблицы.
  vArr := VarArrayCreate([1, aSg.RowCount, 1, aSg.ColCount], varOleStr);
  //Записываем в вариантный массив данные таблицы.
  for i := 1 to aSg.RowCount do
    for j := 1 to aSg.ColCount do
      vArr[i, j] := aSg.Cells[j - 1, i - 1];
  //Ссылка на ячейку, в которой расположится левый верхний угол таблицы.
  exCell := aExSh.Cells[aRow, aCol];
  //Определяем диапазон, в который мы запишем данные таблицы.
  Result := aExSh.Range[exCell, exCell.Offset[aSg.RowCount - 1, aSg.ColCount - 1]];
  //Записываем данные вариантного массива в диапазон.
  Result.Value := vArr;
end;
 
const
  //Толщина линий.
  xlThin = 2; //Тонкая линия.
  xlMedium = -4138; //Средняя толщина линии.
  //Вид линии.
  xlContinuous = 1; //Непрерывная линия.
var
  exApp, exBook, exSh, exRng : OleVariant;
 
//Пример использования функции SgToExcel().
procedure TForm1.Button1Click(Sender: TObject);
var
  Od : TOpenDialog;
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(Handle, 'Файл с заданным именем не найден. Действие отменено.',
      'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Попытка запустить экземпляр MS Excel и получить ссылку на интерфейс его корневого объекта.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(Handle, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Excel.
  exApp.Visible := True;
  //Открываем файл рабочей книги и получаем ссылку на её интерфейс.
  exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
  //Получаем ссылку на интерфейс первого листа рабочей книги.
  exSh := exBook.Worksheets[1];
  //Записываем данные из StringGrid на лист MS Excel, начиная с ячейки "D3" (="R3C4").
  //Функция возвращает ссылку на интерфейс диапазона, в который записались данные таблицы.
  exRng := SgToExcel(StringGrid1, exSh, 3, 4);
  
  //Оформляем таблицу - устанавливаем обрамление для ячеек таблицы.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlMedium;
  //Выравниваем ширину столбцов по содержимому.
  exRng.Columns.AutoFit;
  
  //Обнуление переменных интерфейсов, объявленных на глобальном уровне.
  //Порядок обнулений не имеет значения.
  exApp := Unassigned;
  exBook := Unassigned;
  exSh := Unassigned;
  exRng := Unassigned;
end;
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
27.01.2016, 10:56  [ТС] 9
Немного изменил ваш код.
Получилась процедура с локальными переменными. В процедуре эксель сделал невидимым и отключил показ ошибок. В конце добавил сохранение в файл и закрытие книги и самого экселя.

В таком виде программа при каждом нажатии кнопки создает процесс эксель, который закрывается только при закрытии самой программы.

Пробовал и с видимым экселем и включенными ошибками. Результат тот же.
Кажется, проблема в сохранении в файл...

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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, ComObj;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function SgToExcel(aSg : TStringGrid; aExSh : OleVariant; const aRow, aCol : Integer) : OleVariant;
var
  vArr : Variant;
  exCell : OleVariant;
  i, j : Integer;
begin
  //Создаём вариантный массив с размером, соответствующим размеру таблицы.
  vArr := VarArrayCreate([1, aSg.RowCount, 1, aSg.ColCount], varOleStr);
  //Записываем в вариантный массив данные таблицы.
  for i := 1 to aSg.RowCount do
    for j := 1 to aSg.ColCount do
      vArr[i, j] := aSg.Cells[j - 1, i - 1];
  //Ссылка на ячейку, в которой расположится левый верхний угол таблицы.
  exCell := aExSh.Cells[aRow, aCol];
  //Определяем диапазон, в который мы запишем данные таблицы.
  Result := aExSh.Range[exCell, exCell.Offset[aSg.RowCount - 1, aSg.ColCount - 1]];
  //Записываем данные вариантного массива в диапазон.
  Result.Value := vArr;
end;
 
//Пример использования функции SgToExcel().
procedure TForm1.Button1Click(Sender: TObject);
const
  //Толщина линий.
  xlThin = 2; //Тонкая линия.
  xlMedium = -4138; //Средняя толщина линии.
  //Вид линии.
  xlContinuous = 1; //Непрерывная линия.
var
  exApp, exRng,exBook, exSh: OleVariant;
  strgrd: TStringGrid;
  x,y: integer;
begin
  //Попытка запустить экземпляр MS Excel и получить ссылку на интерфейс его корневого объекта.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(Handle, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  if strgrd= nil then
    strgrd:= TStringGrid.Create(Form1);
  strgrd.ColCount:= 4;
  strgrd.RowCount:= 4;
  for y := 0 to strgrd.RowCount-1 do
    for x := 0 to strgrd.ColCount-1 do
      strgrd.Cells[x,y]:= 'test' + IntToStr(x);
  //Делаем невидимым окно MS Excel.
 
  exApp.Visible := False;
  exApp.DisplayAlerts:= False;
 
  //Открываем файл рабочей книги и получаем ссылку на её интерфейс.
  exBook:= exApp.WorkBooks.Add;
  //Получаем ссылку на интерфейс первого листа рабочей книги.
  exSh := exBook.Worksheets[1];
  //Записываем данные из StringGrid на лист MS Excel, начиная с ячейки "D3" (="R3C4").
  //Функция возвращает ссылку на интерфейс диапазона, в который записались данные таблицы.
  exRng := SgToExcel(strgrd, exSh, 1, 1);
 
  //Оформляем таблицу - устанавливаем обрамление для ячеек таблицы.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlMedium;
  //Выравниваем ширину столбцов по содержимому.
  exRng.Columns.AutoFit;
 
  if not (exBook.SaveAs('test.xlsx')) then
    ShowMessage('Не удалось сохранить!');
 
  exBook.Close;
  exApp.Quit;
end;
 
end.
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
27.01.2016, 12:55 10
Цитата Сообщение от boscher Посмотреть сообщение
В таком виде программа при каждом нажатии кнопки создает процесс эксель, который закрывается только при закрытии самой программы.
Пробовал и с видимым экселем и включенными ошибками. Результат тот же.
Судя по коду, COM-сервер MS Excel должен выгрузиться...
Цитата Сообщение от boscher Посмотреть сообщение
Кажется, проблема в сохранении в файл...
Там проблема может быть, только, если при сохранении возникло исключение. В этом случае последующие команды по выходу из MS Excel не будут выполнены.

Для проверки. Прикладывают проект, где всё работает, как положено - COM-сервер MS Excel выгружается при выходе управления из метода TForm1.Button1Click().
В случае исключения при сохранении файла, окно MS Excel показывается и включается режим показа предупреждений.
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
{Передача данных из таблицы типа TStringGrid на лист рабочей книги MS Excel.
Функция возвращает ссылку на интерфейс диапазона MS Excel, в который записалась таблица.
aSg - экземпляр типа TStringGrid, из которого берутся данные.
aExSh - ссылка на интерфейс рабочего листа MS Excel, на который следует поместить данные.
aRow, aCol - координаты ячейки на листе aExSh, начиная с которой следует разместить таблицу.}
function SgToExcel(aSg : TStringGrid; aExSh : OleVariant; const aRow, aCol : Integer) : OleVariant;
var
  vArr : Variant;
  exCell : OleVariant;
  i, j : Integer;
begin
  //Создаём вариантный массив с размером, соответствующим размеру таблицы.
  vArr := VarArrayCreate([1, aSg.RowCount, 1, aSg.ColCount], varOleStr);
  //Записываем в вариантный массив данные таблицы.
  for i := 1 to aSg.RowCount do
    for j := 1 to aSg.ColCount do
      vArr[i, j] := aSg.Cells[j - 1, i - 1];
  //Ссылка на ячейку, в которой расположится левый верхний угол таблицы.
  exCell := aExSh.Cells[aRow, aCol];
  //Определяем диапазон, в который мы запишем данные таблицы.
  Result := aExSh.Range[exCell, exCell.Offset[aSg.RowCount - 1, aSg.ColCount - 1]];
  //Записываем данные вариантного массива в диапазон.
  Result.Value := vArr;
end;
 
//Пример использования функции SgToExcel().
procedure TForm1.Button1Click(Sender: TObject);
const
  //Толщина линий.
  xlThin = 2; //Тонкая линия.
  xlMedium = -4138; //Средняя толщина линии.
  //Вид линии.
  xlContinuous = 1; //Непрерывная линия.
var
  exApp, exBook, exSh, exRng : OleVariant;
  Fn : String;
begin
  //Попытка запустить экземпляр MS Excel и получить ссылку на интерфейс его корневого объекта.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(Handle, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Excel.
  //exApp.Visible := True;
  //Создаём рабочую книгу и получаем ссылку на её интерфейс.
  exBook := exApp.WorkBooks.Add;
 
  //Записываем данные из StringGrid1 на первый лист MS Excel, начиная с ячейки "D3" (="R3C4").
 
  //Получаем ссылку на интерфейс первого листа рабочей книги.
  exSh := exBook.Worksheets[1];
  //Запись данных из StringGrid1 на лист MS Excel и получение ссылки
  //на интерфейс диапазона, в который записались данные таблицы.
  exRng := SgToExcel(StringGrid1, exSh, 3, 4);
  //Оформляем таблицу - устанавливаем обрамление для ячеек таблицы.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlMedium;
  //Выравниваем ширину столбцов по содержимому.
  exRng.Columns.AutoFit;
 
  //Сохраняем книгу и закрываем MS Excel.
  Fn := ExtractFilePath(ParamStr(0)) + 'files\';
  ForceDirectories(Fn);
  Fn := Fn + 'Книга1.xls';
  exApp.DisplayAlerts := False;
  try
    exBook.SaveAs(FileName:=Fn);
  except
    exApp.DisplayAlerts := True;
    exApp.Visible := True;
  end;
  exApp.Quit;
end;
 
//После создания формы. Заполнение данными экземпляра TStringGrid.
procedure TForm1.FormCreate(Sender: TObject);
var
  i, j, k : Integer;
  Sg : TStringGrid;
begin
  Sg := StringGrid1;
  k := 0;
  for i := 0 to Sg.RowCount - 1 do
    for j := 0 to Sg.ColCount - 1 do
    begin
      Sg.Cells[j, i] := FormatFloat('0000', 1000 + k);
      Inc(k);
    end;
end;
 
end.
Вложения
Тип файла: 7z StringGridToExcelWithVarArray-01.7z (186.9 Кб, 2 просмотров)
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
27.01.2016, 13:28  [ТС] 11
Спасибо! Но даже с вашим примером остается процесс excel. Проверял на нескольких ПК с разными версиями экселя(2010, 2013). Исключения при сохранении не возникали... Наверное, придется остановиться на версии с процедурой SgToExcel. Единственное неудобства при этом - форматирование диапазона...
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
27.01.2016, 13:40 12
Вообще-то, тот код, который я выложил - "железный". Т. е., использовался в разных ситуациях на разных компах - нигде такой проблемы никогда не возникало. Там и по теории не должно оставаться занятости COM-сервера.

Предлагаю для проверки в местных условиях запустить приложенные здесь программы, как есть - без перекомпиляции - прямо EXE файлы, которые лежат в архивах.
Одна версия - для MS Office 1997-2003, вторая - для MS Office 2007 и выше.

Коды отличаются только в строке № 97: расширение файла для MS Office 2003 - ".xls", для MS Office 2007 - ".xlsx".
Вложения
Тип файла: 7z SgToExcel2003.7z (186.9 Кб, 0 просмотров)
Тип файла: 7z SgToExcel2007.7z (186.9 Кб, 3 просмотров)
0
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
27.01.2016, 13:52  [ТС] 13
Ваши exe отрабатывают правильно, а вот созданный в моем rad xe7 почему-то нет.
В чем может быть проблема? Может знакомая ситуация была?
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
27.01.2016, 13:56 14
Почему в Delphi XE7 такая ситуация - не знаю... Вечером сегодня, когда до дома доберусь - проверю в одной из XE версий. Отпишусь о результатах.
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
27.01.2016, 16:36  [ТС] 15
Кажется, что проблема тут - exCell.
Если указать диапазон в формате ['A1', 'F10'], то все ок.
Если в формате [xl.cells[1,1], xl.cells[10,10]], то беда
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
28.01.2016, 13:33 16
Запустил программу, скомпилированную в Delphi XE7 - в самом деле, при каждом нажатии кнопки создаётся новый экземпляр COM-сервера MS Excel. И эти экземпляры выгружаются только при завершении программы. Видимо, баг, какой-то в этой версии...
1
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
28.01.2016, 13:43  [ТС] 17
Спасибо за все =)
Пока извращаюсь с Range['A1', 'F' + inttostr(y)]. Работает...
1
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
28.01.2016, 13:52 18
Цитата Сообщение от boscher Посмотреть сообщение
Пока извращаюсь с Range['A1', 'F' + inttostr(y)]. Работает...
Понятно. Похоже на то, что в каких-то ситуациях, при передаче интерфейсов в качестве параметров, неверно работает подсчёт ссылок (на эти интерфейсы). В результате счётчик интерфейса оказывается не нулевой и интерфейс не выгружается. Соответственно - не выгружается связанный с ним COM-сервер...
0
28.01.2016, 13:52
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2016, 13:52
Помогаю со студенческими работами здесь

Вставка скопированой строки в Excel
суть такова пользуюсь таким методом через OLE Variant C; ...

Автоматическая вставка даты изменений строки в Excel
Привет, форумчане! :pardon: Очень прошу помочь. На работе заполняю отчёт, в котором вручную...

Вставка элементов строки массива на лист Excel
Добрый день! К примеру, есть массив data(1 To 3, 1 To n). Необходимо вставить на некоторое место...

Из excel в txt с разделителями
Доброго времени суток уважаемый форумчане! Столкнулся с проблемой. необходимо Excel таблицу с 3...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru