Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка диапазона Excel  (Прочитано 6845 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DID
Новенький

ru
Offline Offline

« : 02-09-2010 11:02 » 

Добрый день.

Пытаюсь из VC6.0 отсортировать диапазон данных на странице Excel:

Код:
//....

using namespace Excel;
CoInitialize(NULL);

_ApplicationPtr pXL;

pXL.CreateInstance(L"Excel.Application");

WorkbooksPtr pBooks = pXL->GetWorkbooks();
_WorkbookPtr pBook  = pBooks->Open((_bstr_t)filename,vtMissing,VARIANT_FALSE);
WorksheetsPtr pSheets = pBook->GetSheets();
_WorksheetPtr pSheet = pSheets->GetItem((long)1);
         
pSheet->Activate();


RangePtr pRangeSort;
LPDISPATCH lpdisp;
_variant_t var[3];

lpdisp = pSheet->GetRange((_bstr_t)"C3",(_bstr_t)"C10");
var[0].vt = VT_DISPATCH;
var[0].pdispVal = lpdisp;

lpdisp = pSheet->GetRange((_bstr_t)"D3",(_bstr_t)"D10");
var[1].vt = VT_DISPATCH;
var[1].pdispVal = lpdisp;

lpdisp = pSheet->GetRange((_bstr_t)"A3",(_bstr_t)"A10");
var[2].vt = VT_DISPATCH;
var[2].pdispVal = lpdisp;

pRangeSort = pSheet->GetRange((_bstr_t)"A3",(_bstr_t)"D10");
pRangeSort->Select();

pRangeSort->Sort(var[0], xlAscending,
          var[1], vtMissing, xlAscending,
var[2], xlAscending,
xlNo,
(long)1,
VARIANT_FALSE,
xlSortColumns,
xlPinYin,
xlSortNormal,
xlSortNormal,
xlSortTextAsNumbers);

//.....

Вызов метода Sort некорректен, но причину понять не могу.
(Под дебагером на этой строке выскакивает эксепшн: (OLEAUT32.DLL):OxC0000005: Access Violation)

Может быть кто-нибудь делал похожее (задачка то тривиальная), ну или просто видит ясным взглядом, где я лопухнулся... подскажите пожалуйста)
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 02-09-2010 11:17 » 

DID, на VC6 не делал, но делал на C#. Переводить код не буду, но посмотри на этот кусок - может, поможет..
После get_Range() я еще беру свойство Columns. Не помню уже точно - зачем, но тогда это заработало для Range. Попробуй что-нибудь похожее.
Код: (Text)
Excel._Worksheet summary = (Excel._Worksheet)xls.Sheets["Summary"];
Excel.Range rng;
rng = summary.get_Range("A1:K300", Missing.Value).Columns;
rng.NumberFormat = "0.00";
rng.AutoFit();
rng.Calculate();
Сорри за невнятный и, возможно, неправильный, ответ.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 02-09-2010 11:25 » 

проверять валидность переменных и объектов (к примеру, указатель == 0)

особенно обратить внимание на
pRangeSort - этот
var - этот

Улыбаюсь


Записан

DID
Новенький

ru
Offline Offline

« Ответ #3 : 03-09-2010 06:24 » 

Спасибо всем за помощь, разобрался)

Действительно проблемы были с pRangeSort и с var

Правда с pRangeSort до конца не понял почему этот код:
Код:
	 		 
RangePtr pRangeSort;
pRangeSort = pSheet->Range[(_bstr_t)"A3:AA10"];
pRangeSort->Select();
pRangeSort->Sort( //....
не идентичен этому (и Select() убирал все равно):
Код:
	
pSheet->Range[(_bstr_t)"A3:D10"]->Sort( //....

Но вот так вроде работает все корректно:
Код:
        
//....

_variant_t var[3];

var[0].vt = VT_DISPATCH;
var[0].pdispVal = pSheet->Cells->GetItem((long)3, (long)3); //C3
 
var[1].vt = VT_DISPATCH;
var[1].pdispVal = pSheet->Cells->GetItem((long)3, (long)4); //D3
 
var[2].vt = VT_DISPATCH;
var[2].pdispVal = pSheet->Cells->GetItem((long)3, (long)1); //A3

pSheet->Range[(_bstr_t)"A3:D10"]->Sort(var[0], xlAscending,
       var[1], vtMissing, xlAscending,
       var[2], xlAscending,
       xlNo,
       (long)1,
       VARIANT_FALSE,
       xlSortColumns,
       xlPinYin,
       xlSortNormal,
       xlSortNormal,
       xlSortTextAsNumbers);

//.....

Еще раз спасибо =)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 03-09-2010 07:14 » 

а тип RangePtr как определён ? Может , там загвоздка
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines