Форум » [x]Harbour » Вопрос по Excel ? » Ответить

Вопрос по Excel ?

Andrey: Всем привет. Вопрос к знатокам Excel-я, как подсчитать сумму ВСЕХ значений с минусом и с плюсом ? Вот есть таблица из многих столбцов. Как сделать формулу для расчёта этих значений по 2-му столбцу ?

Ответов - 153, стр: 1 2 3 4 5 6 7 8 All

fil: Вытащи нужный столбец в массив, суммируй(или чего там) и вставь результат. Быстрее будет

Andrey: fil пишет: Вытащи нужный столбец в массив, суммируй(или чего там) и вставь результат. Быстрее будет Их 10 штук (столбцов) которые нужно считать и вдобавок по 50-60 тыс.записей...

SadStar3333: =СУММЕСЛИ(C3:C9;"<0";C3:C9)


Dima: Andrey Таблицу из Harbour создаешь (заполняешь) ?

santy: суммирование положительных и отрицательных чисел: http://www.cyberforum.ru/vba/thread118931.html

Andrey: Dima пишет: Таблицу из Harbour создаешь (заполняешь) ? DBF создаю хХарбором. Потом показываю в FastReport/ Ну и еще отдельное меню вызова EXCEL с этим DBF. Вот и хотелось бы макрос прикрутить, или написать какую формулу писать.

Andrey: santy пишет: суммирование положительных и отрицательных чисел: http://www.cyberforum.ru/vba/thread118931.html Спасибо !

Andrey: SadStar3333 пишет: =СУММЕСЛИ(C3:C9;"<0";C3:C9) А здесь такого нет: http://www.cyberforum.ru/vba/thread118931.html Можно посчитать формулой непосредственно на листе: =СУММЕСЛИ(A1:A20;"<0") =СУММЕСЛИ(A1:A20;">0")

Haz: Andrey пишет: А здесь такого нет: Андрей , в самом Excel отличная справка по функциям СУММЕСЛИ(диапазон;условия;диапазон_суммирования) Диапазон — диапазон ячеек, оцениваемый по условиям. Ячейки в каждом диапазоне должны содержать числа, имена, массивы или ссылки, содержащие числа. Пустые ячейки и ячейки, содержащие текстовые значения, не учитываются. Условия — критерий в форме числа, выражения или текста, определяющий, какие ячейки должны суммироваться. Например, аргумент «условие» может быть выражен как 32, "32", ">32" или "яблоки". Диапазон_суммирования — фактические ячейки, которые необходимо просуммировать, если соответствующие им ячейки в диапазоне отвечают условиям. Если аргумент «диапазон_суммирования» опущен, ячейки диапазона и оцениваются по условиям, и суммируются в том случае, если они им соответствуют

Dima: Haz пишет: Андрей , в самом Excel отличная справка по функциям Он их не читает

Andrey: Dima пишет: Он их не читает Лучше попробовать, если не получается то спросить...

Andrey: Как на Харборе в Экселе сделать - сохранение файла в формате CVS ? Т.е. файл открыл через ОЛЮ, а как дальше сделать - сохранение файла ?

Петр: Функция Excel VBA SaveAs(..) Параметр #2 - FileFormat := xlCSV

Dima: Петр пишет: Параметр #2 - FileFormat := xlCSV Как обычно Andrey обломился просто погуглить

Andrey: Петр пишет: Параметр #2 - FileFormat := xlCSV Спасибо ! Но как я и подозревал - Эксель опять сопротивляется... Открываю Эксел в скрытом режиме - oExcel:Visible := .F. // НЕ Показывать EXCEL Сделал запись в файл, а просто так Эксел не закрывается. Вот такая табличка появляется: Как этот диалог убрать, чтобы юзера не пугались ?

Dima: oExcel:DisplayAlerts:=.F.

Andrey: Dima СПАСИБО !

Andrey: Что-то иногда вылетает программа вот с такой ошибкой: Перед тем как записывать файл, я удаляю существующий. [pre2] IF FILE( cFileSave ) DELETEFILE( cFileSave ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" ENDIF INKEYGUI(500) oBook:SaveAs( cFileSave, xlCSV ) // строка 97 [/pre2] Что за ошибка такая и как убрать вылет ?

Петр: Andrey пишет: Что за ошибка такая и как убрать вылет ? 1. У обьекта oBook нет метода SaveAs 2. Быть внимательным и хоть как-нибудь обработывать ошибки (проверка возращаемых значений, BEGIN SEQUENCE ) - тормоза придумали не трУсы

Andrey: Петр пишет: Быть внимательным и хоть как-нибудь обработывать ошибки (проверка возращаемых значений, BEGIN SEQUENCE ) Точно... Нашёл ошибку. Повис в памяти скрытый Эксель с файлом, т.е. файл заблокирован на запись. Вот так работает: [pre2] .... cFileName := cPath + "\" + cFileXls cFileSave := cPath + "\" + cFileCsv ..... oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. // НЕ Показывать EXCEL oExcel:DisplayAlerts := .F. // не приставать с запросами oExcel:Workbooks:Open( cFileName, 0 ) oBook := oExcel:ActiveSheet() IF FILE( cFileSave ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" nErr := DELETEFILE(cFileSave) IF nErr == 0 oBook:SaveAs( cFileSave, xlCSV ) lRet := .T. ELSE cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += "Ошибка удаления файла: "+cFileSave+" !; Ошибка: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Ошибка!" ) lRet := .F. ENDIF ELSE oBook:SaveAs( cFileSave, xlCSV ) lRet := .T. ENDIF oExcel:Quit() [/pre2] Петр пишет: 1. У обьекта oBook нет метода SaveAs А как тогда писать правильно ?

Dima: Andrey пишет: Петр пишет: цитата: 1. У обьекта oBook нет метода SaveAs А как тогда писать правильно ? oExcel:SaveAs( cFileSave, xlCSV )

Andrey: WinXP) Версия: Excel 2003 (11.0) - открывает файлы нормально, без ошибок. Xin7) Версия: Excel 2014 (16.0) - при открытии этих же файлов, вылетает с ошибкой: [pre2] oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. // НЕ Показывать EXCEL oExcel:DisplayAlerts := .F. // не приставать с запросами oExcel:Workbooks:Open( cFileName, 0 ) // строка 90 oBook := oExcel:ActiveSheet()[/pre2] Почему ? При открытии этого файла напрямую в Экселе - вот такое окно: Пока не щёлкнешь по кнопке "Разрешить редактирование" для этого файла, программа на МиниГуи будет вылетать. Т.е. ОЛЕ в МиниГуи (для Экселя-2014) не может открыть такой файл ? Как тогда добиться совместимости, чтобы программа на всех ОФИСАХ работала ? Можно ли у себя в программе ввести параметр для разрешения редактирования таких файлов ?

Haz: Andrey пишет: Можно ли у себя в программе ввести параметр для разрешения редактирования таких файлов ? Почитай в msdn про параметры метода open. Уверен там есть ответ.

Pasha: Опыт показывает, что параметрами метода Open не обойдешься. Excel последних версий стал слишком "умный", и теперь сам решает, стоит ли ему открывать файл, или не стоит. То ему папка не нравится, то файл не такой. Иногда можно подшаманить настройки самого Excel, иногда надо удалять определенные ветки реестра. Но в общем случае для произвольного Office заранее неизвестно, согласится ли сей капризный продукт открыть файл, или его надо специально уговаривать.

