Форум » [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

nick_mi: 1) Пока пользователь не закроет документ в EXCEL, программа будет ждать, если документ закрыт независимо от того работает EXCEL дальше с другим документом, или полностью из него вышли программа продолжит свою работу . 2) Разница собственно только в обращению к диску, или проверка объекта в памяти. Решать вам

SadStar55: есть такой код - сохраняет сформированную новую книгу в файл предварительно сформировав имя файла и удалив старый файл [pre2] // сохранить cFile:=wReport01.txt_Folder.Value if RIGHT(cFile, 1)#"\" cFile:=cFile+"\" endif cFile:=cFile+str(wReport01.Spinner_Year.Value,4)+ STRZERO(wReport01.COMBOBOX_MONTH.Value,2)+ ' '+aPDocs[1,5]+'.xls' if file(cFile) FILEDELETE(cFile) //--> lDeleted endif oBook:SaveAs(cFile) //oBook:SaveAs(cFile, xlExcel9795) <==== в Excell Office 2007 - падает [/pre2] проблема в команде сохранения (я отлаживаюсь на Excel 2003). 1. Если не задаю в cFile расширение '.xls' -- Excel действует хитрым образом. Если в cFile нет точек - то сам приписывает к имени файла '.xls' Если точки есть - то не приписывает. Например сохраненые файлы "C:\public\201308 Рахимов А.П" и "C:\public\201308 Склад.xls" Но первый файл совпадает с cFile и поэтому находится и удаляется. А второй - не совпадает и поэтому Excel начинает задавать вопросы - что не есть хорошо. Да и файл без расширения - очень не хорошо. обязательно приписываю +'.xls' 2. В Excel 2003 - сохраняет и открывает без вопросов. В Excel 2007 - сохраняет без вопросов. А при открытии пишет что формат файла не соответствует расширеню. И действительно - сохраняет в формате .xlsx = (упакованый набор xml-лек) но с расширением xls естесственно. Попробовал задать формат сохранения так oBook:SaveAs(cFile, xlExcel9795) в Excell Office 2007 - падает Посоветуйте либо как правильно задать формат сохранения (что предпочтительно для совместимости со старыми версиями Excel) либо как получить от Экселя расширение файла по умолчанию чтобы подставить в имя файла. либо какой нибудь третий способ решения проблемы

nick_mi: Может отлючить вывод предупреждений в EXCEL? На форуме где-то было, как это сделать. Касалось, по моему, записи, но может и на открытии прокатит.


Haz: попробуйте действительно отключить предупреждения oExcelTpl:SET( "DisplayAlerts", .F. ) ... ... ... oExcelTpl:SET( "DisplayAlerts", .T. )

SadStar55: Haz пишет: попробуйте действительно отключить предупреждения В своей программе я могу отключить. А как отключить у пользователя когда он будет открывать файл в своей Экселке? Мое решение такое [pre2] #define xlExcel9795 43 #define xlExcel8 56 ..... if val(oExcel:get("Version"))<12 oBook:SaveAs(cFile, xlExcel9795) else oBook:SaveAs(cFile, xlExcel8) endif .... [/pre2] Файлы созданные в Excel2007 и в Excell2013 без вопросов открываются в Excel2003. потому что 56 = xlExcel8 (Excel 97 through Excel 2003 formatted files used in Excel 2007, .xls) А xlExcel9795 нужен потому что Excel 2003 не знает о будущем коде формата 56 = xlExcel8

Dima: Покажите на примере плиз как сделать автосумму в определенной ячейке. Скажем в первой колонке заполнены числами 1 и 2 ячейки а в 3-й нужно сделать автосумму. Макрос смотрел и синтаксиса не понял. Спасибо.

Dima: вопрос по разделителям разрядов в макросе EXCEL тупо пишет NumberFormat:="#,##0" попробовал в Harbour получилось как то криво и даже перед 0.00 он рисует ,0.00 Переделал так NumberFormat:="# ##0"+GET_SDECIMAL()+"00" , работает нормально но у меня EXCEL 2003 и не факт что такой код сработает на более свежем EXCEL Вопрос: откуда EXCEL берет этот знак , и корректно ли если я его заменяю на пробел ? PS Как считать разделитель групп разрядов ? Для считывания разделителя дробной и целой части использую [pre2] #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC( GET_SDECIMAL ) { char sDec[2]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) sDec, 2 ); hb_retclen( sDec, 1 ); } #pragma ENDDUMP [/pre2] Dima пишет: Как считать разделитель групп разрядов ? Проехали , заюзал LOCALE_STHOUSAND

Sergy: Dima пишет: Покажите на примере плиз как сделать автосумму в определенной ячейке. Скажем в первой колонке заполнены числами 1 и 2 ячейки а в 3-й нужно сделать автосумму. Макрос смотрел и синтаксиса не понял. Не очень понятна суть вопроса... Что мешает записать в ячейку содержимое "=RC[-2] + RC[-1]" ? Получится автосумма двух ячеек слева.

Haz: или так oExcel:ActiveCell:FormulaR1C1 := "=СУММ(R[-" + NTOC(nStart) + "]C:R[-1]C) сумма колонки со строки nStart по активную строку -1

Dima: EXCEL 2003 у меня и у клиента. В ячейку цифры я пишу так .........:NumberFormat:="# ##0"+GET_SDECIMAL()+"00" Он строит у себя отчет и в сформированной таблице видит (для примера одна ячейка) 0,91 наводит на нее курсор и вверху видит 90.65 Когда я у себя строю тот же отчет то в этой же ячейке сразу вижу 90.65 У него разделитель дробной и целой части запятая у меня точка. Почему так по разному EXCEL выводит данные ? По идее у него в ячейке должно отобразится 90,65

