Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Excel, добавление нового листа в конец, перевод VBA на C++ 
V
    Опции темы
Platov
Дата 27.6.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Работаю с Excel и столкнулся с неожиданной проблемой.

Ребята, помогите перевести добавление нового листа за последним листом.
на VBA это выглядит следующим образом:

Код

ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)


вторая часть проблем не вызвала:
Код

App.OlePropertyGet("Sheets").OlePropertyGet("Count")


А вот первая  smile  что я только не пробовал.
PM MAIL   Вверх
xvr
Дата 27.6.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



В С++ ActiveX нет позиционных аргументов (а After:= - это именно он и есть). Так что передавайте в ActiveWorkbook.Sheets.Add все аргументы (вплоть до аргумента After) со значениями по умолчанию (их можно посмотреть в хелпе по VBA в Excel'е)

PM MAIL   Вверх
Usper
Дата 27.6.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



В качестве After`а можно передать нужную страницу:

Код

#include <olectrls.hpp>
//....

    Variant App, Books, Book, Sheets, Sheet, Cells, Cell, Aft;
    try
    {
        App=CreateOleObject("Excel.Application");
    }
    catch (...)
    {
        Application->MessageBoxA("Не могу запустить сервер Microsoft Excel. Продолжение невозможно.",
            "Ошибка", MB_ICONERROR);
        return;
    }
    App.OlePropertySet("Visible",true);  //делаем Excel видимым
    Books=App.OlePropertyGet("Workbooks");
    App.OlePropertySet("SheetsInNewWorkbook",5); 
    Books.OleProcedure("Add");
    Book=Books.OlePropertyGet("Item",1);
    Sheets=Book.OlePropertyGet("Worksheets");
    
    //.....

    int Count = Sheets.OlePropertyGet("Count");
    Aft=Sheets.OlePropertyGet("Item",Count);
    Sheets.OleFunction("Add",EmptyParam, Aft);



--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 27.6.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Спасибо.

С помощью
Код

    int Count = Sheets.OlePropertyGet("Count");
    Aft=Sheets.OlePropertyGet("Item",Count);
    Sheets.OleFunction("Add",EmptyParam, Aft);

у меня получилось добавить новый лист только предпоследним.
PM MAIL   Вверх
Usper
Дата 27.6.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Хм... у меня всё работает. У вас какая версия офиса? Весь код, касающийся экспорта в Excel, приведите пожалуйста.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 27.6.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Офис у меня 2003

вот пример того что я делаю.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  AddSheet.rar 275,72 Kb
PM MAIL   Вверх
Usper
Дата 27.6.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Ну дык:
Код

Sh.OleFunction("Add",aft);

а где второй параметр? Вполне возможно Excel, видя только один параметр метода "Add" воспринимает его как страницу перед которой надо воткнуть новую. Как писАл xvr просто так опускать параметры не допускается.

Это сообщение отредактировал(а) Usper - 27.6.2011, 20:09


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 28.6.2011, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Цитата(Usper @  27.6.2011,  20:07 Найти цитируемый пост)
а где второй параметр?

а с ним вообще не работает. 

PM MAIL   Вверх
Usper
Дата 28.6.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Что значит не работает? У вас в проекте я не вижу подключенного модуля olectrls.hpp. Без этого модуля среда будет ругаться на EmptyParam.
Свой проект прилагаю.

З.Ы. хотя этот модуль нужен в шестом билдере, нужен ли он в более новых я не знаю.

Это сообщение отредактировал(а) Usper - 28.6.2011, 09:18

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  megadelmeproject.zip 252,59 Kb


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 28.6.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



если компилировать в 2009ом то выполнение Sheets.OleFunction("Add",EmptyParam, Aft); приводит к ошибке.
а вот программа откомпилированная в 6ом работает без ошибки.

Возможно мне это не победить. И придётся вставлять листы не в конец как планировалось а в начало.
PM MAIL   Вверх
Usper
Дата 28.6.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Какая ошибка то?

Интернеты, кстати, говорят, что в 2009 билдере есть проблема с EmptyParam. Билдеровская справка что-нибудь знает про EmptyParam?

Это сообщение отредактировал(а) Usper - 28.6.2011, 13:58


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 28.6.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Ошибка очень интересная  smile 

"Ошибка"
PM MAIL   Вверх
Usper
Дата 28.6.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



А если написать так:
Код

...
Sheets.OleFunction("Add",EmptyParam(), Aft);
...

(EmptyParam это вроде функция теперь).


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Platov
Дата 28.6.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



 smile 
УРА.

Надо было сразу исходник почитать. И вправду функция!

Usper - большое спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.