Andrey: Haz пишет: Почитай в msdn про параметры метода open. Уверен там есть ответ. Нашел это - https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbooks-open-method-excel Ничего подходящего нет... Pasha пишет: Но в общем случае для произвольного Office заранее неизвестно, согласится ли сей капризный продукт открыть файл, или его надо специально уговаривать. Да фиг бы сним, нельзя открыть - так нельзя ! Главное чтобы моя программа не сваливалась по ОЛЕ-ошибке и юзеру окошко читаемое выдать ! Что только ему написать то пока не знаю.

Haz: Andrey пишет: Ничего подходящего нет... Это не то ? IgnoreReadOnlyRecommended Если не помогла , то в параметрах безопасности экселя нужно запретить эти предупреждения. Как сделать руками знаю, как из VBA не видел Хотя есть такое , попробуй http://getadmx.com/?Category=Office2016&Policy=excel16.Office.Microsoft.Policies.Windows::L_TrustedLoc01&Language=ru-ru

Петр: Andrey пишет: Главное чтобы моя программа не сваливалась по ОЛЕ-ошибке Я вам про BEGIN SEQUENCE от нефиг делать писал? Организуйте обработку ошибок и будет вам счастье. К тому же IF FILE( cFileSave ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" nErr := DELETEFILE(cFileSave) - это очень "детский" код, под DOS - все нормально, в Win может быть источником трудноотлавливаемых ошибок.

Andrey: Haz пишет: Если не помогла , то в параметрах безопасности экселя нужно запретить эти предупреждения. Я писал выше, что ручное разрешение на этот файл позволяет избавиться от ошибки. Но хочется сделать открытие файла по максиму - без ошибок ! Самое лучшее конечно предложение от Петра, сделать BEGIN SEQUENCE на открытие файла. Кстати проверял и Эксель 2014 и 2016 - файлы нормально открываются/конвертируются. У меня два файла в тесты записаны, вообще на диске лежат с 2014 года, может битые какие-то. Хотя Эксель 2003 их просто на ура конвертирует.... Чем дальше в лес, тем больше дров. Нашел кто создаёт такие хитро-битые файлы, вот один в качестве примера - https://cloud.mail.ru/public/Fd2b/kTZEAo8Nj

Dima: Haz пишет: как из VBA не видел да полно ссылок если погуглить.

Andrey: Dima попробуй у себя открыть этот файл - https://cloud.mail.ru/public/Fd2b/kTZEAo8Nj !

Dima: Andrey пишет: Dima попробуй у себя открыть этот файл у меня Excel 2003

Haz: Dima пишет: да полно ссылок если погуглить. Может и полнно, но мне не надо. Давно листал, и для себя запомнил, что эта гадость без танцев не отключается. И надо все валить на админа. Если с тех времен ссылок накидали то это талько хорошо. Ps. Вспоминается анекдот : Тяжело спорить с товарищем сталиным, ты ему цитату, а он тебе ссылку

Pasha: По поводу открытия файлов в последних версиях Office: 2010 с обновлениями, 2013, 2016. Иногда помогают такие танцы с бубном, причем бубен обязательно должен быть изготовлен из шкур священных животных из Тибета, а шаман должен иметь сертификат от далай-ламы. Вот рецепты, которые я находил: Отключение проверки файлов офиса при открытии: Создайте в реестре ключ EnableOnLoad типа DWORD со значением 0 по пути HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\<Версия вашего Офиса, например 14.0 для 2010>\<Приложение, например Excel>\Security\FileValidation\ или HKEY_CURRENT_USER\Software\Microsoft\Office\<Версия вашего Офиса, например 14.0 для 2010>\<Приложение, например Excel>\Security\FileValidation\ Откройте вкладку Файл, чтобы переключиться в представление Microsoft Office Backstage. В меню Справка выберите пункт Параметры; отобразится диалоговое окно Параметры. Щелкните элемент Центр управления безопасностью и нажмите кнопку Параметры центра управления безопасностью. В центре управления безопасностью щелкните пункт Параметры блокировки файлов. Установите флажок Открывать выбранные типы файлов в режиме защищенного просмотра и разрешить редактирование. На приведенном ниже рисунке показана область Параметры блокировки файлов центра управления безопасностью. Было слелано следующее на компьютере: 1. Microsoft Office 2010 x32 был удален с компьютера, и установлен Microsoft Office 2013 x64 2. В реестре изменен след. параметр [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems] на SharedSection=1024,20480,1024 согласно ссылке http://www.commix.ru/settings/desktop-heap.html Смотреть - http://www.pixic.ru/i/2030R7U3V8X797r4.jpg В результате работы с большим количеством открытых экслевских, вордовских документов, вышеописанная проблема с зависанием приложений не появляется. и еще: На некоторых файлах строка Documents.Open последовательно зависает, причем никаких бросающихся в глаза различий между этими файлами и остальными нет. Ворд 2007, хотя файлы в формате doc. Раньше была проблема с длинными именами файлов - файл с длинным именем зависал, но проходил нормально после его переименования в нечто более короткое. Сейчас весь path включая имя файла - порядка 20 символов. http://www.sql.ru/forum/1135099/servis-zavisaet-pri-popytke-otkryt-vord Нашел! HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Word\Resiliency\DisabledItems Вот это если почистить, то оно начинает работать. Буду чистить программно. Всем спасибо! Иногда помогает, иногда нет.

Andrey: Pasha СПАСИБО ! Петр пишет: 1. У обьекта oBook нет метода SaveAs Делаю так: [pre2] oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. oExcel:DisplayAlerts := .F. oExcel:Workbooks:Open( cFileName, 0 ) oExcel:SaveAs( cFileSave, xlCSV ) // строка 111 oExcel:Quit()[/pre2] Вылет по ошибке: Error Excel.Application/0 S_OK: SAVEAS Called from TOLEAUTO:SAVEAS(0) Called from XLSTOCSV(111) in module: Form_convert.prg Если делаю так: [pre2] oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. oExcel:DisplayAlerts := .F. oExcel:Workbooks:Open( cFileName, 0 ) oBook := oExcel:ActiveSheet() oBook:SaveAs( cFileSave, xlCSV ) // строка 111 oExcel:Quit()[/pre2] Вылета по ошибке НЕТ. И как тогда правильно писать ? Может ещё что-то нужно добавить/исправить в коде

Pasha: Метод SaveAs есть у объекта WorkBook, и Chart и WorkSheet Так что правильно как раз: oBook:SaveAs( cFileSave, xlCSV ) для таких вопросов есть хелп по Excel VBA, а еще такая классная вещь, как поисковик в браузере.

Andrey: Pasha пишет: для таких вопросов есть хелп по Excel VBA, а еще такая классная вещь, как поисковик в браузере. Спасибо ! На них не надеюсь, важно как на форуме у нас напишут !

Pasha: А набрать в яндексе "Excel SaveAs" влом ?

Andrey: Pasha пишет: А набрать в яндексе "Excel SaveAs" влом ? Да смотрел я. Просто засомневался, из-за этого и спрашивал...

Pasha: Andrey пишет: oBook := oExcel:ActiveSheet() Мне одному кажется, что в этом коде что-то не так ?

Dima: В ячейке имеем QWERTYASDEFG , нужно ASDEFG сделать жирным шрифтом. Руками получается и макрос смотрел , но не пойму как сделать на Harbour. Делал кто такие вещи ?

Pasha: oRange:Characters(1, 6):Font:Bold := .t.

Dima: Pasha Работает, спасибо ! Попробовал на удачу еще так oSheet:Cells( 1, 2 ):Characters(1, 6):Font:Bold := .t. тоже пашет

Andrey: Вот опять нашёл бяку для Экселя в МиниГуи - если имена папки на русском, то записать книгу в файл не может ! Ошибка: Error 8919500/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS Called from TOLEAUTO:SAVEAS(0) Called from MYCREATEONEXLS(97) in module: util_xls.prg Строка 97: oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) Блин, а нельзя ли как то ОЛЕ это исправить ? А то получаются программы на МиниГуи (терминалку не пробовал) урезанного профиля, папки на русском не создавать .. и т.д. Во всех других языках - каталоги и файлы давно на русском языке используют.

