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

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

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

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

Oskar_AAA: Dima программа xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476). консольная (25 х 80) REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') SetMode(25,80) если REQUEST HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT и подключаю GTWVT.lib при запуске программы выводится сообщение Unrecoverable error 10001 It's not a GUI programm переделывать под GUI - времени вообще нет... PS все функции Ваши & Andrey собрались и по ним ошибок при сборке программы нет. If Isiconic(Askar_Win) SetForeGroundWindow(Askar_Win) Endif ShowWindow(Askar_Win,9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win) set color to w/n ?hWnd,Askar_Win,Isiconic(Askar_Win) wait выдают числовые значения, Isiconic(Askar_Win)= .F.

Dima: Oskar_AAA К сожалению по Xharbour ни чего сказать не могу , давно слез с него на Harbour

Oskar_AAA: Коллеги, получилось в консольном xHarbour управлять окном и размером окна Excel с передачей фокуса на программу. Dima, Andrey и всем откликнувшемся - Рахмат # Include 'Achoice.Ch' # Include 'Command.Ch' # Include 'Dbedit.Ch' # Include 'Dbstruct.Ch' # Include 'Directry.Ch' # Include 'Excel.Ch' # Include 'Inkey.Ch' # Include 'Setcurs.Ch' # Include 'Hbgtinfo.Ch' // крестик на окне программы SetConsoleTitle(CTitle) hWnd:=FindWindow(CTitle) DeleteCloseButton(hWnd) // имена файлов в кириллице SetFileApis() // •Ґ-¤« ®Є®- Public Askar_Win1,Askar_Win2 Askar_Win1=GetForeGroundWindow() Askar_Win2=GetWindow() // REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') SetMode(25,80) обработка и так далее (создание временных Excel файлов....) создание сводного Excel отчета со многими листами из временных Excel файлов oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Day_Excel) oExcel_S:Set("DisplayAlerts",.F.) oExcel_S:Visible :=.T. // ўЁ§г «Ё§ жЁп бў®¤-®Ј® ®взҐв  oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1):Select() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,15):Select() oSheet_S:Cells(1,15):Value=Cdata // ¤ в  ®взҐв  oSheet_S:Cells(1,18):Value=Bom(Cdata) // ¤ в  - з «  ¬Ґбпж  oAs_S :Cells(1,1):Select() // управление окнами hWnd := oExcel_S:hWnd ShowWindow(hWnd,3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 If Askar_Win1>0 SetForeGroundWindow(Askar_Win1) Endif ShowWindow(Askar_Win1,9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win1) // вывод программы на ПЕРЕДНИЙ план сборка листов отчета #PRAGMA BEGINDUMP # include "Hbapi.h" # include "Windows.h" # include "Hbapiitm.h" # include "Shlobj.h" HB_FUNC( SETCONSOLETITLE ) { hb_retl( SetConsoleTitle( hb_parc( 1 ) ) ) ; } HB_FUNC( FINDWINDOW ) { hb_retnl( (LONG)FindWindow( NULL, hb_parc( 1 ) ) ) ; } HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ) ; } HB_FUNC( SETFILEAPIS ) // OEM { SetFileApisToOEM(); } HB_FUNC( ISICONIC ) { hb_retl( IsIconic( (HWND) hb_parnl(1)) ); } // ®ЇаҐ¤Ґ«Ґ-ЁҐ  ЄвЁў-®Ј® ®Є-  HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #PRAGMA ENDDUMP

Dima: Oskar_AAA пишет: и подключаю GTWVT.lib при запуске программы выводится сообщение Unrecoverable error 10001 It's not a GUI programm переделывать под GUI - времени вообще нет... GUI тут совсем не при чем.

Pasha: Здесь: https://support.microsoft.com/ru-ru/kb/124103 написано, как получить hWnd для консоли через вызов FindWindow так же есть оговорка: Полученный дескриптор HWND не обязательно подходит для всех операций дескриптор окна. Если немного модифицировать функции winapi, чтобы проанализировать возвращаемые значения: HB_FUNC( BRINGWINDOWTOTOP ) { hb_retnl( BringWindowToTop( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { hb_retnl( SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ) ); } и сделать тест: Function TestWnd Local ch := hb_gtinfo(HB_GTI_WINTITLE) Local hWnd1 := FindWindow(ch) Local hWnd2 := FindWindow('Паук') ? SETFOREGROUNDWINDOW(hWnd2) ? BringWindowToTop(hWnd2) Inkey(2) ? SETFOREGROUNDWINDOW(hWnd1) ? BringWindowToTop(hWnd1) return nil Запустить игрушку паук, и этот тест. Результат: ? SETFOREGROUNDWINDOW(hWnd1) возвращает 0, то есть не работает Похоже, здесь срабатывает та самая оговорка.