Sergy: Dima пишет: EXCEL 2003 у меня и у клиента. В ячейку цифры я пишу так .........:NumberFormat:="# ##0"+GET_SDECIMAL()+"00" Он строит у себя отчет и в сформированной таблице видит (для примера одна ячейка) 0,91 наводит на нее курсор и вверху видит 90.65 Когда я у себя строю тот же отчет то в этой же ячейке сразу вижу 90.65 У него разделитель дробной и целой части запятая у меня точка. Почему так по разному EXCEL выводит данные ? По идее у него в ячейке должно отобразится 90,65 Не очень понятно, о чем речь. NumberFormat - это маска форматирования значения, хранящегося в ячейке. Формат сам по себе - но какое значение туда пишете, что вместо 90,65 получается 0,91 ? "Хорошо-бы увидеть самодостаточный пример" (с)... :)

Dima: Sergy пишет: "Хорошо-бы увидеть самодостаточный пример" (с)... :) Кусочек кода ;) [pre2] oSheet:Cells( jj, i+1 ):NumberFormat:="# ##0"+GET_SDECIMAL()+"00" oSheet:Cells( jj, i+1 ):Value :=vtv // число oSheet:Range(osheet:cells(jj,i+1),osheet:cells(jj,i+1)):BorderAround( xlContinuous, xlThin) oSheet:Columns(i+1 ):AutoFit() [/pre2]

Dima: Проехали , решил вопрос.

Sergy: Dima пишет: Проехали , решил вопрос. Чтобы не наступить на такие-же грабли - в чем оказалась проблема ?

Dima: Sergy Он сделал в EXCEL и винде такие же региональные настройки как у меня в плане разделителей ;)

Softlog86: Помогите решить : Нужно создать несколько файлов EXCELL(таблиц) для дальнейшей рассылки (прайс-листы) . Хочу одновременно создавать несколько листов ( для разных клиентов) в одной книге , а затем эти листы поочередно сохранять в соответствующие файлы . До сего дня подготавливал последовательно ( вызов EXCELL , создание книги , заполнение данными , сохранение книги , закрываем EXCELL ). Но для подготовки большого числа документов я решил делать одновременно : 1) Вызов EXCELL 2) Создание книги 3) Создание Лист 1 , Лист 2 ..... Лиcт N 4) В цикле заполняем листы информацией 5) СОхраняем каждый лист в отдельный файл Закрываем EXCELL Знаний команд не хватает КАК : ДОБАВИТЬ ЛИСТ ? ПЕРЕКЛЮЧИТЬСЯ НА ЛИСТ ? СОХРАНИТЬ ТОЛЬКО НУЖНЫЙ ЛИСТ ? Поможете ?

Pasha: Хоть у объекта worksheet и есть метод SaveAs, я не знаю, как он работает. Обычно сохраняется вся книга, а не отдельный лист. Во всяком случае, надо попробовать, как сработает SaveAs для отдельного листа. А насчет добавления-переключения листов: oSheets := oBook:Sheets Выбор листа по номеру: oSheet1 := oSheets:Item(1) oSheet2 := oSheets:Item(2) Переключение: oSheet2:Select() Хотя можно явно не переключаться на лист, а применять методы непосредственно к интересующему листу (oSheet2) Добавление листа (из справки): oSheets:Add(<Before>, <After>, <Count>, <Type>) Before Optional Variant. An object that specifies the sheet before which the new sheet is added. After Optional Variant. An object that specifies the sheet after which the new sheet is added. Count Optional Variant. The number of sheets to be added. The default value is one. Type Optional Variant. Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. If you are inserting a sheet based on an existing template, specify the path to the template. The default value is xlWorksheet.

Dima: Softlog86 пишет: Но для подготовки большого числа документов я решил делать одновременно : Одновременно все равно не получится да и будет ли такой способ быстрее , не факт. Вот ежели на каждого клиента да в отдельном потоке создавать прайс , тогда другое дело. Но к сожалению мне не удалось запустить EXCEL в отдельном потоке , вероятно он работает только в ST режиме.

Dima: Помогите с рамкой разобраться. Обычную сетку(плюс слитие ячеек) делаю так [pre2] oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):MergeCells:=.t. oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):BorderAround( xlContinuous, xlThin) [/pre2] Нужно что бы плюс к этому нижняя часть рамки была утолщенной. Макросы смотрел и не очень въехал

kia: Dima пишет: Нужно что бы плюс к этому нижняя часть рамки была утолщенной. так не пробовал? oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle( xlContinuous) oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight( xlMedium) константы These define the style of the border xlNone = -4142; Note this is the same as xlLineStyleNone xlContinuous = 1; xlDash = -4115; xlDashDot = 4; xlDashDotDot = 5; xlDot = -4118; xlDouble = -4119; xlSlantDashDot = 13; These define the weight of the border xlHairLine = 1; xlMedium = -4138; xlThick = 4; xlThin = 2; Thise is handy to make borders have the default color index xlAutomatic = -4105; These define the placement of border pieces xlDiagonalDown = 5; xlDiagonalUp = 6; xlEdgeLeft = 7; xlEdgeTop = 8; xlEdgeBottom = 9; xlEdgeRight = 10; xlInsideVertical = 11; xlInsideHorizontal = 12; ps проверить сейчас не могу. взял с рабочего софта, но на другом языке



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