Pasha: Если дело в кодировке, тогда вопрос: в поставке минигуи уникодный харбор или нет ? Содержание ошибки: объект oWorkBook не содержит метода SaveAs Какого класса объект oWorkBook - фиг его знает. При правильном присваивании должен быть класса WorkBook, а правильным ли оно было ? На прошлой странице попадался код: oBook := oExcel:ActiveSheet() объект oBook оказывается класса WorkSheet, что приводит к непоняткам при анализе кода. А что насчет oWorkBook ?

Andrey: Pasha пишет: А что насчет oWorkBook ? Вот про это я и спрашивал, код был из разных источников, под 2003-2007 везде работает, а на 2014-2016 уже вылетает. Как правильно написать код (чтобы и другие ориентировались на это) ? [pre2]#include "excel.ch" .... oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. // НЕ Показывать EXCEL oExcel:DisplayAlerts := .F. // не приставать с запросами oExcel:Workbooks:Open( cFileName, 0 ) oBook := oExcel:ActiveSheet() IF FILE( cFileSave ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" или захвачен другим Excel nErr := DELETEFILE(cFileSave) IF nErr == 0 oBook:SaveAs( cFileSave, xlCSV ) // xlCSV - см. #include "excel.ch" lRet := .T. ELSE cMsg := "Ошибка удаления файла: "+cFileSave+" !; Ошибка: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Ошибка!" ) lRet := .F. ENDIF ELSE oBook:SaveAs( cFileSave, xlCSV ) // xlCSV - см. #include "excel.ch" lRet := .T. ENDIF oExcel:Quit() Return lRet[/pre2]

Pasha: Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? oBook := oExcel:ActiveSheet() это лист. Только имя переменной надо давать что-то вроде oSheet oBook := oExcel:ActiveWorkBook() а это книга

Andrey: Pasha пишет: Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? Не заметил...

Andrey: Но все равно дело не в этом... А в русских буквах .... Протестировал следующее: WinXP - {12.0, "Excel 2007"} - папка: XLS_to_CSV Win7 - {16.0, "Excel 2014"} - папка: XLS_to_CSV Функция записи работает без ошибок !!! WinXP - {12.0, "Excel 2007"} - папка: XLS_to_CSV_русские_буквы Win7 - {16.0, "Excel 2014"} - папка: XLS_to_CSV_русские_буквы Вылетает с ошибкой: Error 2201828/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS Called from TOLEAUTO:SAVEAS(0) Called from MYCREATENEWXLS(105) in module: util_xls.prg Вот сама функция: [pre2]////////////////////////////////////////////////////////////////////// FUNCTION MyCreateNewXls(cFileName) LOCAL nI, oExcel, nVerExcel, oWorkBook, oSheet, cMsg, nErr LOCAL nLine, nCount, aDim, cFont, nFSize, cType, xValue, nDecVal IF ! IsExcelFound() // check for Excel on your computer RETURN .F. ENDIF IF FILE( cFileName ) nErr := DELETEFILE(cFileName) IF nErr # 0 cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += "Ошибка удаления файла: "+cFileName+" !; Ошибка №: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error!" ) RETURN .F. ENDIF ENDIF oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. oExcel:DisplayAlerts := .F. nVerExcel := VAL( oExcel:Version ) oWorkBook := oExcel:WorkBooks:Add() oSheet := oExcel:ActiveSheet() cFont := "Arial" ; nFSize := 12 oSheet:Cells:Font:Name := cFont oSheet:Cells:Font:Size := nFSize nLine := 3 nCount := 7 // ------- table header --------------- oSheet:Cells( 1, 1 ):Value := "Test table for converting Xls to Csv" oSheet:Cells( 1, 1 ):Font:Size := nFSize // Combine the cells of the selected range from 1 to nCount into one cell oSheet:Range(oSheet:cells(1,1),oSheet:cells(1,nCount)):MergeCells:=.t. oSheet:Cells( 1, 1 ):HorizontalAlignment := xlCenter DO WHILE .T. aDim := { DATE(), "901010"+HB_NtoS(10+nLine), "001", "Street", "11A" , HB_NtoS(nLine), 100-(nLine*1.5) } FOR nI := 1 TO LEN(aDim) cType := VALTYPE(aDim[nI]) xValue := aDim[nI] IF cType == "D" oSheet:Cells( nLine, nI ):SET( "NumberFormat", "@" ) ELSEIF cType == "N" nDecVal := xValue - INT(xValue) IF nDecVal == 0 // значит целое число oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0' ) ELSE oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0,00' ) ENDIF ELSE oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) ENDIF oSheet:Cells( nLine, nI ):Value := xValue oSheet:Cells( nLine, nI ):Borders():LineStyle := 1 NEXT nLine ++ IF nLine > 103 EXIT ENDIF DO EVENTS // ALWAYS! To make the form NOT freeze ENDDO oSheet:Cells( nLine+1, 1 ):Value := "End table" oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) // строка 105 oExcel:Quit() RETURN .T.[/pre2] Может в коде что-то нужно добавить ? Или не будут работать ПАПКИ с русскими именами ?

Pasha: В харборе допускаются русские имена файлов и папок. Андрей, нужен контекст. Кодовая страница, как я понимаю, выставлена RU1251 ? cFileSave в какой кодовой странице ? Далее, еще раз. Харбор в поставке minigui уникодный ? Далее. Насколько я помню, в поставке minigui идет своя версия библиотеки hbole, которая по сути есть очень устаревший на много-много лет вариант оригинальной библиотеки харбора. Лучше использовать не ее, а оригинальную библиотеку. А самым лучшим решением было бы исключить эту библиотеку из поставки minigui, и использовать оригинальную. Кстати, если выполнить этот код с харбором не из поставки minigui, думаю, проблем не возникнет. Во всяком случае, у меня проблем с передачей русских имен файлов в продукты office через ole нет.

Andrey: Pasha пишет: Кодовая страница, как я понимаю, выставлена RU1251 ? cFileSave в какой кодовой странице ? 1) Да ! 2) если файл в RU1251 тогда cFileSave тоже должна быть в RU1251 или надо как то по другому задавать ? Pasha пишет: Далее, еще раз. Харбор в поставке minigui уникодный ? Не знаю. Нужно у Григория спрашивать... Залез в папку с Харбором - Version: 3.2.0dev (r1709261254) Pasha пишет: Далее. Насколько я помню, в поставке minigui идет своя версия библиотеки hbole, которая по сути есть очень устаревший на много-много лет вариант оригинальной библиотеки харбора. Лучше использовать не ее, а оригинальную библиотеку. А самым лучшим решением было бы исключить эту библиотеку из поставки minigui, и использовать оригинальную. Нет сейчас в поставке hbole.lib в папке MiniGUI\Lib Берется из стандартой поставки MiniGUI\Harbour\lib\hbole.lib В папке Харбора такое написано: - hbole.lib: Harbour OLE Library. Part of xHarbour core Copyright 2002 Jose F. Gimenez <jfgimenez@wanadoo.es> Source code available in the folder \source\HbOLE. Вот у SergKis цифирьки ошибки немного другие: Error 8198764/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS

Pasha: Ну как бы из приведенного примера не видно, как заполняется cFileSave. Лучше проверить, и убедиться, что кодировка та, что надо. А в харборе модуль работы с ole находится в библиотеке hbwin, так что hbolе наверняка его устаревшая версия из поставки minigui.

Pasha: Немного разобрался. Харбор из поставки минигуи уникодный, но сам минигуи не уникодный. Библиотека hbole.lib собрана из модуля 2009 года. Однако, 8(!) лет прошло. /* * $Id: win_ole.c 11529 2009-06-26 01:11:11Z vszakats $ */ Но в поставку харбора также включена уникодная библиотека hbwin со свежим модулем ole. Лучше конечно использовать его. Надо убрать hbole.lib из батников сборки проекта, добавить вместо нее hbwin.lib, и вместо oExcel := TOleAuto():New( "Excel.Application" ) вызывать oExcel := win_oleCreateObject("Excel.Application") и ПРОВЕРИТЬ (три, а лучше семь раз), кодировку переменной cFileSave Дополню: hbole.lib из сборки убрать не получится, так как этот класс использует TSBrowse. Тогда пусть в сборке будут обе библиотеки.

Andrey: Pasha пишет: Надо убрать hbole.lib из батников сборки проекта, добавить вместо нее hbwin.lib, и вместо oExcel := TOleAuto():New( "Excel.Application" ) вызывать oExcel := win_oleCreateObject("Excel.Application") Да мне Петр давно советовал уйти с hbole.lib, а я всё никак не решусь. Код перестаёт работать... Как делать - не знаю...

Pasha: Скачиваю hmg-17.09.7z Собираю пример из samples\applications\DBFview\source Запускаю dbfview, открываю файл dbf. Жму File - SaveAs/Export Выбираю формат xls, ввожу имя файла по русски Файл успешно сохраняется. Смотрю сырцы. Там маленькая процедура: Static Procedure SaveToXls( cAlias, cFile ) *--------------------------------------------------------* Local oExcel, oSheet, oBook, aColumns, nCell := 1 oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('Excel is not available!', PROGRAM ) RETURN endif oExcel:Visible := .F. oExcel:WorkBooks:Add() oSheet := oExcel:Get( "ActiveSheet" ) Aeval( (cAlias)->( DBstruct(cAlias) ), { |e,i| oSheet:Cells( nCell, i ):Value := e[DBS_NAME] } ) do while !(cAlias)->( EoF() ) nCell++ aColumns := (cAlias)->( Scatter() ) aEval( aColumns, { |e,i| oSheet:Cells( nCell, i ):Value := e } ) (cAlias)->( DBskip() ) enddo oBook := oExcel:Get("ActiveWorkBook") oBook:Title := cAlias oBook:Subject := cAlias oBook:SaveAs(cFile) oExcel:Quit() Return Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать.

Andrey: Pasha пишет: Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. Сделал папку D:\TEMP2_Русские_Буквы\Проверка букв\Тест новый - запускаю Xls_to_Csv.exe, xls-файл создаёт... В папке где собраны все мои проекты подключаю через SUBST - вот там эта программа xls-файл НЕ СОЗДАЁТ !!! Блин... Опять Win8.1 ставит подножку на пустом месте...

Pasha: Комментирую фрагмент в этой функции /* oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('Excel is not available!', PROGRAM ) RETURN endif */ вместо него добавляю: oExcel := win_oleCreateObject( "Excel.Application" ) собираю, делаю тоже самое. Работает. И со старой библиотекой hbole, и с новой hbwin. Ну хоть ты тресни, никак сломать не получается.

Pasha: А сам Excel сохраняет файлы на сабстнутый диск ?

Andrey: Pasha пишет: А сам Excel сохраняет файлы на сабстнутый диск ? Да. Даже если обозвать папку \PROJECT\XLS_to_CSVII_Русские_буквы А функция MyCreateNewXls(cFileName) - вылетает, хотя код и там и там почти одинаковый.... Короче что-то с доступом к папке...

Andrey: Вот так поставил: [pre2] cTitle := "Тестовая таблица для конвертирования Xls в Csv" ...... oWorkBook := oExcel:Get("ActiveWorkBook") oWorkBook:Title := cTitle oWorkBook:Subject := cTitle oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) // #include "excel.ch" oExcel:Quit()[/pre2] и стал записываться xls-файл в папку \PROJECT\XLS_to_CSVII_Русские_буквы где SUBST назначен. Не хватало 3-х строчек кода ! СЛЕДУЮЩИЙ ВЫВОД ПРАВИЛЬНЫЙ : Pasha пишет: Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. Спасибо БОЛЬШОЕ за наводку !

Pasha: Буквально позавчера делал заполнение бланка в Excel. Там всего лишь вставляется табличка, после которой идут подписи. Так вот, после заполнения таблички высота нескольких строк в подписи сама собой увеличилась, и стала где-то на полметра. Почему Excel решил так сделать - фиг его знает. Я так и не разобрался.

Sergy: Pasha пишет: Так вот, после заполнения таблички высота нескольких строк в подписи сама собой увеличилась, и стала где-то на полметра. У меня такое бывает на Office начиная с версии 2010, если выполнены два условия: 1) зафиксирована (заморожена) часть строк, например, шапка таблицы .AND. 2) удаляется несколько строк, как выше (в заголовке), так и ниже "заморозки" (в теле таблицы). В версиях до Excel 97 включительно все работает без проблем, как победить это на более современных версиях - так и не понял пока, из шаманств помогло: сначала удалять все что нужно, а только потом "морозить". Но иногда и не помогает...

Dima: Pasha пишет: Так вот, после заполнения таблички высота нескольких строк в подписи сама собой увеличилась, и стала где-то на полметра. Была такая штука когда загонял в ячейку MEMO а в нем переводы строки жили , поэтому чикаю их через Memotran

Pasha: У меня все-таки другой случай. Самопроизвольно увеличилась высота пустых строк, в ячейки которых ничего не заносилось. Заполнялась таблица перед этими строками. Почему - непонятно. Бланк скачал из инета, он совсем простой. Макросов нет. Я как-то выкрутился и уже забыл. От современного софта почти каждый день какое-то чудо узнаешь. Ну или каждую неделю.

Dima: Pasha а выложи простой примерчик , хочу у себя чекануть + скрин где у тебя лажа с высотой

Pasha: Уже и не получается воспроизвести строки полуметровой высоты. Бланк то я поправил, удалением и добавлением тех строк, которые портятся, и документ, который давал тот эффект, не сохранил.

Pasha: Excel 2010. В книге два листа. Выдаю: oSheets:Item(2):Delete() DisplatAlerts не выключал. Запрос на удаление листа не выдается. Метод Delete возвращает значение .t.. Лист из книги не удаляется, как был, так и остался. В чем может быть дело ? Непонятный глюк ?

Pasha: Вопрос снят. Оказалось: не глюк. Надо было как обычно вызвать дежурного шамана, и поскакать с бубном. Нашлась такая темка: http://www.sql.ru/forum/114247/pochemu-ne-udalyautsya-listy-v-excel и лист стал удаляться так: oExcel:DisplayAlerts := .f. oSheets:Item(2):Delete() oExcel:DisplayAlerts := .t. Смутило поведение сего продукта, отличное от его же доки.

fil: Всем привет ! Вопрос несколько не в тему - не писал ли кто макроса загрузки DBF в Excel. Только грузить этот DBF надо через ADO

