Автор | Сообщение |
|
| постоянный участник
|
Пост N: 4144
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.04.15 22:50. Заголовок: Вопрос по Excel ?
Всем привет. Вопрос к знатокам Excel-я, как подсчитать сумму ВСЕХ значений с минусом и с плюсом ? Вот есть таблица из многих столбцов. Как сделать формулу для расчёта этих значений по 2-му столбцу ?
|
|
|
Ответов - 153
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|
|
| Администратор
|
Пост N: 3597
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.09.17 09:14. Заголовок: oRange:Characters(1,..
oRange:Characters(1, 6):Font:Bold := .t.
|
|
|
|
| |
Пост N: 6593
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.09.17 09:23. Заголовок: Pasha Работает, спа..
Pasha Работает, спасибо ! Попробовал на удачу еще так oSheet:Cells( 1, 2 ):Characters(1, 6):Font:Bold := .t. тоже пашет
|
|
|
|
| постоянный участник
|
Пост N: 5540
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 15:07. Заголовок: Вот опять нашёл бяку..
Вот опять нашёл бяку для Экселя в МиниГуи - если имена папки на русском, то записать книгу в файл не может ! Ошибка: 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 ) Блин, а нельзя ли как то ОЛЕ это исправить ? А то получаются программы на МиниГуи (терминалку не пробовал) урезанного профиля, папки на русском не создавать .. и т.д. Во всех других языках - каталоги и файлы давно на русском языке используют.
|
|
|
|
| Администратор
|
Пост N: 3608
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.17 16:46. Заголовок: Если дело в кодировк..
Если дело в кодировке, тогда вопрос: в поставке минигуи уникодный харбор или нет ? Содержание ошибки: объект oWorkBook не содержит метода SaveAs Какого класса объект oWorkBook - фиг его знает. При правильном присваивании должен быть класса WorkBook, а правильным ли оно было ? На прошлой странице попадался код: oBook := oExcel:ActiveSheet() объект oBook оказывается класса WorkSheet, что приводит к непоняткам при анализе кода. А что насчет oWorkBook ?
|
|
|
|
| постоянный участник
|
Пост N: 5542
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 17:10. Заголовок: Pasha пишет: А что ..
Pasha пишет: Вот про это я и спрашивал, код был из разных источников, под 2003-2007 везде работает, а на 2014-2016 уже вылетает. Как правильно написать код (чтобы и другие ориентировались на это) ? #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
|
|
|
|
| Администратор
|
Пост N: 3609
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.17 18:26. Заголовок: Ээ, Андрей, ты переп..
Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? oBook := oExcel:ActiveSheet() это лист. Только имя переменной надо давать что-то вроде oSheet oBook := oExcel:ActiveWorkBook() а это книга
|
|
|
|
| постоянный участник
|
Пост N: 5543
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 18:37. Заголовок: Pasha пишет: Ээ, Ан..
Pasha пишет: цитата: | Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? |
| Не заметил...
|
|
|
|
| постоянный участник
|
Пост N: 5544
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 19:30. Заголовок: Но все равно дело не..
Но все равно дело не в этом... А в русских буквах .... Протестировал следующее: 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 Вот сама функция: Скрытый текст
////////////////////////////////////////////////////////////////////// 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.
| Может в коде что-то нужно добавить ? Или не будут работать ПАПКИ с русскими именами ?
|
|
|
|
| Администратор
|
Пост N: 3610
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.17 19:53. Заголовок: В харборе допускаютс..
В харборе допускаются русские имена файлов и папок. Андрей, нужен контекст. Кодовая страница, как я понимаю, выставлена RU1251 ? cFileSave в какой кодовой странице ? Далее, еще раз. Харбор в поставке minigui уникодный ? Далее. Насколько я помню, в поставке minigui идет своя версия библиотеки hbole, которая по сути есть очень устаревший на много-много лет вариант оригинальной библиотеки харбора. Лучше использовать не ее, а оригинальную библиотеку. А самым лучшим решением было бы исключить эту библиотеку из поставки minigui, и использовать оригинальную. Кстати, если выполнить этот код с харбором не из поставки minigui, думаю, проблем не возникнет. Во всяком случае, у меня проблем с передачей русских имен файлов в продукты office через ole нет.
|
|
|
|
| постоянный участник
|
Пост N: 5545
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 20:28. Заголовок: Pasha пишет: Кодова..
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
|
|
|
|
| Администратор
|
Пост N: 3611
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.17 20:41. Заголовок: Ну как бы из приведе..
Ну как бы из приведенного примера не видно, как заполняется cFileSave. Лучше проверить, и убедиться, что кодировка та, что надо. А в харборе модуль работы с ole находится в библиотеке hbwin, так что hbolе наверняка его устаревшая версия из поставки minigui.
|
|
|
|
|
| Администратор
|
Пост N: 3612
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.09.17 21:34. Заголовок: Немного разобрался. ..
Немного разобрался. Харбор из поставки минигуи уникодный, но сам минигуи не уникодный. Библиотека 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. Тогда пусть в сборке будут обе библиотеки.
|
|
|
|
| постоянный участник
|
Пост N: 5546
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.17 00:00. Заголовок: Pasha пишет: Надо у..
Pasha пишет: цитата: | Надо убрать hbole.lib из батников сборки проекта, добавить вместо нее hbwin.lib, и вместо oExcel := TOleAuto():New( "Excel.Application" ) вызывать oExcel := win_oleCreateObject("Excel.Application") |
| Да мне Петр давно советовал уйти с hbole.lib, а я всё никак не решусь. Код перестаёт работать... Как делать - не знаю...
|
|
|
|
| Администратор
|
Пост N: 3613
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.09.17 12:57. Заголовок: Скачиваю hmg-17.09.7..
Скачиваю 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. Только надо не лажануться и все правильно сделать.
|
|
|
|
| постоянный участник
|
Пост N: 5547
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.17 13:27. Заголовок: Pasha пишет: Вывод:..
Pasha пишет: цитата: | Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. |
| Сделал папку D:\TEMP2_Русские_Буквы\Проверка букв\Тест новый - запускаю Xls_to_Csv.exe, xls-файл создаёт... В папке где собраны все мои проекты подключаю через SUBST - вот там эта программа xls-файл НЕ СОЗДАЁТ !!! Блин... Опять Win8.1 ставит подножку на пустом месте...
|
|
|
|
| Администратор
|
Пост N: 3614
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.09.17 13:28. Заголовок: Комментирую фрагмент..
Комментирую фрагмент в этой функции /* oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('Excel is not available!', PROGRAM ) RETURN endif */ вместо него добавляю: oExcel := win_oleCreateObject( "Excel.Application" ) собираю, делаю тоже самое. Работает. И со старой библиотекой hbole, и с новой hbwin. Ну хоть ты тресни, никак сломать не получается.
|
|
|
|
| Администратор
|
Пост N: 3615
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.09.17 13:33. Заголовок: А сам Excel сохраняе..
А сам Excel сохраняет файлы на сабстнутый диск ?
|
|
|
|
| постоянный участник
|
Пост N: 5548
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.17 13:39. Заголовок: Pasha пишет: А сам ..
Pasha пишет: цитата: | А сам Excel сохраняет файлы на сабстнутый диск ? |
| Да. Даже если обозвать папку \PROJECT\XLS_to_CSVII_Русские_буквы А функция MyCreateNewXls(cFileName) - вылетает, хотя код и там и там почти одинаковый.... Короче что-то с доступом к папке...
|
|
|
|
| постоянный участник
|
Пост N: 5549
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.17 13:45. Заголовок: Вот так поставил: ..
Вот так поставил: cTitle := "Тестовая таблица для конвертирования Xls в Csv" ...... oWorkBook := oExcel:Get("ActiveWorkBook") oWorkBook:Title := cTitle oWorkBook:Subject := cTitle oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) // #include "excel.ch" oExcel:Quit() и стал записываться xls-файл в папку \PROJECT\XLS_to_CSVII_Русские_буквы где SUBST назначен. Не хватало 3-х строчек кода ! СЛЕДУЮЩИЙ ВЫВОД ПРАВИЛЬНЫЙ : Pasha пишет: цитата: | Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. |
| Спасибо БОЛЬШОЕ за наводку !
|
|
|
|
| Администратор
|
Пост N: 3616
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.09.17 13:48. Заголовок: Буквально позавчера ..
Буквально позавчера делал заполнение бланка в Excel. Там всего лишь вставляется табличка, после которой идут подписи. Так вот, после заполнения таблички высота нескольких строк в подписи сама собой увеличилась, и стала где-то на полметра. Почему Excel решил так сделать - фиг его знает. Я так и не разобрался.
|
|
|
Ответов - 153
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|