On-line: PSP, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
Dima
администратор




Пост N: 2372
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL (продолжение)


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

Спасибо: 0 
Профиль
Ответов - 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.





Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6243
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.01.17 17:45. Заголовок: Oskar_AAA К сожален..


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

Спасибо: 0 
Профиль
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



Спасибо: 0 
Профиль
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 тут совсем не при чем.

Спасибо: 0 
Профиль
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, то есть не работает

Похоже, здесь срабатывает та самая оговорка.

Спасибо: 0 
Профиль
Oskar_AAA



Пост N: 114
Зарегистрирован: 09.09.11
ссылка на сообщение  Отправлено: 08.01.17 12:14. Заголовок: Спасибо, за советы и..


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

Спасибо: 0 
Профиль
fokinal21



Пост N: 16
Зарегистрирован: 22.09.13
ссылка на сообщение  Отправлено: 28.01.17 11:28. Заголовок: Надо очистить таблиц..


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

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6260
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.01.17 13:33. Заголовок: fokinal21 пишет: На..


fokinal21 пишет:

 цитата:
Надо очистить таблицу от пустых строк


Вопрос не очень понятен.

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6262
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.01.17 15:17. Заголовок: fokinal21 Может име..


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

Спасибо: 0 
Профиль
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 падает в ошибку.


Спасибо: 0 
Профиль
Петр
постоянный участник


Пост 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.


Спасибо: 1 
Профиль
fokinal21



Пост N: 18
Зарегистрирован: 22.09.13
ссылка на сообщение  Отправлено: 28.01.17 19:24. Заголовок: Петр пишет: вспомин..


Петр пишет:

 цитата:
вспоминайте, для чего предназначена функция Empty


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

Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1405
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.01.17 20:05. Заголовок: fokinal21 пишет: но..


fokinal21 пишет:

 цитата:
но все же был интерес перевода готового примера
в Harbour



Ну так переводите,
только учтите, что при переводе Шекспира на русский используются правила русского языка.

А при переводе этого примера на Harbour правильно было бы учитывать особенности vba, Excell и Harbour, а не только . на : поменять.


 цитата:
procedure main 

? "" = ""
? "" = NIL

? "" <> ""
? "" <> NIL
? "" = 0





Спасибо: 0 
Профиль
Oskar_AAA



Пост N: 116
Зарегистрирован: 09.09.11
ссылка на сообщение  Отправлено: 07.02.17 07:36. Заголовок: Добрый день, коллеги..


Добрый день, коллеги
Имеется файл с иерархической структурой строк, как определить уровень иерархии по строке.
Пробовал такое:

RowLevel=oSheet:Outline:ShowLevels RowLevels

RowLevel=oAs:Row(Ni):Outline:RowLevels


Спасибо: 0 
Профиль
Oskar_AAA



Пост N: 117
Зарегистрирован: 09.09.11
ссылка на сообщение  Отправлено: 07.02.17 09:43. Заголовок: Решил: RowLevel=oShe..


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

Спасибо: 0 
Профиль
Softlog86



Пост N: 350
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 11.04.17 22:28. Заголовок: Читаем / пишем .XLSX..


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

https://github.com/FTrautwein/hblibxlsxwriter

Спасибо: 4 
Профиль
fokinal21



Пост N: 20
Зарегистрирован: 22.09.13
ссылка на сообщение  Отправлено: 15.04.17 19:42. Заголовок: Всем добрый вечер! К..


Всем добрый вечер!
Кусок кода:

oExcel:=CreateObject( "Excel.Application" )
? oExcel:hWnd
oExcel:Quit()
? oExcel:hWnd

В результате выводятся одинаковые значения. Почему, если Excel закрыт?
Тоже самое происходит, если открыть файл и закрыть его вручную вместо Quit



Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1086
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.04.17 20:25. Заголовок: fokinal21 пишет: По..


fokinal21 пишет:

 цитата:
Почему


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

Спасибо: 0 
Профиль
fokinal21



Пост N: 21
Зарегистрирован: 22.09.13
ссылка на сообщение  Отправлено: 15.04.17 21:27. Заголовок: Haz пишет: Потому ч..


Haz пишет:

 цитата:
Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта


Получается, что после Quit объект еще не умер?
Если закрыть окно "крестиком" - тот же результат.

Haz пишет:

 цитата:
проверить живо ли еще окно с таки хендлом


А как проверить? Этот результат появился после танцев вокруг поиска способа именно такой проверки.


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6360
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.04.17 21:28. Заголовок: fokinal21 пишет: oE..


fokinal21 пишет:

 цитата:
oExcel:Quit()


я после этого делаю так
oWorkBook:=nil
oSheet:=nil
oExcel:=nil


Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 183
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет