Автор | Сообщение |
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
[только новые]
|
|
Haz
|
| |
Пост N: 1036
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.08.16 11:35. Заголовок: Andrey пишет: Я у с..
Andrey пишет: Попробуй сначала задать формат а потом присвоить значение в ячейку
|
|
|
Dima
|
| |
Пост N: 5947
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.08.16 13:53. Заголовок: Haz пишет: Попробуй..
Haz пишет: цитата: | Попробуй сначала задать формат а потом присвоить значение в ячейку |
| Работает однако.
|
|
|
Dima
|
| |
Пост N: 6010
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.09.16 21:54. Заголовок: Может и была тема , ..
Может и была тема , не нашел. Нужно через Ole , иметь возможность только смотреть и печатать документ Excel. PS Сам документ формируется с установкой пароля на изменение. С этим нет проблем.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3484
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.09.16 07:56. Заголовок: Можно вызвать метод:..
Можно вызвать метод: Sheet:PrintPreview()
|
|
|
Dima
|
| |
Пост N: 6011
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.09.16 08:05. Заголовок: Pasha пишет: Можно ..
Pasha пишет: цитата: | Можно вызвать метод: Sheet:PrintPreview() |
| Да не плохой вариант , но если закрыть Preview то снова окажусь в Excel а там делай что хош.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3485
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.09.16 09:11. Заголовок: А если так: Excel:V..
А если так: Excel:Visible := .t. Sheet:PrintPreview() Excel:Visible := .f.
|
|
|
Dima
|
| |
Пост N: 6012
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.09.16 09:19. Заголовок: Pasha пишет: Excel:..
Pasha пишет: Заработало Спасибо
|
|
|
Pasha
|
| Администратор
|
Пост N: 3494
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.10.16 08:46. Заголовок: В office 2013 и offi..
В office 2013 и office 2010 с последними обновлениями появилась новая неприятная хворь: При открытии документа методом Excel:Workbooks:Open происходит или ошибка открытия, или зависание при выполнении метода. Хворь проявляется у Excel, и иногда у Word. У меня шаблоны документов хранятся на letodb сервере. Перед открытием я их копирую в папку temp из getenv('temp'). Причем одни шаблоны могут открываться нормально (это Word), а другие - нет. С Excel ситуация такая: после открытия документа он заполняется, и остается на экране для дальнейших действий с ним пользователя. Пользователь что-то с ним делает (печатает), и закрывает Excel. Оказывается, что процесс Excel остается висеть в памяти, а шаблон в папке Temp залочен им, и последующее открытие этого шаблона невозможно. Причем, такая ситуация проявляется нестабильно: два раза Excel может закрыться нормально, а на третий - затык. Если не переписывать файлы в папку temp, а хранить их в другой папке, то хворь не проявляется совсем. Иногда хворь проходит, если пошаманить с таким бубном: "Откройте вкладку Файл, чтобы переключиться в представление Microsoft Office Backstage. В меню Справка выберите пункт Параметры; отобразится диалоговое окно Параметры. Щелкните элемент Центр управления безопасностью и нажмите кнопку Параметры центра управления безопасностью. В центре управления безопасностью щелкните пункт Параметры блокировки файлов. Установите флажок Открывать выбранные типы файлов в режиме защищенного просмотра и разрешить редактирование." Но такие танцы с бубном помогают не во всех случаях. Пока я выкручиваюсь заменой магической заколдованной папки temp на другую папку, а там кто знает, как эта хворь будет вести себя дальше. Если занемог Office 2010 и обновлениями, то помогает его снос и установка версии с диска и отключением обновлений. У Office 2013 хворь врожденная.
|
|
|
Dima
|
| |
Пост N: 6042
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.16 09:48. Заголовок: Pasha пишет: Перед ..
Pasha пишет: цитата: | Перед открытием я их копирую в папку temp из getenv('temp') |
| Тоже так делаю , но в папке Temp создаю свою папку и уже копирую в нее , проблем не было ни разу. PS Office 2003
|
|
|
Pasha
|
| Администратор
|
Пост N: 3495
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.10.16 09:51. Заголовок: проблем не было ни р..
Значит, жди сюрпризов с новыми офисами.
|
|
|
Dima
|
| |
Пост N: 6043
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.16 13:26. Заголовок: Pasha Ключевая фраз..
Pasha Ключевая фраза "в папке Temp создаю свою папку и уже копирую в нее" , может и у тебя сработает кто знает.
|
|
|
|
Sadstar2016
|
| |
Пост N: 11
Зарегистрирован: 04.04.16
|
|
Отправлено: 23.12.16 02:48. Заголовок: для справки Задача ..
для справки Задача - Переместить лист в первую позицию Исходные данные ----------------------------------- 1. Макрос Sheets("Лист3").Select Sheets("Лист3").Move Before:=Sheets(1) ----------------------------------- 2.Функция VBA Moves the sheet to another location in the workbook. expression.Move(Before, After) expression Required. An expression that returns an object in the Applies To list. Before Optional Variant. The sheet before which the moved sheet will be placed. You cannot specify Before if you specify After. After Optional Variant. The sheet after which the moved sheet will be placed. You cannot specify After if you specify Before. Remarks If you don't specify either Before or After, Microsoft Excel creates a new workbook that contains the moved sheet. Example This example moves Sheet1 after Sheet3 in the active workbook. Worksheets("Sheet1").Move after:=Worksheets("Sheet3") ----------------------------------- 3.Работающий вариант oBook:Sheets("Итого"):Move( oBook:Sheets(1) ) //поставить перед листом N1
|
|
|
Oskar_AAA
|
| |
Пост N: 97
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 08:05. Заголовок: Добрый день, как вер..
Добрый день, как вернуть активным окно программы, после запуска Excel (формирование сводного отчета. 60 и более листов) из отдельных 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() .... формирование листов из отдельных Excel файлов // переход к сводному отчету Hb_GtInfo(HB_GTI_CLIPBOARDDATA, "") oSheet_S:=oBook_S :Sheets(1):Select() oBook_S :=oExcel_S :ActiveWorkBook oAs_S :=oExcel_S :ActiveSheet() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,5):Select() oSheet_S:Cells(1,5):Value=Dtoc(Date())+', '+Substr(Time(),1,5) oAs_S :Cells(1,7):Select() oSheet_S:Cells(1,7):Value=SecToTim(Seconds()-Start_Beg) oAs_S :Cells(1,1):Select() oBook_S :SaveAs(Upper(Day_Excel)) oExcel_S:Quit() oAs_S :=Nil oRange_S:=Nil oBook_S :=Nil oExcel_S:=Nil использовать oExcel_S:Visible :=.F. не вариант, надо что бы процесс формирования сводного Excel отчета был виден в фоновом окне, а окно программы стало активным... PS:xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 5282
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.17 11:21. Заголовок: Oskar_AAA пишет: ка..
Oskar_AAA пишет: цитата: | как вернуть активным окно программы, после запуска Excel |
| Надо получить хендл своей программы и переключиться на неё. Используй несколько функций из МиниГуи: GETWINDOW() потом BRINGWINDOWTOTOP() Скрытый текст #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #include "hbapi.h" #include "hbapiitm.h" #include "hbvm.h" // ---------------- взято из MiniGui ----------------------------- HB_FUNC( FINDWINDOWEX ) { hb_retnl( ( LONG ) FindWindowEx( ( HWND ) hb_parnl( 1 ), ( HWND ) hb_parnl( 2 ), ( LPCSTR ) hb_parc( 3 ), ( LPCSTR ) hb_parc( 4 ) ) ); } HB_FUNC( ISICONIC ) { hb_retl( IsIconic( (HWND) hb_parnl(1)) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } // --------------------------------------------- HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl(1) ); } HB_FUNC ( FINDWINDOW ) { hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); ShowWindow( (HWND) hb_parnl(1), SW_MAXIMIZE ); } HB_FUNC( MAXIRESTORE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } 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
| Только вот как получить хендл своей программы в хХарборе пока не знаю...
|
|
|
Oskar_AAA
|
| |
Пост N: 98
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 11:32. Заголовок: Тоже попробовал испо..
Тоже попробовал использовать HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); ShowWindow( (HWND) hb_parnl(1), SW_MAXIMIZE ); } HB_FUNC( MAXIRESTORE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } тестирую...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 5283
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.17 11:34. Заголовок: Вот ещё посмотри, дл..
Вот ещё посмотри, для хХарбора раньше делал: Скрытый текст ************************************************************************* * Copyright : (c) 2008, Verchenko Andrey. E-mail: 30195@mail.ru * : Все права сохраняются. * Date : 11/11/2008 * Avtor : Верченко Андрей * Rem : Получение списка ХЕНДЛов окон и ИМЕН окон запущенных в системе * : только на xHarbour'e * : Отдельное СПАСИБО модераторам: Петру и Григорию * : http://clipper.borda.ru/?1-1-0-00000159-000-0-1-1226399294 ************************************************************************** #include "common.ch" #include "inkey.ch" FUNCTION MAIN() LOCAL aStart := {}, nI, aMenu:={}, aItems:={}, nSelect, cTemp LOCAL nSEL, cMess, aOpt cMess := "Выберите действие с этим процессом..." aOpt := {"Свернуть","Развернуть","Спрятать","Показать","Убить"} STRFILE("","Process.lst", .F.) aStart := GetWindowList() // Считать ХЕНДЛ окна и ИМЯ окна FOR nI:= 1 TO LEN(aStart) AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) cTemp := STR(aStart[nI,1])+", "+HB_ANSITOOEM(aStart[nI,2]) AADD( aItems, cTemp ) STRFILE( cTemp+CHR(13)+CHR(10),"Process.lst",.T.) NEXT CLEAR SCREEN @ 1,7 SAY "Хендл окна Название окна" COLOR("11/0") DO WHILE LastKey() <> K_ESC nSelect := Achoice( 2, 5, MaxRow()-2, 75, aItems, .T. ) IF nSelect <> 0 // ВЫБОР ДЕЙСТВИЯ nSEL := Alert(cMess,aOpt) DO CASE CASE nSEL == 1 MINIMIZE( aStart[nSelect,1] ) Alert("Окно было свернуто") CASE nSEL == 2 // Display selected file MAXIMIZE( aStart[nSelect,1] ) Alert("Окно было развернуто на весь экран") CASE nSEL == 3 HIDE( aStart[nSelect,1]) Alert("Окно сделано невидимым") CASE nSEL == 4 SSHOW( aStart[nSelect,1]) Alert("Окно стало видимым") CASE nSEL == 5 KKILL( aStart[nSelect,1]) Alert("Окну отправлена команда на закрытие") ENDCASE KEYBOARD Chr(255) // sets Lastkey() to 255 Inkey() ENDIF ENDDO RETURN NIL #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 function GetWindowList() LOCAL aWindows := {}, cTitle := "" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) AADD( aWindows, {hWnd, upper(cTitle)} ) endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return aWindows #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #define VM_CLOSE 16 HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( HIDE ) { ShowWindow( (HWND) hb_parnl(1), SW_HIDE ); } HB_FUNC( SSHOW ) { ShowWindow( (HWND) hb_parnl(1), SW_SHOW ); } HB_FUNC( KKILL ) { SendMessage( (HWND) hb_parnl(1), VM_CLOSE,0,0); //DestroyWindow( (HWND) hb_parnl(1), VM_CLOSE); } 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: 6236
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 13:42. Заголовок: Oskar_AAA Попробуй ..
Oskar_AAA Попробуй где то в самом начале своей программы после любого вывода на экран получить хендл своего окна с помощью GETFOREGROUNDWINDOW (взять можно в Минигуи) А после запуска Excel используй ShowWindow + BringWindowToTop (взять можно в Минигуи)
|
|
|
Oskar_AAA
|
| |
Пост N: 100
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 14:01. Заголовок: Dima можно выслать и..
Dima можно выслать из Минигуи GETFOREGROUNDWINDOW и ShowWindow + BringWindowToTop я не работал в Минигуи... Спасибо...
|
|
|
Dima
|
| |
Пост N: 6237
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 14:04. Заголовок: Oskar_AAA #pragma ..
Oskar_AAA #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } #pragma ENDDUMP #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include "hbapiitm.h" HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } #pragma ENDDUMP
|
|
|
Oskar_AAA
|
| |
Пост N: 101
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 14:15. Заголовок: Спасибо, начну тести..
Спасибо, начну тестировать...
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|