Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  12:54[Войти] | [Зарегистрироваться]
Ответ на вопрос № 65805

15-10-2008 06:12
Привет королевству! Не поможете разобраться с сортировкой в столбце для Excel 2007? Был уже везде где только можно, в списке вопросов нашел решение, но только для Excel 2003, что мне не подходит. Вот так оно выглядит в тексте:

ExcelWorksheet1.Cells.Range['B2','B100'].Sort(
ExcelWorksheet1.Cells.Range['B2','B7'],
xlAscending,
EmptyParam,
EmptyParam,  //Type
EmptyParam,
EmptyParam,
EmptyParam,
xlGuess,
EmptyParam,  //OrderCustom
false, 
xlSortColumns, //Orientation
xlTopToBottom,
xlStroke,  //SortMethod
xlSortNormal,
EmptyParam,
EmptyParam);



Должно вроде бы все правильно быть, брал значения параметров с сайта MSDN для MS Excel 2007. Однако на все попытки выдает одну и ту же ошибку класса EVariantTypeCastError о невозможности перекодировать варианту типа Error в булевский тип. Какой же из 15 параметров неверен? Имел похожие неудобства с открытием xlsx-файла и с его сохранением, там тоже океан параметров, но там удалось подобрать нужную комбинацию. Здесь же никак не получается.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

02-12-2008 06:32 | Комментарий к предыдущим ответам
Все получилось? Я просто не проверяю старые ответы... Если еще есть вопросы, то пишите в ICQ http://www.delphikingdom.com/asp/users.asp?ID=1262

16-10-2008 12:19
Большое спасибо за проделанный труд! Завтра попробую, вдруг что получится. А версия Excel у меня действительно 12-я с чем-то еще. Это означает только возможность сортировать с помощью второго метода - позднего связывания? Но там же опять вроде как OleVariant выплывает :-0 Правильно ли я Вас понял, что методом Sort объекта Range сделать это для MS Excel 2007 в настоящий момент не представляется возможным? И еще интересный вопрос по поводу библиотеки Microsoft Excel 12.0 Object Library. Куда Вы ее импортировали - в Delphi или просто зарегили в системе? Мне ее тоже нужно подключить, чтобы заработало? Извиняюсь заранее, если мои вопросы кажутся тупыми :)

16-10-2008 02:35
Докладываю о проведённых экспериментах... MS Office 2007 (ru).
Micrisoft Visual C# 2008 express:

        // Подготовка объекта сортировки
        ASheet.Sort.SortFields.Clear();
        ASheet.Sort.SortFields.Add(ASheet.get_Range("B4:B18", Type.Missing), Excel.XlSortOn.xlSortOnValues,
          Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortDataOption.xlSortNormal);
        ASheet.Sort.SetRange(ASheet.get_Range("B3:B18", Type.Missing));
        ASheet.Sort.Header = Excel.XlYesNoGuess.xlYes;
        ASheet.Sort.MatchCase = false;
        ASheet.Sort.Orientation = Excel.XlSortOrientation.xlSortColumns;
        ASheet.Sort.SortMethod = Excel.XlSortMethod.xlStroke;
        ASheet.Sort.Apply(); // применяем сортироку

Работает! Теперь Delphi for Win32 (BDS2006). Я импортировал библиотеку Microsoft Excel 12.0 Object Library чтоб испробовать раннее связывание - работает!

    ASheet := XL.ActiveSheet as _Worksheet;
    // Подготовка объекта сортировки
    ASheet.Sort.SortFields.Clear;
    ASheet.Sort.SortFields.Add(ASheet.Range['B4:B18', EmptyParam], xlSortOnValues,
      xlAscending, EmptyParam, xlSortNormal);
    ASheet.Sort.SetRange(ASheet.Range['B3:B18', EmptyParam]);
    ASheet.Sort.Header := xlYes;
    ASheet.Sort.MatchCase := False;
    ASheet.Sort.Orientation := xlSortColumns;
    ASheet.Sort.SortMethod := xlStroke;
    ASheet.Sort.Apply; // применяем сортироку

Ну и попробуем позднее связываение:

var SortObj: OleVariant;
...
    // Подготовка объекта сортировки
    SortObj := ASheet.Sort;
    SortObj.SortFields.Clear;
    SortObj.SortFields.Add(ASheet.Range['B4:B18', EmptyParam], xlSortOnValues,
      xlAscending, EmptyParam, xlSortNormal);
    SortObj.SetRange(ASheet.Range['B3:B18', EmptyParam]);
    SortObj.Header := xlYes;
    SortObj.MatchCase := False;
    SortObj.Orientation := xlSortColumns;
    SortObj.SortMethod := xlStroke;
    SortObj.Apply; // применяем сортироку

Как и ожидалось работает тоже. Так что придется проверять версию Excel, если 12 и выше, то работать через позднее связывание, если нужна поддержка более ранних версий офиса.
Вот такие очередные грабли приготовила нам корпорация Майкрософт :-)

15-10-2008 12:14
Ок, интересно было бы взглянуть на результаты Ваших экспериментов. Авось получится отсортировать встроенным методом, а не изобретать лисапед с помощью переменной типа OleVariant :)

15-10-2008 09:54 | Комментарий к предыдущим ответам
В ЧаВо используется юнит Excel2000, потому параметров и не хватает, но я пробовал с ExcelXP - не работает, пишет "неправильная ссылка" (естественно, ведь уже объект). У меня появилась идея - завтра попробую сортировку из Visual C# 2008, там должна быть ссылка уже на нужную сбоку Microsoft.Office.Interop.Excel.dll

15-10-2008 09:42 | Комментарий к предыдущим ответам
>>>библиотеками типов теперь ячейки не отсортировать...
В смысле теми библиотеками ExcleXXX.pas, что в поставке BDS2006. Нужно попробовать импортировать библиотеку Excel2007

15-10-2008 09:40
Записанный макрос показывает что кое что изменилось в Excel 2007 в местоде Sort:

Sub Макрос1()
' Макрос1 Макрос
'
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("B4:B18"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Лист1").Sort
        .SetRange Range("B3:B18")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Здесь уже метод сорт принадлежит Worksheet вместо Range, как у предыдущих версий, да и сам сорт уже не метод, а тоже объект (или класс?). Хм... Совместимость потеряна :(
Т.е. библиотеками типов теперь ячейки не отсортировать...
Мдя уж... Worksheet.Sort Property Sort Object

15-10-2008 08:57
Я тоже использую юнит ExcelXP, насчет версии TLB не знаю, не приходилось прежде вплотную с этим сталкиваться. Вариант из ЧаВо не проходит - мой BDS 2006 все время сообщает, что мало параметров :(

15-10-2008 08:56 | Комментарий к предыдущим ответам
К стати, Excel 2007 замечательно работает через ExcelXP.pas, разве что XP ничего не знает про новый формат файла xlsx.

15-10-2008 08:04
Если вы внимательно посмотрите на Как отсортировать область ячеек? , то заметите что практически все параметры заданы, даже если они не нужны по логике или описаны на MSDN как optional. Это связано с конвертированием данных "на лету"...

>>>Должно вроде бы все правильно быть, брал значения параметров с сайта MSDN для MS Excel 2007
В ссылке, что я указал, используется юнит ExcelXP. Интресно какую версию TLB используете вы ;)
Если не получится, будем искать вместе :)

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования