Форум » [x]Harbour » Снова EXCEL (продолжение) » Ответить

Снова EXCEL (продолжение)

Dima: Ранее с Excel из Harbour ни когда не работал. Поставили тут задачу. У некоторых поставщиков есть определенные формы заказов. Набраны они в Excel. Сейчас народ руками заполняет эти формы и шлет по электронке поставщикам. Задача сводится к тому что бы в этих формах находить нужные коды товара и в нужной ячейке проставлять заказ. Может ткнет кто носом с чего начать что бы не напороться на грабли. Спасибо Сами формы тут http://zalil.ru/33279066

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

fil: Из своей проги открываю файл Excel. В этом файле есть кнопка которая активирует макрос. Макрос должен посылать сообщение - PostMessage(чего нибудь) моей проге и закрывть Excel. Не писал ли кто похожее ?

Петр: fil пишет: Не писал ли кто похожее ? Не писал, но не вижу на каком этапе могут возникнуть трудности: нажать кнопку (выполнить макрос), послать сообщение, закрыть Excel? Добавляйте описание WinAPI функций, что-то типа Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long и вперед. UPD: наверное вам пригодится RegisterWindowMessage.

fil: Не писал, но не вижу на каком этапе могут возникнуть трудности Да ни на каком, написал уже. Думал, вдруг кто халяву подкинет


Петр: fil пишет: Думал, вдруг кто халяву подкинет

fil: Можно ли программно подгрузить в книгу макрос из внешнего*.bas файла ?

Dima: Заполняю ячейку следующим значением hb_dtoc(Tmp123->data_z,"DD.MM.YYYY") NumberFormat для нее поставил "@" , вместо даты получил цифры. Глянул как в макросе делает Excel для даты , NumberFormat там "m/d/yyyy" , тоже вставил в проге но после этого оля упала. Какой вид NumberFormat нужно поставить что бы и оля не упала и дата корректно отобразилась ?

Петр: Dima пишет: Заполняю ячейку следующим значением hb_dtoc(Tmp123->data_z,"DD.MM.YYYY") Попробуйте заполнять так :Value := Date() :Value := hb_DateTime() :Value := Tmp123->data_z

Dima: Петр Дело в том что есть универсальная функция (моя) , обрабатывает DBF таблицу и кидает ее в EXCEL. Данные таблицы заполняю не по ячейкам а по строкам. То есть Value я присваиваю массив (в данном случае) вида {"17.06.2017","ИВАНОВ",45123.10} Если после присвоения (или до) не делать NumberFormat , то все ровно. Но понадобилось в 3 -й колонке число бить по разрядам что бы получить 45 123.10 , если этого не сделать получаю 45123.1 Поэтому решил диапазону (RANGE) передать массив вида {"@","@","# ##0"+GET_SDECIMAL()+"00"} через NumberFormat , все сработало за исключением вывода строки в которой дата. Подмена "@" на "m/d/yyyy" приводит к падению оли. Сделал пока временное решение но пришлось отказаться от заполнения диапазона в NumberFormat и сделал по ячейкам в цикле , скорость немного конечно упадет. Массив теперь выглядит так {NIL,"@","# ##0"+GET_SDECIMAL()+"00"} а в цикле проверка стоит , если не NIL то работаем с NumberFormat

Петр: Фрагмент кода oAS:Range( "A1:C1" ):Value := {"17.06.2017","ИВАНОВ",45123.10} oAS:Range( "A1:C1" ):NumberFormat := {"mm/dd/yyyy","@","# ##0,00"} oAS:Range( "A1:C1" ):Select() в Excell 2016 не приводит к падению Можно попробовать использовать (до или после) oAS:Columns( 3 ):NumberFormat.. или oAS:Range( "С3:C100" ):NumberFormat.. UPD. oAS:Range( "A1:C1" ):Value := {Date(),"ИВАНОВ",45123.10} - тоже работает как просили..

Dima: Петр пишет: в Excell 2016 не приводит к падению Возможно , у меня Excel 2000 У юзверей стоит , поэтому и у себя держу такую версию.

Oskar_AAA: Добрый день, формирую DBF файл и выводе в Excel использую NaumberFormat только где надо разделить разряды, убрать 0, перенос текста - пока все ОК (Excel 2010 - 2016)

Pasha: Как вариант: перед заполнением таблицы по строкам можно установить NumberFormat для тех столбцов, для которых это надо, т.е: oSheet:Columns( nCol1 ):NumberFormat := cFormat1 .. oSheet:Columns( nColN ):NumberFormat := cFormatN а затем сделать цикл по строкам с их заполнением Если есть шапка таблицы, то после форматирования всего столбца NumberFormat для шапки можно очистить, или установить другой: oSheet:Rows('1'+':'+AllTrim(Str(nRow))):NumberFormat := ... С точки зрения оптимизации так будет лучше всего, т.к. число вызовов NumberFormat будет минимально.

Dima: Pasha пишет: Как вариант: перед заполнением таблицы по строкам можно установить NumberFormat для тех столбцов, для которых это надо, т.е:

Pasha: Как уже отмечалось, харбор не поддерживает создание двумерных массивов Variant, и из-за этого в Excel не получается присвоить значение диапазону ячеек, состоящему из нескольких строк. Приходится присваивать значение построчно, что намного медленнее. Или копировать диапазон через буфер обмена. Это быстро, но сносит форматирование, что тоже не всегда приемлемо. Написал функцию, которая позволяет это делать. Ссылка на функцию с примером: http://my-files.ru/n4n4id

Dima: Pasha пишет: Написал функцию, которая позволяет это делать. Гениально , работает однако Спасибо !

Alex_Cher: Dima пишет: Гениально , работает однако у меня нет ... http://shot.qip.ru/00U6oZ-3JqTa71XL/ чего не хватает ?

Петр: Alex_Cher пишет: чего не хватает ? hbwin включена в проект?

Dima: Alex_Cher пишет: чего не хватает ? HBWIN

Alex_Cher: ... дальше больше http://shot.qip.ru/00U6oZ-6JqTa71XM/ надо было с С ++ начинать ...

Петр: Alex_Cher пишет: ... дальше больше Больше чего? В MiniGUI (последней версии) правите файл сборки call ..\..\..\batch\compile.bat _set2a /L hbwin %1 %2 %3 %4 %5 %6 %7 %8 %9 и спокойно компилируете.



полная версия страницы