ММК: fil пишет: Только грузить этот DBF надо через ADO Так в сырцах FW посмотри. Например FW_AdoToExcel может на мысль натолкнет

fil: Посмотрю, спасибо.

Oskar_AAA: Добрый день, коллеги. Мы просто открываем в Excel файл DBF и потом записываем с нужным расширением (Xls/Xlsx) Dbf_F1 - имя файла DBF Xls_F1 - имя файла Excel Function Format_Exl1(Dbf_F1,Xls_F1) Local oExcel,oSheet,oBook,oAs,oRange oExcel :=ToleAuto():New( "Excel.Application" ) oExcel :Visible:=.F. oExcel :Workbooks:Open(Dbf_F1) oExcel :Set("DisplayAlerts",.F.) oBook :=oExcel:ActiveWorkBook oSheet :=oExcel:ActiveSheet oRange :=oExcel:ActiveCell:SpecialCells(xlLastCell) oAs :=oExcel:ActiveSheet() cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(1,1),oAs:Cells(cRecno,cColumn)):Font:Name='Calibri' oAs:Range(oAs:Cells(1,1),oAs:Cells(cRecno,cColumn)):Font:Size=12 oAs :Columns(2):Font:Bold:=.T. *** другие манипуляции с файлом *** oBook :SaveAs(Xls_F1) oExcel:Set("DisplayAlerts",.T.) oExcel:Quit() oAs :=Nil oExcel:=Nil oRange:=Nil oSheet:=Nil Release oExcel,oSheet,oBook,oAs,oRange Return(Nil)

ММК: ММК пишет: Так в сырцах FW посмотри. Или в примерах - * adoxl.prg * Author: G.N.Rao, India function Main() local oWnd oCn := FW_OpenAdoConnection( TrueName( "xbrtest.mdb" ) ) DEFINE WINDOW oWnd DEFINE BUTTONBAR oWnd:oBar SIZE 100,32 2007 DEFINE BUTTON OF oWnd:oBar PROMPT "Export To Excel" CENTER ACTION ExportToExcel() DEFINE BUTTON OF oWnd:oBar PROMPT "Link To Excel" CENTER ACTION LinkToExcel() ACTIVATE WINDOW oWnd CENTERED return (0) static function ExportToExcel() local oRs, oBook, oSheet, n CursorWait() oRs := FW_OpenRecordSet( oCn, "CUSTOMER" ) if oExcel == nil oExcel := ExcelObj() endif oExcel:ScreenUpdating := .f. oBook := oExcel:WorkBooks:Add() oSheet := oExcel:ActiveSheet for n := 1 to oRs:Fields:Count() oSheet:Cells( 1, n ):Value := oRs:Fields( n - 1 ):Name next // THIS ONE LINE OF CODE EXPORTS ENTIRE RECSET TO EXCEL n := oSheet:Cells( 2, 1 ):CopyFromRecordSet( oRs ) // oRs:Close() CursorArrow() MsgInfo( "Exported " + cValToChar( n ) + " Rows to Excel" ) oExcel:ScreenUpdating := .t. oExcel:visible := .t. ShowWindow( oExcel:hWnd, 3 ) BringWindowToTop( oExcel:hWnd ) return nil

Dima: Как сменить размер шрифта комментария к ячейке таблицы ? Макрос молчит как партизан

Vlad04: А у меня общается Sub Макрос1() ' ' Макрос1 Макрос ' Макрос записан 01.02.2018 (Vl) ' Range("M196").AddComment Range("M196").Comment.Visible = False Range("M196").Comment.Text Text:="Vl:" & Chr(10) & "два" Range("N203").Select End Sub

Dima: Vlad04 У меня тоже , но я хочу увеличить шрифт комента и вот тут макрос молчит , хотя я руками его могу поменять

Vlad04: не то

Vlad04: шрифт изменение не пишется в макрос

Dima: Vlad04 пишет: шрифт изменение не пишется в макро я про это сразу и написал

Haz: Шрифт меняется через пропертю Shape вот пример из VB [pre2] Dim ws As Worksheet Dim cmt As Comment For Each ws In ActiveWorkbook.Worksheets For Each cmt In ws.Comments With cmt.Shape.TextFrame.Characters.Font .Name = "Times New Roman" .Size = 12 End With Next cmt Next ws [/pre2] Ну если совсем в лоб то так [pre2] oSheet:Range("A1"):AddComment() oSheet:Range("A1"):Comment:Visible = .T. oSheet:Range("A1"):Comment:Text("Same text",1, 1 ) oSheet:Range("A1"):Comment:Shape:TextFrame:Characters:Font:Name = "Times New Roman" oSheet:Range("A1"):Comment:Shape:TextFrame:Characters:Font:Size = 14 [/pre2]

Dima: Haz Да получилось , в лоб так сказать. oSheet:cells(j,3):Comment:Shape:TextFrame:Characters:Font:Size:=12

Softlog86: Как красиво :)

Alex_Cher: Мужики... кто нибудь пробовал из Harbor создавать графики в Excel ..? Подскажите пару команд ....

Dima: Alex_Cher C:\MiniGUI\SAMPLES\BASIC\OLE\ + http://clipper.borda.ru/?1-2-0-00000033-000-0-0-1179749939

Alex_Cher: Наткнулся на "грали" .... помогите... вводим в ячейку excel данные oWorkBook:Cells( line, massiv[_i]) := 135 Можно ли из Harbor определить адрес данной ячейки в формате excel для использования фомулах, допустим =СУММ(N8: .....) или как это можно оботи ?

Pasha: Function ExcelAdr(nRow, nCol) Return if(nCol>26,Chr(Int((nCol-1)/26)+64),'')+Chr((nCol-1)%26+65) + StrTrim(Int(nRow))

Alex_Cher: Pasha, спасибо тебе большое ... не думал что так все просто. Только в конце команды я немножко подправлю. Вместо + StrTrim(Int(nRow)) .... + Allrtim( Str( Int( nRow))) Функция StrTrim() по моему была в Clipper, в Harbor ее нет...

Dima: Alex_Cher пишет: + Allrtim( Str( Int( nRow))) Hb_ntos(nRow)

Pasha: Alex_Cher пишет: Функция StrTrim() по моему была в Clipper, в Harbor ее нет... Прошу прошения, это моя функция Function StrTrim(n) Local c := AllTrim(Str(n)) if At('.', c) # 0 c := RemRight(c, '0') c := RemRight(c, '.') endif Return c

Alex_Cher: Мужики, кто плотно с excel работает через Harbor? Над элементарной хренью бьюсь часами... Документации нет, из макросов нихрена ничего не понятно... Короче ячейку обвести рамкой все понятно - oWorkBook:Ceels( 3,12):Borders():Weight := 3 А как обвести группу ячеек одной рамкой ? oWorkBook:Range( oWoorkBook:Ceels( 3,12), ......... ):Borders():Weight := 3 обводит рамкой каждую ячейку, не подходит...

Dima: как то так oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,2)):BorderAround( xlContinuous, xlThin)

Alex_Cher: Dima, спасибо за помощь... Поделись где копаешь документацию?

Dima: Alex_Cher пишет: Поделись где копаешь документацию? на форуме ищу и гуглю

alex_II: Печатая отчёты через Excel потребовалось поменять имя книги Книга1 на своё, но так и не разобрался как. Подскажите, кто сталкивался с этой задачей. oExcel := TOleAuto():New('Excel.Application') oExcel:Visible := .F. oBook := oExcel:WorkBooks:Add() oSheet := oExcel:Get('ActiveSheet') ...

Andrey: В этой же теме я давал как работать с книгами... Как их скрывать от пользователя и т.д. Читай предыдущие темы, я уже не помню где это, но тот же вопрос задавал ранее в этой теме.

Dima: Andrey Ты очень помог человеку

Andrey: Dima пишет: Ты очень помог человеку Ну занят очень пока. А я с таким разбирался и писал в этой теме чуть раньше.

Haz: что то туплю Вопрос в том как сделать :Save() или :SaveAs() ?

Dima: Haz пишет: Вопрос в том как сделать :Save() или :SaveAs() ? Да это понятно с Save... Имелось в виду следующее: создали новую книгу EXCEL , так вот в заловке сразу торчит Книга1 - Microsoft Excel , вот там и хочет поменять и чую спинным мозгом что не получится и только через сохранение

Haz: Dima пишет: чую спинным мозгом что не получится и только через сохранение Согласен с твоим спинным мозгом, не поспоришь

SergKis: Dima пишет чую спинным мозгом что не получится и только через сохранение Так может исп. hbxlsxml.lib для создания Sheet, а потом работать OLE У Игоря был, где то выкладывал, пример простой с dbf получение xml, сделать Книги сколько надо и загрузить в OLE. кусочек из своего варианта с Sheet ... [pre2] oXml := ExcelWriterXML():New( cFile ) // Создаем объект XML oXml:setOverwriteFile( .T. ) FOR nI := 1 TO Len(aSheet) cKey := aSheet[ nI ] cSheet := hb_ntos(nI)+". "+ltrim(cKey) oSheet := oXml:addSheet( cSheet ) // Определяем Лист if aColSel == Nil .or. Len(aColSel) == 0 // Определяем колонки aColSel := CalcAcolselForTbl( oBrw, aColSel ) Endif nColDbf := Len(aColSel) ; nColHead := 0 // Определяем ширины колонок из бровса FOR EACH i IN aColSel ; oSheet:columnWidth( ++nColHead, oBrw:aColumns[ i ]:XML_ColWidth ) NEXT oStyle := oXml:addStyle( "Title" ) // Определяем стиль названия отчета oStyle:alignHorizontal( n2cAlign( DT_CENTER ) ) oStyle:alignVertical ( n2cAlign( DT_CENTER ) ) oStyle:SetfontName( cTitleFont ) oStyle:SetfontSize( nTitleSize ) // oStyle:SetfontSize( 17 ) oStyle:setFontBold() IF lTsbSuperHd // Определяем суперхидер FOR i := 1 To len( oBrw:aSuperHead ) oStyle := oXml:addStyle( "SH" + hb_ntos(i) ) nAlign := oBrw:aSuperHead[ i ][12] cAlign := n2cAlign( nAlign ) oStyle:alignHorizontal( cAlign ) nAlign := oBrw:aSuperHead[ i ][13] cAlign := n2cAlign( nAlign ) oStyle:alignVertical( cAlign ) oStyle:bgColor( '#' + N2hex(oBrw:nClrHeadBack, 16) ) oStyle:SetfontName( GetFontParam(oBrw:aSuperHead[ i ][7])[1] ) oStyle:SetfontSize( GetFontParam(oBrw:aSuperHead[ i ][7])[2] ) If GetFontParam(oBrw:aSuperHead[ i ][7])[3] oStyle:setFontBold() EndIf oStyle:Border( "All", 2, "Automatic", "Continuous" ) oStyle:alignWraptext() NEXT ENDIF nColHead := 0 // Определяем стили шапки колонок ... [/pre2] aSheet - массив названий книг и Len(aSheet) - их кол-во

Haz: Haz пишет: Согласен с твоим спинным мозгом, не поспоришь Забыл написать. Свойство NAME у объекта книга только чтение

Andrey: alex_II пишет: Печатая отчёты через Excel потребовалось поменять имя книги Книга1 на своё, но так и не разобрался как. Подскажите, кто сталкивался с этой задачей. Тема Снова EXCEL (продолжение) http://clipper.borda.ru/?1-4-0-00001115-000-260-0-1628243986 Вот с этим я разобрался: [pre2] Сделал тест, кому будет интересно: oExcel:WorkBooks:Add() oExcel:Visible := .T. oBook := oExcel:ActiveWorkBook oSheet := oExcel:ActiveSheet() oSheet := oBook:Sheets(2) oSheet:name := "МОЁ_НЕ_ТРОГАТЬ!" // имя листа изменить nCnt := oBook:Sheets:Count // количество листов в книге cMsg := "Количество листов в книге = " + HB_NtoS(nCnt) + ";" FOR EACH oSheet IN oBook:WorkSheets cMsg += oSheet:Name + ";" NEXT cMsg := StrTran(cMsg, ";", CRLF ) MsgInfo(cMsg) oSheet:Cells:Font:Name := "Arial" oSheet:Cells:Font:Size := 12 oSheet:Cells( 3, 1 ):Value := "City:" oSheet:Cells( 3, 2 ):Value := "Moskow" ....... // далее запись во 2 лист oSheet:Visible := .F. // скрыть лист 2 oBook:Sheets(3):Select() // перейдём на 3 лист oSheet := oExcel:ActiveSheet() oSheet:Visible := .F. // скрыть лист 3 oBook:Sheets(1):Select() // вернутся на 1 лист oSheet := oExcel:ActiveSheet() oSheet:name := "Мой_отчёт" // имя листа изменить ...........[/pre2]

Dima: Haz пишет: Свойство NAME у объекта книга только чтение Но если хочется сменить заголовок окна Excel то можно сделать так. [pre2] local oExcel, oWorkBook, oWindows local nI, nCount, w , oSheet REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) oExcel := win_oleCreateObject( "Excel.Application" ) if !empty(oExcel) ? oExcel:version oSheet := oExcel:ActiveSheet() ? oExcel:hwnd oWindows := oExcel:Windows() oWorkBook := oExcel:WorkBooks:Add() nCount := oWindows:Count oWindows[1]:Caption := "Блабла" + hb_NtoS( nCount ) for each w in oWindows ? w:caption ? oExcel:hwnd next oExcel:Visible := .T. else ? "Error: MS Excel not available. [" + win_oleErrorText() + "]" endif [/pre2]

Andrey: Dima пишет: Но если хочется сменить заголовок окна Excel то можно сделать так. Классно ! А я не знал что так тоже можно !

Haz: Dima пишет: Но если хочется сменить заголовок окна Полезно

alex_II: Всем спасибо за внимание, но похоже проблема решения не имеет. Вариант через сохранение файла не подходит.

Петр: alex_II пишет: Всем спасибо за внимание, но похоже проблема решения не имеет. Вариант через сохранение файла не подходит. Из Википедии (куда без нее ) Решение — завершение процесса выбора, которое обычно (иногда неправильно) фиксирует процесс во времени. Принятие решения рассматривается как когнитивный процесс, результатом которого является выбор мнения или курса действий среди нескольких альтернативных возможностей. Еще одна альтернативная возможность с использованием пользовательского шаблона [pre2]procedure main(...) local oExcel, oWorkBook local cTPath local cTDir := "tmplts", cTName := "EBook.xltx" oExcel := win_oleCreateObject("Excel.Application") if !empty(oExcel) ? oExcel:Version cTPath := hb_DirSepAdd(hb_DirBase() + cTDir) oWorkBook := oExcel:WorkBooks:Add(cTPath + cTName) oExcel:Visible := .T. else ? "Error: MS Excel not available. [" + win_oleErrorText() + "]" endif return NIL [/pre2] В рабочем каталоге есть вложенная папка tmplts, а в ней - шаблон EBook.xltx. Открытая книга будет иметь имя EBook1. Как создать шаблон в Эксель думаю знают все.

