Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2016, 09:40   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Массив типа Variant

Добрый день.

Как можно вывести содержимое массива типа Variant?
И как перед выводом поменять местами весь 14й столбец с 20м и 15й с 21м? Заранее благодарю за ответ.

Массив заполняю таким образом (Querys: TADOQuery; ArrayData: Variant):
Код:
Querys.DisableControls;
   Querys.First;
   While Not Querys.eof Do
   Begin
       For J := 1 To Querys.FieldDefs.Count Do
       Begin
           ArrayData[Querys.RecNo, J] :=
            Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
       End;
       Querys.Next;
   End;
   Querys.EnableControls;
Я потом этими данными заполняю шаблон Excel.

И еще: нужно, чтобы 5 столбцов скажем так не перебили формулы из шаблона. Т.е. в шаблоне будут формулы, по которым будет рассчитываться значение ячеек этих самых 5ти столбцов.
1-14 данные
15-19 формулы
20-21 данные
Надеюсь корректно и понятно объясняюсь.

Очень нужна Ваша помощь, коллеги!

Последний раз редактировалось nactyx; 05.08.2016 в 09:52.
nactyx вне форума Ответить с цитированием
Старый 05.08.2016, 10:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Как можно вывести содержимое массива типа Variant?
Куда вывести? На всякий случай - есть функция VarType
Цитата:
И как перед выводом поменять местами весь 14й столбец с 20м и 15й с 21м?
Это можно и в цикле чтения из набора данных - анализируй значение j и меняй индекс заполнения массива
Цитата:
нужно, чтобы 5 столбцов скажем так не перебили формулы из шаблона.
Не заполняй эти столбцы в шаблоне при выгрузке
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2016, 10:53   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не заполняй эти столбцы в шаблоне при выгрузке
А как это можно сделать? Если я вывод делаю таким образом:
Код:
//Область, в которую будем выводить данные
   //Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
   Range := WorkBook.WorkSheets[1].Range['$B$8:$W$12'];

//А вот и сам вывод данных
//Намного быстрее поячеечного присвоения
   Range.Value := ArrayData;

Последний раз редактировалось nactyx; 05.08.2016 в 10:56.
nactyx вне форума Ответить с цитированием
Старый 05.08.2016, 11:10   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно же два массива формировать, каждый для своей непрерывной области ячеек
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2016, 11:25   #5
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Пытаюсь реализовать два массива:

Код:
 // Размеры выводимого массива данных
   RowCount := Querys.RecordCount;
   ColCount := Querys.FieldDefs.Count;

 // Создание Excel
   ExcelApp := CreateOleObject('Excel.Application');

 // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   ExcelApp.Application.EnableEvents := false;

 //  Создаем Книгу (Workbook)
 //  Если заполняем шаблон, то
   Workbook := ExcelApp.WorkBooks.Add(ShFile);
   ArrayData := VarArrayCreate([1, RowCount, 1, 14], varVariant);
   ArrayData2 := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

 // Заполняем массив 1
   Querys.DisableControls;
   Querys.First;
   While Not Querys.eof Do
   Begin
       For J := 1 To 14 Do
       Begin
           ArrayData[Querys.RecNo, J] :=
            Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
       End;
       Querys.Next;
   End;
   Querys.EnableControls;
 // Заполняем массив 1

 // Заполняем массив 2
   Querys.DisableControls;
   Querys.First;
   While Not Querys.eof Do
   Begin
       For J := 20 To 22 Do
       Begin
           ArrayData2[Querys.RecNo, J] :=
            Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
       End;
       Querys.Next;
   End;
   Querys.EnableControls;
 // Заполняем массив 2

//Левая верхняя ячейка области, в которую будем выводить данные
   Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
//Правая нижняя ячейка области, в которую будем выводить данные
   Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1,
    BeginCol + ColCount - 1];

//Область, в которую будем выводить данные
   //Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
   Range := WorkBook.WorkSheets[1].Range['$B$8:$N$12'];
   Range2 := WorkBook.WorkSheets[1].Range['$T$8:$W$12'];

//А вот и сам вывод данных
//Намного быстрее поячеечного присвоения
   Range.Value := ArrayData;
   Range2.Value := ArrayData2;
Теперь с 1го по 14й огонь. Далее с 15 по 19й формулы считаются, всё супер. А последнее, с 20го по 22й - пустота. Не могу понять, что делаю не так. Понимаю, что косяк со вторым массивом, но не понимаю где и в чем.

Последний раз редактировалось nactyx; 05.08.2016 в 11:34.
nactyx вне форума Ответить с цитированием
Старый 05.08.2016, 11:58   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ArrayData2[Querys.RecNo, J] :=
Дядя второй индекс в массиве будет правильно задавать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2016, 12:13   #7
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Дядя второй индекс в массиве будет правильно задавать?
А как именно?

Я уже кучу вариантов перепробовал, получается все время муть какая-то.

Я понимаю, что косяк в одном или обоих из этих "кусков" кода:
тут:
Код:
ArrayData2 := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
и/или тут:
Код:
For J := 20 To 22 Do
       Begin
           ArrayData2[Querys.RecNo, J] :=
            Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
       End;
Но как правильно понять не могу

О да, я сделал!!!

Еще вопрос: как здесь правильно использовать переменную?
Код:
   Range := WorkBook.WorkSheets[1].Range['$B$8:$N$12'];
   Range2 := WorkBook.WorkSheets[1].Range['$T$8:$W$12'];
Вместо цифры 12, например.

И еще вопрос, надеюсь, что последний:

Вот так в исходном состоянии выглядит мой шаблон. Я его программно заполняю, но если строк в итоге, например, 5, то эта пустота снизу остается. А мне надо, чтобы после 5й последней строки шла "подбивочка", т.е. строка "Итого:", начальник, внешние, внутренние следовали сразу за данными. Как это реализовать? Заранее благодарю.

Последний раз редактировалось Аватар; 05.08.2016 в 18:38.
nactyx вне форума Ответить с цитированием
Старый 05.08.2016, 12:50   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вроде так, точно не помню: WorkBook.WorkSheets[1].Rows(i).Delete в цикле от конца. Возможно и удаление выделенных строк или по интервалу есть одной командой
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2016, 14:19   #9
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Вроде так, точно не помню: WorkBook.WorkSheets[1].Rows(i).Delete в цикле от конца. Возможно и удаление выделенных строк или по интервалу есть одной командой
Спасибо за очередную подсказку.
Сделал вот так:
Код:
   WorkBook.WorkSheets[1].Rows['13:90'].Select;
   ExcelApp.Selection.Delete;
А как быть в том случае, если строк наоборот больше, и эту "подбивочку" надо вырезать и перенести ниже или же вставить строк может.
nactyx вне форума Ответить с цитированием
Старый 05.08.2016, 14:23   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну с удалением разобрался же. Аналогично ищи как вставить строки с сохраненим форматирования
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать Variant и Массив в функцию VBA sir.andrey Помощь студентам 0 13.04.2013 06:23
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
массив типа запись Fufichek Помощь студентам 5 11.07.2011 21:44
массив типа string dollemika Помощь студентам 13 02.05.2009 23:15
Variant to Stream & Variant from Stream Oreol Общие вопросы Delphi 1 24.03.2009 13:14