Oskar_AAA: Спасибо, за советы и участие. Обошелся проверкой на значение GetForeGroundWindow() >0 . Получилось то, что хотел в консоли

fokinal21: Надо очистить таблицу от пустых строк. Что-то из Harbour никак не получается... Может кто подскажет? Спасибо

Dima: fokinal21 пишет: Надо очистить таблицу от пустых строк Вопрос не очень понятен.

Dima: fokinal21 Может имелось в виду скрыть диапазон строк ?

fokinal21: Есть таблица в Excel, надо удалить пустые строки В моем частном случае дело упрощается тем, что их можно определить по пустым ячейкам первого столбца В vba это решается просто и понятно: Sub RowDel() LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count Application.ScreenUpdating = False For r = LastRow To 1 Step -1 If Application.Rows(r).Columns(1).Value = "" Then Rows(r).Delete Next r End Sub Попытался перевести все это в Harbour и вот что получилось : Function RowDel() oExcel := CreateObject( "Excel.Application" ) oExcel:Workbooks:Open(Getfile()) oList := oExcel:Get( "ActiveSheet" ) oExcel:Visible("True") LastRow:= oList:UsedRange:Row-1 + oList:UsedRange:Rows:Count For r = LastRow To 1 Step -1 If oExcel:Rows(r):Columns(1):Value <>"" oExcel:Rows(r):Delete() endif Next r return при этом, если в vba прога срабатывает при Value = "", что логически верно, то в Harbour все работает при Value <>"" что совсем мне непонятно Это проверено на простой тестовой таблице - просто заполнил в первом столбце несколько ячеек не подряд Кроме этого vba спокойно глотает наличие чисел в части ячеек, Harbour падает в ошибку.

Петр: За такой перевод переводчик от технического редактора по рукам может получить Ближе к теме: вспоминайте, для чего предназначена функция Empty в hb, и countA в vba, а также посмотрите пример от MVP Dennis Wallentin в топике Range.Row Property (Excel) Sub Delete_Empty_Rows() 'This example deletes the empty rows from a selected range.

fokinal21: Петр пишет: вспоминайте, для чего предназначена функция Empty Спасибо! С Empty действительно все хорошо, но все же был интерес перевода готового примера в Harbour. Переведенный пример вполне рабочий (при текстовых заполнениях ячеек), но так и непонятно почему в Harbour все срабатывает при oExcel:Rows(r):Columns(1):Value <>"", может разъясните где логика порылась... А то как-то неспокойно

Петр: fokinal21 пишет: но все же был интерес перевода готового примера в Harbour Ну так переводите, только учтите, что при переводе Шекспира на русский используются правила русского языка. А при переводе этого примера на Harbour правильно было бы учитывать особенности vba, Excell и Harbour, а не только . на : поменять. [pre2]procedure main ? "" = "" ? "" = NIL ? "" <> "" ? "" <> NIL ? "" = 0[/pre2]

Oskar_AAA: Добрый день, коллеги Имеется файл с иерархической структурой строк, как определить уровень иерархии по строке. Пробовал такое: RowLevel=oSheet:Outline:ShowLevels RowLevels RowLevel=oAs:Row(Ni):Outline:RowLevels

Oskar_AAA: Решил: RowLevel=oSheet:Rows(Ni):OutlineLevel

Softlog86: Читаем / пишем .XLSX файлы из HARBOUR без использования EXCELL ! У меня всё получилось собрать . Примем на вооружение : https://github.com/FTrautwein/hblibxlsxwriter

fokinal21: Всем добрый вечер! Кусок кода: oExcel:=CreateObject( "Excel.Application" ) ? oExcel:hWnd oExcel:Quit() ? oExcel:hWnd В результате выводятся одинаковые значения. Почему, если Excel закрыт? Тоже самое происходит, если открыть файл и закрыть его вручную вместо Quit

Haz: fokinal21 пишет: Почему Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта, т. к. это уже забота программиста. Еcли нужно что то с чемто сравнить, то нужно и проверить живо ли еще окно с таки хендлом

fokinal21: Haz пишет: Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта Получается, что после Quit объект еще не умер? Если закрыть окно "крестиком" - тот же результат. Haz пишет: проверить живо ли еще окно с таки хендлом А как проверить? Этот результат появился после танцев вокруг поиска способа именно такой проверки.

Dima: fokinal21 пишет: oExcel:Quit() я после этого делаю так oWorkBook:=nil oSheet:=nil oExcel:=nil



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