Haz: Петр пишет: В рабочем каталоге есть вложенная папка tmplts, а в ней - шаблон EBook.xltx. Открытая книга будет иметь имя EBook1. Есть такой вариант, но если проблема только уйти от имени Книга(1...n) на свое, то ничем не отличается от сохранения. Этот Ебук тоже лежит на диске, а если хочется иметь множество своих имен , то и шаблонов будет много. alex_II пишет: Вариант через сохранение файла не подходит. По мне, проще сохранять при старте с любым именем и тереть при завершении , если нужно то сохранять результат работы уже куда и как положено. Хотя чем имя Книга1 не устраивает то ? и почему сохранение не подходит ?

Петр: Haz пишет: Есть такой вариант, но если проблема только уйти от имени Книга(1...n) на свое, то ничем не отличается от сохранения. Вы ничего не понимаете, ЭТО ДРУГОЕ! А если серьезно, то alex_II пишет: Печатая отчёты через Excel потребовалось поменять имя книги Книга1 Вот отчеты, особенно сложные, для меня удобнее писать через шаблоны. Формулы, макросы, диаграммы.. Haz пишет: Этот Ебук тоже лежит на диске, а если хочется иметь множество своих имен , то и шаблонов будет много Разные отчеты - разные шаблоны. А если что, то и Ебук можно переименовывать перед употреблением.

Haz: Петр пишет: Вы ничего не понимаете, ЭТО ДРУГОЕ! Для чего нужны шаблоны я догадываюсь уже второй десяток лет хотя сам почти не использую, впрочем как и ole из за его тормознутости ( при выводе нескольких тысяч строк реестра можно идти спать ) Насколько я понял, Alex_ll их не использует, а вот тему с сохранением я не понял. Почему она не подходит не пойму. Создал Эксель, сохранил сразу как надо, через ту же Олю заполнил, если нужно пересохранил, не нужно удалил. Единственное что может доставить неудобство, так это то, что при закрытии программы Эксель еще висит у пользователя в работе. Но ведь сохраняем изначально во временной папке и при старте просто трем в ней все , что удается стереть ( можно с проверкой на блокировку )

Dima: Haz пишет: при выводе нескольких тысяч строк реестра можно идти спать Ты не прав Игорь , тоже был такой тормозок и решил его с помощью oRange:Value := __oleVariantNew( WIN_VT_VARIANT, ...... ну ты понял :) Сейчас отчётик строится на раз два , два даже произнести не успеваю ))

Dima: Haz 100 000 строк нормально будет ? [pre2] #include "hbole.ch" local oExcel, oWorkBook, oWindows local nI, nCount, w , oSheet local orange,orange1,orange2 local xlsarrrow:={} local nrows:=100000 REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) oExcel := win_oleCreateObject( "Excel.Application" ) if !empty(oExcel) oWorkBook := oExcel:WorkBooks:Add() oSheet := oExcel:ActiveSheet() oRange := oSheet:Range(oSheet:Cells(1, 1), oSheet:Cells(nrows, 2)) oRange1 := oSheet:Range(oSheet:Cells(1, 1), oSheet:Cells(nrows, 1)) oRange2 := oSheet:Range(oSheet:Cells(1, 2), oSheet:Cells(nrows, 2)) for ni=1 to nrows aadd(xlsarrrow,{hb_ntos(ni),hb_milliseconds()}) next oRange:Value := __oleVariantNew( WIN_VT_VARIANT, xlsarrrow, nrows, 2 ) oRange2:Font:Size := 12 oRange1:Font:Size := 8 oRange2:NumberFormat:="# ##0" oExcel:Visible := .T. else ? "Error: MS Excel not available. [" + win_oleErrorText() + "]" endif [/pre2] PS Мне кажется что hbxlsxml.lib будет нервно курить в сторонке при таком объеме данных + форматирование

Haz: Dima пишет: тоже был такой тормозок и решил его с помощью oRange:Value := __oleVariantNew В километровых отчетах финансисты желают видеть формулы а не значения. И базовые параметры ( курсы, пошлины, ставки налогов и пр выносить в шапку ) Для таких игр вариант-массив не катит.

Dima: Haz формулы (я не юзал) можно в массив загнать ?

Haz: Dima пишет: Мне кажется что hbxlsxml.lib будет нервно курить в сторонке при таком объеме данных + форматирование Только кажется Текстовой вывод в файл очень быстрый, современные диски сам знаешь с какой скоростью пишут. Подготовка и вставка большого массива точно не быстрее.

Pasha: alex_II пишет: Всем спасибо за внимание, но похоже проблема решения не имеет. Вариант через сохранение файла не подходит. Есть простой критерий, чтобы определить, есть решение или нет. Открываем Excel, создаем новую книгу. Меняем название книги без ее сохранения. Что, не получается ? Так отож

Pasha: Dima пишет: формулы (я не юзал) можно в массив загнать ? В документации написано, что можно Для Range:Formula допускается присвоение массива: If the range is a one- or two-dimensional range, you can set the formula to a Visual Basic array of the same dimensions. Similarly, you can put the formula into a Visual Basic array. Setting the formula for a multiple-cell range fills all cells in the range with the formula.

Andrey: Dima пишет: формулы (я не юзал) можно в массив загнать ? Смотри пример MiniGUI\SAMPLES\Advanced\Tsb_Export_2 Формулы легко загоняются в массив, а далее в эксель:

Pasha: При работе со значениями/формулами как говорится "есть ньюанс" Ячейка может иметь либо значение, либо формулу Если заполнять Range массивом значений, то даже если в массиве в тех ячейках, в которых есть формулы стоит nil, формулы будут снесены

