Delphi excel сортировка по столбцу
Я пишу программу на Delphi 10 / Seattle для управления Excel 2013. Мне нужно выполнить сортировку по столбцу. У столбца есть заголовки. Пока мой код компилируется, фактическая команда SORT выдает ошибку «Не удалось преобразовать вариант типа (Ошибка) в тип (логический)». Короче говоря, у меня неверный параметр, но я не могу определить КАКОЙ параметр. Я просмотрел синтаксис MS (URL-адрес указан ниже), но не нашел ничего неправильного. Вот рабочий образец, который показывает проблему. Я ДЕЙСТВИТЕЛЬНО создал свою собственную библиотеку типов, которая находится в предложении USES.
2 ответа
Есть несколько параметров, вызывающих нарушение. Что с ними не так, им не нравится EmptyParam , хотя это то, что мы должны передать в качестве неиспользуемого необязательного параметра.
Вот возможный систематический подход, который может помочь найти рабочее решение:
- Сначала используйте позднее связывание, передавая как можно меньше параметров.
- Заполните все оставшиеся параметры EmptyParam , проверьте, затем адаптируйте вызов к раннему связыванию.
- Справа налево заменяйте неиспользуемые необязательные параметры фактическими значениями, пока не получите другую ошибку или не заставите ее работать.
Вот мой рабочий образец:
Наконец, я рад, что параметр Type не пожаловался на передачу EmptyParam , потому что я не понимаю, что это такое.
Старый ответ следует:
Я проверил ваши параметры с помощью маршрута IDispatch / Invoke, позднее связывание, как правило, у него более высокая вероятность приступить к работе, несмотря на потерю некоторой производительности и безопасности типов. Ни один из них не ошибается, я тестировал и другие ключи. Хотя параметры не являются неправильными, Excel выдает ошибку, если используется раннее связывание. Вот один рабочий пример:
Думаю, у вас было несоответствие требуемым параметрам. Ты должен попытаться
Удалите все непонятные параметры и замените их на Emptyparam, даже «true» или «false» иногда могут быть неясными, иногда мне приходилось использовать «wordbool (1)» или «msotrue» в коде Delphi вместо true
Таблица Delphi в Excel сортировка
Есть программа в delphi открывает excel таблицу. Как сделать чтобы при нажатии на кнопку.
Работа с таблицами Excel
есть вот такая таблица .
Работа с таблицами Excel
Создать таблицу со следующими реквизитами: тема, подтема, наименование книги, автор, кол. экземп.
Работа с таблицами excel
Доброго времени суток!Нужно решить задачу,а я чет не могу понять как сделать,помогите гуру.
по русски напишите что вы хотите
у вас в коде никаких DBGrid'ов нет, только открытие экселя
хотите что бы экселька быстрее открывалась - уходите от CreateOleObject('Excel.Application')
Да ошибочка вышла у меня String Grid . Таблица Excel загружается в него всё работает просто подождать нужно. Мне нужна её сортировка там же в String Grid по дате: Год Месяц День. У меня почти получилось вот код нужной мне программы ,мне нужно перенести в свою программу,код которой я описал выше. Вот код нужной программы. Где в коде написан комментарий //считываем значение из каждой ячейки и проверяем на совпадение по 5 столбцу (должность) нужно это переделать под ГОД МЕСЯЦ ДЕНЬ. Когда пишу этот код мой Delphi ругается вот [Error] Unit5.pas(107): Undeclared identifier: 'Xls_Open_filter'
Вот Identifier redeclared <Имя>. <Имя>описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока. Что надо сделать? Удалить?Имя>
Когда пишу этот код мой Delphi ругается вот [Error] Unit5.pas(107): Undeclared identifier: 'Xls_Open_filter'
Ну вот сам внимательно посмотри на текст ошибки:
Unit5.pas(107): Undeclared identifier: 'Xls_Open_filter'
Что означает: "Необъявленный идентификатор 'Xls_Open_filter' в модуле Unit5 в строке 107
Что такое Xls_Open_filter? Это процедура, реализованная в модуле Unit1. Она доступна только внутри модуля Unit1, а ты пытаешься ее вызвать из модуля Unit5. Вот и вся ошибка.
. Но да будет слово ваше: да, да; нет, нет; а что сверх этого, то от лукавого. (Мф.,5-37)
но показывает, как параметрами Sort, в частности, являются вариантные типы - через них заданы колонки для сортировки. Так что для того, что бы докончить ваш код осталось совсем чуть-чуть. |
Мил человек, меня поражает Ваше искусство уходить от прямого ответа: либо Вы его не знаете, либо просто насмехаетесь, - что несколько даже обидно. Именно Вашего "совсем чуть-чуть" мне и не перейти. Мне не надо показывать, что
параметрами Sort, в частности, являются вариантные типы - через них заданы колонки для сортировки |
- я не слепой и в списке параметров разбираюсь.
Я просил - и все еще прошу! - о вполне конкретной помощи (читай: услуге!) в написании конкретной строки программного кода. Вы же талантливо (ловко?) предлагаете мне теоретические общие посылки.
Либо Вы беретесь мне помочь, - тогда помогайте. Либо Вы не беретесь - тогда не будите во мне надежду. Я, как это ни обидно, откажусь от этого пути, - варианты всегда есть и много их. А ждать помощи - и получать что-либо наподобие Ваших. намеков - лучше ничего не получать, честное слово!
С глубоким к Вам уважением, Дельфиненок
У меня орёт в рантайме
EVariantCastError "Could not convert of type (Error) into type (Boolean)"
Попробуй частично использовать позднее связывание.
Такая байда у меня работает . (D7, Excel XP/2003)
Спасибо, уважаемый Wild User!
Ниже с чуйством удовлетворения привожу работающую сортировку (Sort).
Имеется лист Excel с границами ("А2", "E100") - первая строка, как обычно - шапка. Ключи сортировки: первый (Key1) - "Е2", второй - "А2" и третий - "В2".
Тогда вызов сортировки записывается так:
И это - раннее связывание, что и требовалось.
Можно и через позднее, через OleVariant, но мне не нравится, немного дебильная, на мой вкус, конструкция.
У меня орёт в рантайме EVariantCastError "Could not convert of type (Error) into type (Boolean)" |
Сие проистекает из списка параметров. Большинство - OleVariant, - для них EmptyParam, часть TOleNum - здесь я ставил нули, где не доставало ума TOleNum - это LongWord, т.е. по жизни - целые (?). Если параметр TOleNum попал на место OleVariant - идет попытка конверсии - отсюда весь базар. ИМХО В твоем случае не на месте False - с попыткой привести его к типу Error. Почему Error? Ну, почему-то отладчик при останове сигналит по поводу значения EmptyParam - Error(-23456789) - что-то вроде этого. Не помню числа.
Самое смешное - это желанный параметр Type_ - он оказалса из группы констант XlSortType - никогда бы не додумался. - все же доков никаких. ну или почти никаких. Так, намеки одни!
Заодно (до кучи!) приведу правильный вызов поиска (Find) по листу Excel. В данном случае поиск идет по столбцу с фамилиями в столбце "А":
Кстати, обрати внимание на экзотику: Range['E2',EmptyParam]. Сильная штука этот самый EmptyParam, посильнее "Фауста" Гете
Рассказал бы я по этому поводу о двух мухах на оконном стекле. Но неззя!
А можно поблагодарить тебя за соучастие и за помощь. Мне было интересно с тобой говорить, чесслово! Хоть и не всегда приятно.
_guest_ ( 2013-12-17 13:51 ) [0]
Не могу разобрать текст по столбцам в Excel XP из Delphi XE4. А вообще задача конвертировать из csv в xls (если может кто подскажет другие способы кроме построчного). В бейсике макрос такой:
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), Array(51, 1), Array(52, 1), _
Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array( _
59, 1), Array(60, 1), Array(61, 1), Array(62, 1), Array(63, 1), Array(64, 1), Array(65, 1), _
Array(66, 1), Array(67, 1), Array(68, 1), Array(69, 1), Array(70, 1), Array(71, 1), Array( _
72, 1)), TrailingMinusNu
Пробую так, открывая файл csv, а сохраняя в xls:
.
ExcelApp: TExcelApplication;
ExcelWB: TExcelWorkbook;
ExcelWS: TExcelWorksheet;
FieldInfo: OleVariant;
.
try
ExcelApp.ConnectKind := ckRunningOrNew;
ExcelApp.Connect;
ExcelApp.Workbooks.Add(CSVFileName, LOCALE_USER_DEFAULT);
ExcelWB.ConnectTo(ExcelApp.ActiveWorkbook);
ExcelWS.ConnectTo(ExcelWB.Worksheets[1] as _Worksheet);
ColMax := 72; //столбцов
FieldInfo := VarArrayCreate([0, ColMax], varVariant);
for I := 0 to ColMax do
FieldInfo[i] := VarArrayOf([i, 1]);
ExcelWS.Range["A1", "A100000"].TextToColumns(ExcelWS.Range["A1", "A1"], xlDelimited, xlDoubleQuote, False, True, False, False, False, False, "", FieldInfo, ".", "", True);
ExcelApp.ActiveWorkbook.SaveAs(XLSFileName, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, xlNoChanges, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, 0, LOCALE_USER_DEFAULT);
Отрабатывает, но изменений нет.
Не могу найти примеров под Excel XP, все только под старые, а похоже много чего изменилось, например, не могу найти Selection чтобы Selection.TextToColumns и так далее. Подскажите, пожалуйста, в чем ошибка в моем коде.
Ega23 © ( 2013-12-17 14:18 ) [1]
Подготавливаешь вариантный массив из своих значений. Потом одним чохом вставляешь:
"
ChDir "D:\"
Workbooks.Open Filename:="D:\test.csv"
ActiveWorkbook.SaveAs Filename:="D:\test.xls", FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End Sub
_guest_ ( 2013-12-17 15:10 ) [3]
> Ega23 © (17.12.13 14:18) [1]
Речь идет о десятках мегабайт, хотелось бы обойтись средствами самого Excel"а раз уж он это умеет.
> sniknik © (17.12.13 14:21) [2]
> универсальный пример, стартуешь макрос, делаешь "руками".
> смотришь что получилось
Макрос, сделанный "руками", я привел в самом начале, попробовал адаптировать, но не очень удачно. Не нашел: Selection, Columns и не очень разобрался с FieldInfo. В Делфи7 и Excel97 прекрасно отрабатывала связка ExcelWS.Columns[1].Select;
ExcelWS.Selection.TextToColumns;
сейчас не работает, я изменил код - результата не получил, если кто видит ошибку, подскажите.
_guest_ ( 2013-12-17 15:13 ) [4]
Т.е. файл то сохраняется, но без разбивки на столбцы, ошибок при работе не выдает :(
но вообще, нафиг не нужен, см. пример "моего" макроса.
← →_guest_ ( 2013-12-17 15:43 ) [6]
> sniknik © (17.12.13 15:18) [5]
Я далек от мысли, что Вы предлагаете мне поменять расширение файла, так как у меня после отработки Вашего макроса, по большому счету, только это и происходит, из чего заключаю, что преобразование у Вас происходит на этапе открытия файла. Какие настройки у пользователя будут стоять, я не знаю. У меня вот автоматом не преобразовывает, хотя расширение csv/tsv файла должно бы однозначно говорить о его содержимом. Вопрос пока для меня остается открытым.
_guest_ ( 2013-12-17 15:51 ) [7]
Поправочка: с расширением tsv (а в качестве разделителя используется таб) содержимое преобразуется автоматически. Надо полагать, что если разделителем поставить запятую, то и csv откроется правильно. С практической точки зрения, задача решена. Но все-таки на будущее хотелось бы довести и преобразование вручную до ума - может пригодиться, так что пока еще сам поэкспериментирую и подожду, вдруг кто поможет.
← →_guest_ ( 2013-12-17 15:59 ) [8]
Кроме того разделителем может оказаться и какой-либо другой символ. Так что на расширение файла полагаться наверно не стоит. По хорошему то надо бы пойти посмотреть biff, но что-то мне подсказывает, что это надолго, а со временем - не очень.
← →_guest_ ( 2013-12-17 17:10 ) [9]
Если кому интересен работающий вариант, то вот он:
ExcelWS.Range["A1", "A1"].EntireColumn.TextToColumns(ExcelWS.Range["A1", "A1"],
xlDelimited, xlDoubleQuote, False, True, False, False, False, False, EmptyParam,
null, ".", EmptyParam, True);
Чем EmptyParam лучше чем ""(пустая строка) в качестве ThousandsSeparator я не понимаю, но очевидно лучше :) я с вариантами почти не сталкиваюсь. С null тоже работает.
← →sniknik © ( 2013-12-17 18:30 ) [10]
> хотя расширение csv/tsv файла должно бы однозначно говорить о его содержимом.
csv не однозначный формат, с другой стороны то в каком виде читать настраивается, для примера полная (не уверен, тоже из макроса, что поставило то поставило) форма открытия
Workbooks.OpenText Filename:="D:\test.csv", Origin:=1251, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
:=False, Tab:=False, Semicolon:=False, Comma:=True, Space:=False, _
Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)) _
, TrailingMinusNumbers:=True
> Для csv существует спецификация
а ты думаешь откуда я свои знания почерпнул? именно в спецификации (справке excel) и написано -
Format - Должен иметь одно из следующих значений: «TabDelimited», «CSVDelimited», «Delimited» () или «FixedLength». Разделителем для формата «Delimited» может служить любой одиночный символ кроме символа прямых кавычек (").
sniknik © ( 2013-12-18 10:36 ) [15]
+
> кроме символа прямых кавычек (").
и его можно, просто до этого сменить TextDelimiter.
_guest_ ( 2013-12-18 11:12 ) [16]
> sniknik © (18.12.13 10:17) [14]
> sniknik © (18.12.13 10:36) [15]
Да я все это прекрасно понимаю. И код Ваш рабочий и спасибо еще раз за него. Я и хотел подчеркнуть возможные нюансы в работе с csv, что просто открытие файла в txcel"е не гарантирует его преобразования, это зависит от используемого разделителя. Меня как раз позабавило, что я переименовал расширение в tsv и тут же все заработало. Т.е. MS следует формальной логике, отталкиваясь от расширения.
Репутация: нет
Всего: нет
Delphi 6, Office 2003, через TExcelApplication : Excel2000.pas
писать пробовал поразному, но безрезультатно всегда Invalid Variant Type Conversion
примеры:
Код |
WorkSheet3.Range['A2','Z9'].Sort(WorkSheet3.Range['A2','A2'],xlAscending, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlGuess, 1, False, xlTopToBottom, EmptyParam); |
WorkSheet3.Range['A2','Z9'].Sort(WorkSheet3.Range['A2','A2'],xlAscending, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlGuess, 1, False, xlTopToBottom, 0);
WorkSheet3.Range['A2','Z9'].Sort(WorkSheet3.Cells.Item[2,1] ,xlAscending, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlGuess, 1, False, xlTopToBottom, EmptyParam);
Сдается мне ему ненравится как указан столбец по которому сортировать, так как больше то ничего такого не задается
еще что заметил во всех примерах пишут запросто Sheet.Range['A1'] и все у меня обязательно требует в Range 2 параметра. обычно я указывал [A2,A2] и это работало, а тут грабли какие-то.
Репутация: нет
Всего: нет
следующий код вызывает ошибку "Неверная Ссылка"
Код |
WorkSheet3.Range['A2','Z9'].Sort(WorkSheet3.Range['A2',EmptyParam],xlAscending, WorkSheet3.Range['B2',EmptyParam], xlSortValues, xlAscending, WorkSheet3.Range['C2',EmptyParam], xlAscending, xlGuess, 1, False, xlTopToBottom, xlValues); |
но хочется всетаки отсортировать.
Репутация: нет
Всего: нет
Код |
Range : OleVariant; Range:=WorkSheet3.Range['A2','Z74']; Range.Sort(WorkSheet3.Range['A2',EmptyParam]); |
ни в одном FAQ я подобного невидел, предлагаю занести это во всевозможные инстанциии ибо 2 дня у меня сожрало.
Репутация: нет
Всего: нет
подобная ошибка в 2006 делфи и 2003 офисе. все испробовал что знал. глухо. твой выход - не вариант, надо сортировать по 2 столбцам. как быть?
Репутация: нет
Всего: 1
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
[ Время генерации скрипта: 0.1117 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Читайте также: