Автор | Сообщение |
Dima
|
| |
Пост N: 2372
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL (продолжение)
Ранее с Excel из Harbour ни когда не работал. Поставили тут задачу. У некоторых поставщиков есть определенные формы заказов. Набраны они в Excel. Сейчас народ руками заполняет эти формы и шлет по электронке поставщикам. Задача сводится к тому что бы в этих формах находить нужные коды товара и в нужной ячейке проставлять заказ. Может ткнет кто носом с чего начать что бы не напороться на грабли. Спасибо Сами формы тут http://zalil.ru/33279066
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
Oskar_AAA
|
| |
Пост N: 112
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 17:37. Заголовок: Dima программа xHarb..
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
|
| |
Пост N: 6243
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 17:45. Заголовок: Oskar_AAA К сожален..
Oskar_AAA К сожалению по Xharbour ни чего сказать не могу , давно слез с него на Harbour
|
|
|
Oskar_AAA
|
| |
Пост N: 113
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 17:59. Заголовок: Коллеги, получилось..
Коллеги, получилось в консольном 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
|
| |
Пост N: 6244
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 22:31. Заголовок: Oskar_AAA пишет: и ..
Oskar_AAA пишет: цитата: | и подключаю GTWVT.lib при запуске программы выводится сообщение Unrecoverable error 10001 It's not a GUI programm переделывать под GUI - времени вообще нет... |
| GUI тут совсем не при чем.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3522
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.01.17 09:53. Заголовок: Здесь: https://suppo..
Здесь: 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
|
| |
Пост N: 114
Зарегистрирован: 09.09.11
|
|
Отправлено: 08.01.17 12:14. Заголовок: Спасибо, за советы и..
Спасибо, за советы и участие. Обошелся проверкой на значение GetForeGroundWindow() >0 . Получилось то, что хотел в консоли
|
|
|
fokinal21
|
| |
Пост N: 16
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 11:28. Заголовок: Надо очистить таблиц..
Надо очистить таблицу от пустых строк. Что-то из Harbour никак не получается... Может кто подскажет? Спасибо
|
|
|
Dima
|
| |
Пост N: 6260
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.01.17 13:33. Заголовок: fokinal21 пишет: На..
fokinal21 пишет: цитата: | Надо очистить таблицу от пустых строк |
| Вопрос не очень понятен.
|
|
|
Dima
|
| |
Пост N: 6262
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.01.17 15:17. Заголовок: fokinal21 Может име..
fokinal21 Может имелось в виду скрыть диапазон строк ?
|
|
|
fokinal21
|
| |
Пост N: 17
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 17:25. Заголовок: Есть таблица в Excel..
Есть таблица в 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 падает в ошибку.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1404
Зарегистрирован: 09.10.06
|
|
Отправлено: 28.01.17 18:14. Заголовок: За такой перевод пер..
За такой перевод переводчик от технического редактора по рукам может получить Ближе к теме: вспоминайте, для чего предназначена функция 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
|
| |
Пост N: 18
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 19:24. Заголовок: Петр пишет: вспомин..
Петр пишет: цитата: | вспоминайте, для чего предназначена функция Empty |
| Спасибо! С Empty действительно все хорошо, но все же был интерес перевода готового примера в Harbour. Переведенный пример вполне рабочий (при текстовых заполнениях ячеек), но так и непонятно почему в Harbour все срабатывает при oExcel:Rows(r):Columns(1):Value <>"", может разъясните где логика порылась... А то как-то неспокойно
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1405
Зарегистрирован: 09.10.06
|
|
Отправлено: 28.01.17 20:05. Заголовок: fokinal21 пишет: но..
fokinal21 пишет: цитата: | но все же был интерес перевода готового примера в Harbour |
| Ну так переводите, только учтите, что при переводе Шекспира на русский используются правила русского языка. А при переводе этого примера на Harbour правильно было бы учитывать особенности vba, Excell и Harbour, а не только . на : поменять. цитата: | procedure main ? "" = "" ? "" = NIL ? "" <> "" ? "" <> NIL ? "" = 0 |
|
|
|
|
Oskar_AAA
|
| |
Пост N: 116
Зарегистрирован: 09.09.11
|
|
Отправлено: 07.02.17 07:36. Заголовок: Добрый день, коллеги..
Добрый день, коллеги Имеется файл с иерархической структурой строк, как определить уровень иерархии по строке. Пробовал такое: RowLevel=oSheet:Outline:ShowLevels RowLevels RowLevel=oAs:Row(Ni):Outline:RowLevels
|
|
|
Oskar_AAA
|
| |
Пост N: 117
Зарегистрирован: 09.09.11
|
|
Отправлено: 07.02.17 09:43. Заголовок: Решил: RowLevel=oShe..
Решил: RowLevel=oSheet:Rows(Ni):OutlineLevel
|
|
|
Softlog86
|
| |
Пост N: 350
Зарегистрирован: 03.12.08
|
|
Отправлено: 11.04.17 22:28. Заголовок: Читаем / пишем .XLSX..
|
|
|
fokinal21
|
| |
Пост N: 20
Зарегистрирован: 22.09.13
|
|
Отправлено: 15.04.17 19:42. Заголовок: Всем добрый вечер! К..
Всем добрый вечер! Кусок кода: oExcel:=CreateObject( "Excel.Application" ) ? oExcel:hWnd oExcel:Quit() ? oExcel:hWnd В результате выводятся одинаковые значения. Почему, если Excel закрыт? Тоже самое происходит, если открыть файл и закрыть его вручную вместо Quit
|
|
|
Haz
|
| |
Пост N: 1086
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.04.17 20:25. Заголовок: fokinal21 пишет: По..
fokinal21 пишет: Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта, т. к. это уже забота программиста. Еcли нужно что то с чемто сравнить, то нужно и проверить живо ли еще окно с таки хендлом
|
|
|
fokinal21
|
| |
Пост N: 21
Зарегистрирован: 22.09.13
|
|
Отправлено: 15.04.17 21:27. Заголовок: Haz пишет: Потому ч..
Haz пишет: цитата: | Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта |
| Получается, что после Quit объект еще не умер? Если закрыть окно "крестиком" - тот же результат. Haz пишет: цитата: | проверить живо ли еще окно с таки хендлом |
| А как проверить? Этот результат появился после танцев вокруг поиска способа именно такой проверки.
|
|
|
Dima
|
| |
Пост N: 6360
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.04.17 21:28. Заголовок: fokinal21 пишет: oE..
fokinal21 пишет: я после этого делаю так oWorkBook:=nil oSheet:=nil oExcel:=nil
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|