MIKHAIL: Dima пишет: oRange:Value := __oleVariantNew( WIN_VT_VARIANT, ...... этот механизм работает в OpenOffice ?

Dima: MIKHAIL Надо Пашу спросить , я не работаю с OpenOffice

Pasha: MIKHAIL пишет: этот механизм работает в OpenOffice ? Да, синтаксис другой: oRange:setDataArray(aData)

Haz: Погонял пример hbXlsxWriter из поставки Minigui Достойная альтернатива OLE. Поддержка всего чего нужно. Полностью документирован. Форматы, таблицы, чарты, формулы , макросы и пр. И при этом хорошая скорость вывода. Из недостатков только один - это только Writer, а не Reader/Writer.

Andrey: Что то опять у меня с Экселем не получается. Не могу удалить первую строку в таблице. Как это сделать ? Получил вот такой макрос: [pre2] Rows("1:1").Select Selection.Delete Shift:=xlUp[/pre2] А как перевести для Харбора не понимаю.... [pre2] oExcel:WorkBooks:Add() oBook := oExcel:ActiveWorkBook() // это книга oSheet := oExcel:ActiveSheet() // это лист oExcel:Workbooks:Open( cFileDbf, 0 ) // здесь нужно удалить первую строку oBook := oExcel:Get("ActiveWorkBook") oBook:SaveAs( cFileXls, xlWorkbookNormal ) oExcel:Quit() [/pre2]

Pasha: oSheet:Rows(1):Delete(xlShiftUp)

Andrey: Pasha пишет: oSheet:Rows(1):Delete(xlShiftUp) Не удаляет первую строку в таблице в 2003 Экселе. Может по другому надо ?

Pasha: так удаляет же. 2003-й я конечно сейчас не найду, но в 2016-м работает. Это же базовый метод, версия Excel роли не играет

Dima: может так ? oSheet:Rows(1):Select() oSheet:Rows(1):Delete() PS почитать и пробнуть , сам не юзал

Andrey: Pasha пишет: так удаляет же. 2003-й я конечно сейчас не найду, но в 2016-м работает Да, в 2016 удаляет. Сделал как Дима предлагал [pre2] oSheet:Rows(1):Select() oSheet:Rows(1):Delete(xlShiftUp)[/pre2] И в 2003 заработало... Спасибо БОЛЬШОЕ вам !

Roman: Есть готовый макрос https://softclipper.net/ispolzovanie-sql-i-dbf/xls-v-dbf-i-dbf-v-xls-makros-excel.html

Vlad04: Есть пример работы с двумя файлами Excel? Открыть первый, второй файл, прочитать данные в первом файле, обработать их, занести во второй файл, сохранить второй файл.

Vlad04: Всё получилось, всё как обычно

Dima: Не могу понять как это преобразовать в Harbour Хотел отслеживать что менялось в документе [pre2] With ActiveWorkbook .HighlightChangesOptions When:=xlSinceMyLastSave, Who:="Everyone" // вот тут затык .ListChangesOnNewSheet = True End With [/pre2]

Haz: Dima пишет: вот тут затык В справке MS это представлено как функция. https://learn.microsoft.com/en-us/office/vba/api/excel.workbook.highlightchangesoptions так пробовал ? [pre2] Syntax expression.HighlightChangesOptions (When, Who, Where) [/pre2]

Dima: Падает зараза на строке oExcel:ActiveWorkbook:HighlightChangesOptions(xlSinceMyLastSave,"Everyone") или так oExcel:ActiveWorkbook:HighlightChangesOptions(xlSinceMyLastSave) Эта штука xlSinceMyLastSave в Excel.ch есть

Dima: Похоже не получится , так как если руками включать , то Excel требует сохранить книгу А сохранять как раз не нужно. Смысл был следующий , бух формирует отчетик , он формируется в Excel , после бух вносит свои правки , спецом или же по ошибке а потом мне выносят мозг , мол прога не правильно считает

Haz: Dima пишет: Падает зараза на строке Excel как правило требует явного указания всех параметров при передаче в функцию Ранее сталкивался с этой фичей

Haz: Dima пишет: после бух вносит свои правки , спецом или же по ошибке а потом мне выносят мозг , мол прога не правильно считает Делай скрытый ярлык под паролем и пиши туда копию . можно с условным форматом - цветом изменения если данные не совпадают в ячейках на двух листах

Dima: Haz пишет: Делай скрытый ярлык под паролем и пиши туда копию . можно с условным форматом - цветом изменения если данные не совпадают в ячейках на двух листах Покажи примерчик если есть живой а нет если буду гуглить :)

Haz: Dima пишет: Покажи примерчик если есть живой а нет если буду гуглить :) когда-то делал, поищу. Скорее всего в понедельник.

Haz: Haz пишет: когда-то делал, поищу где то так [pre2] func main() local oExcel, oSheet local i := j := 0 oExcel := win_oleCreateObject( "Excel.Application" ) oExcel:Visible := .t. oExcel:Workbooks:Add() oExcel:Sheets(1):Select() oExcel:Sheets(1):Select() oSheet := oExcel:ActiveSheet oExcel:Sheets(1):Select() for i := 1 To 10 for j := 1 to 10 oSheet:Cells( i, j):Value := i*j end end oExcel:Sheets(1):Select() oExcel:Sheets(1):Copy(after:=oExcel:Worksheets(1)) oExcel:Sheets(1):Name := "1" oExcel:Sheets(2):Name := "2" oExcel:Sheets(2):Protect("Password") oExcel:Sheets(2):Visible := .f. return nil [/pre2]

Dima: А как его поместить в самый конец Sheets и как понять какой номер ему будет присвоен что имя сменить и пасс поставить ? Макрос в Excel мне выдал я потом преобразовал oSheet:copy(after:=oExcel:Worksheets(3)) Откуда он взял цифру 3 ?

Dima: так нашел вроде Worksheets(Worksheets.Count)

Haz: *PRIVAT*

Dima: вот так вышло lastcnt:=oExcel:Worksheets:Count oSheet:Select() oSheet:copy(after:=oExcel:Worksheets(lastcnt)) oExcel:Sheets(lastcnt):Name :="Оргигинал" oExcel:Sheets(lastcnt):Protect("Колбаска") oSheet:Select() Спасибо

Haz: Dima пишет: вот так вышло

Andrey: Имею такой документ после эскпорта из ТСБ функцией oBrw:ExcelOle() Как мне задать нужную ширину колонок, после создания документа ?

Dima: oSheet:Columns(1):ColumnWidth := 3.86

Andrey: Спасибо БОЛЬШОЕ !!!

Andrey: Сделал так: [pre2] oExcel:Workbooks:Open( cFile, 0 ) oBook := oExcel:ActiveWorkBook() oSheet := oExcel:ActiveSheet() aWidth := {} For nI := 1 To oBrw:nColCount() nW := oBrw:aColumns[ nI ]:nWidth AADD( aWidth, nW ) ? nI, oBrw:aColumns[ nI ]:cName, nW Next For nI := 1 To LEN(aWidth) ? nI, oSheet:Columns(nI):ColumnWidth oSheet:Columns(nI):ColumnWidth := aWidth[nI] ?? "=>", oSheet:Columns(nI):ColumnWidth Next[/pre2] Вылет на 4 колонке: [pre2]Error WINOLE/1006 Нельзя установить свойство ColumnWidth класса Range (0x800A03EC): Microsoft Office Excel (DOS Error -2147352567) Args: [1] = N 317 --------------------------------- Stack Trace --------------------------------- Called from WIN_OLEAUTO:_COLUMNWIDTH(0) Called from EXCELFILEREFINEMENT(271) in module: Tsb2xlsOleExtern.prg Called from TOEXCEL2(247) in module: Form_7Btn.prg Called from (b)MYCONTEXMENUEXPORT(48) in module: Form_7Btn.prg Called from _DOCONTROLEVENTPROCEDURE(0) [/pre2] В логе вот так: [pre2]1 NAME_1 50 2 NAME_2 48 3 NAME_3 48 4 NAME_4 317 5 NAME_5 167 6 NAME_6 167 7 NAME_7 167 8 NAME_8 167 9 NAME_9 167 10 NAME_10 588 1 4.4300 => 50.0000 2 1.8600 => 48.0000 3 4.4300 => 48.0000 4 8.2900 [/pre2] Там в эксель-файле 1 строка объединены колонки с 1 по 10. Это может как то влиять ? Что делать ?

Andrey: Сделал короткий пример - https://cloud.mail.ru/public/oePE/DfQMjBnkT Кто может, подскажите пожалуйста, как задать ширину колонок в этом примере.

Haz: Andrey пишет: Кто может, подскажите пожалуйста, как задать ширину колонок в этом примере. так ты просишь установить ширину 4 колонки в более чем 3 метра. Размеры в Excel задаются в см. ( в тсб в пикселях ) Это конечно косяк excel, мои колонки какую хочу ширину , такую и делаю. Но 3 метра , явно перебор

Andrey: Haz пишет: Размеры в Excel задаются в см. ( в тсб в пикселях ) Блин, пролёт... Совсем про это забыл... Делал это же сам 3 года назад и забыл про это... Да, памяти уже совсем нет... Спасибо БОЛЬШОЕ !



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