On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
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 [только новые]


Dima
администратор




Пост N: 2373
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.05.12 18:37. Заголовок: Пока что интересует:..


Пока что интересует:
поиск в определенной колонке c определенной строки




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




Пост N: 2354
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.05.12 19:51. Заголовок: Да никаких особенных..


Да никаких особенных граблей быть не может. Примерно так:

Local oExcel := Win_OleAuto():New( "Excel.Application" ) 
Local oBook, oSheet, oCell, xValue
Local nRow := 3
Local nCol := 3, nCol2 := 5

oExcel:Visible := .f.

oExcel:Workbooks:Open( cFile, 0 )
oBook := oDoc:ActiveWorkBook
oSheet := oExcel:ActiveSheet
while .t.
oCell := oSheet( nRow, nCol )
xValue := oRange:Value
if Empty(xValue)
exit
endif
if xValue == <Kod>
oSheet( nRow, nCol2 ):Value := <Zakaz>
endif
enddo
...

oBook:Close(.f.)
oExcel:Quit()


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




Пост N: 2212
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.05.12 19:56. Заголовок: Dima пишет: Пока чт..


Dima пишет:

 цитата:
Пока что интересует:
поиск в определенной колонке c определенной строки



Форма жестко задана ?
Т.е. нужно найти (например: 001/001) и в ячейку "К-во (кг)" написать тебе нужную цифру ?

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



Пост N: 125
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 21.05.12 20:36. Заголовок: 1. Определяем для Ex..


1. Определяем для Excel-файла ширину/высоту рабочего ранга(было на форуме)
2. Бросаем ранг в массив. Ну и ищем чего надо

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


Пост N: 309
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 22.05.12 06:27. Заголовок: http://files.mail.ru..


http://files.mail.ru/X3JBC6
Пример загрузки из Excel- в базу

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




Пост N: 2374
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.05.12 13:48. Заголовок: fil пишет: 1. Опред..


fil пишет:

 цитата:
1. Определяем для Excel-файла ширину/высоту рабочего ранга(было на форуме)



что то не нашел......

Вроде все получилось , но после заполнения бланка и попытки закрытия EXCEL , он задает
вопрос , не желаю ли я сохранить изменения. Как обойти этот запрос и сохраниться ?

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



Пост N: 126
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 22.05.12 13:59. Заголовок: oExc:Sheets(nn):Used..


oExc:Sheets(nn):UsedRange:Rows:Count
oExc:Sheets(nn):UsedRange:Columns:Count

oExc:WorkBooks(имя):Close(FALSE,,FALSE)

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




Пост N: 2375
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.05.12 14:08. Заголовок: Всем спасибо !!!..


Всем спасибо !!!

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




Пост N: 2376
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.05.12 14:41. Заголовок: Наткнулся на грабли...


Наткнулся на грабли.
MT режим. Запущенная в отдельном потоке функция по по заполнению заявок
упорно не хочет запускать EXCEL.
Функция постоянно выдает FALSE

Private переменная oExcel объявлена из фунции которая вызывает Start_Excel()

Куда копать ?

PS
Простой пример без потоков в MT режиме срабатывает нормально.

 
func Start_Excel()
Local Res:=.f.
#ifndef __XHARBOUR__
#xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )}
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#endif

TRY
oExcel := GetActiveObject( "Excel.Application" )
oExcel:DisplayAlerts:=.f.
Res:=.t.

CATCH
Res:=.f.
TRY
oExcel := CreateObject( "Excel.Application" )
Res:=.t.
CATCH
// Ole2TxtError() выдает ошибку 0x800401f0
Res:=.f.
END
END


Return Res



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




Пост N: 2377
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.05.12 18:30. Заголовок: Похоже в MT режиме и..


Похоже в MT режиме и многопоточной обработкой EXCEL запустить не получиться.
Или не прав я и можно как то исправить ситуацию ?

PS
Уж очень не хочется функцию по заполнению бланков реализовывать в виде отдельной
программы и вызывать ее из основной задачи.

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



Пост N: 127
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 23.05.12 22:41. Заголовок: А так можно: Открыв..


А так можно:

Открываем один oExc:=CreateObject(Excel.Application). Открываем файл в нем листы с формами

На каждый трейд ActiveX():New( диалог, "OWC11.Spreadsheet" ) и на каждый кладем свою форму. Обрабатываем.



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


Пост N: 310
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 24.05.12 05:43. Заголовок: Private переменная o..



 цитата:
Private переменная oExcel объявлена из фунции


Я oExcel объявляю в головном файле и стартую из любого места программы

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




Пост N: 2378
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.05.12 08:59. Заголовок: fil пишет: Открывае..


fil пишет:

 цитата:
Открываем один oExc:=CreateObject(Excel.Application)



Dima пишет:

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



Dima пишет:

 цитата:
Ole2TxtError() выдает ошибку 0x800401f0



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




Пост N: 2379
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.05.12 15:24. Заголовок: Dima пишет: Уж очен..


Dima пишет:

 цитата:
Уж очень не хочется функцию по заполнению бланков реализовывать в виде отдельной
программы и вызывать ее из основной задачи.


Так и поступил. Работает ;)

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



Пост N: 61
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 25.05.12 12:44. Заголовок: Есть задача сгенерир..


Есть задача сгенерировать два XLS файла из одной DBF . Только разные условия для отбора .
Пока делаю последовательно ... Можно-ли клепать их одновременно (как-бы разные листы) ? А затем сохранять каждый лист отдельно ... Но я не знаю как это делать - у меня сохраняется вся книга сразу ....
Научите переключать книги и сохранять их отдельно :)

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




Пост N: 2380
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.05.12 13:53. Заголовок: Примерно так. proc..


Примерно так.

 
proc main
local oWorkBook1
local oWorkBook2
local cfile1:=CurDrive()+":\"+CurDir()+"\"+"z1.xls"
local cfile2:=CurDrive()+":\"+CurDir()+"\"+"z2.xls"
private oExcel

if !Start_Excel()
quit
endif

oWorkBook1 := oExcel:Workbooks:Open(cfile1)
oWorkBook2 := oExcel:Workbooks:Open(cfile2)
oExcel:Visible := .T.
oExcel:Windows(oWorkBook1:name()):Activate() // переключение между файлами
// oExcel:Windows(oWorkBook2:name()):Activate() переключение между файлами

wait
oWorkBook1:save()
oWorkBook1:close(.f.,,.f.)
oWorkBook2:save()
oWorkBook2:close(.f.,,.f.)


oExcel:Quit()
return nil




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



Пост N: 62
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 26.05.12 17:03. Заголовок: Уже спасибки ! А как..


Уже спасибки ! А как быть если XLS файлов нет ? Они создаются во время обработки данных из других DBF файлов ......
Интересует ещё команды изменения свойств ячейки ( столбца) : Тип данных , выравнивание , шаблон вывода.....


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




Пост N: 2382
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.05.12 17:20. Заголовок: Softlog86 А посмотр..


Softlog86
А посмотри примерчик
\svn\harbour\contrib\hbwin\tests\testole.prg

Что касаемо шаблона и выравнивания есть тема на форуме , поищи по слову Excel

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



Пост N: 136
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 03.08.12 17:13. Заголовок: Всем, привет ! Exce..


Всем, привет !

Excel через ole

1. Как получить текст формулы условного форматирования (ежели таковые определены для ячейки) ?
2. Можно ли программно выполнить формулу условного форматирования ?

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




Пост N: 2478
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.12 18:05. Заголовок: fil Сделай макрос и..


fil
Сделай макрос и все увидишь.
Можно погуглить на предмет Selection.FormatConditions

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



Пост N: 137
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 03.08.12 18:23. Заголовок: Ну эт понятно. Тока ..


Ну эт понятно. Тока в свойствах FormatConditions я не нашел текста формулы.
Собсно, мне нужно отловить событие изменения заливки ячеек формулой условного форматирования дабы прицепить к этим ячейкам примечания.


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




Пост N: 2479
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.12 18:30. Заголовок: Formula1 Formula2 не..


Formula1 Formula2 не оно разве ?

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



Пост N: 138
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 03.08.12 18:42. Заголовок: Да, это. Можно тепер..


Да, это. Можно теперь выполнить эту формулу в харбор синтаксисе и понять изменялась ли заливка. Лучше, конечно, через Interior:ColorIndex, но не получается

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




Пост N: 2480
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.08.12 10:09. Заголовок: fil пишет: Лучше, к..


fil пишет:

 цитата:
Лучше, конечно, через Interior:ColorIndex


http://office.microsoft.com/ru-ru/excel-help/HA001136627.aspx

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



Пост N: 139
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 04.08.12 19:21. Заголовок: Эт я знаю. Не получи..


Эт я знаю. Не получится - формула условного форматирования не меняет ColorIndex/Color. То ли есть еще какой признак цвета, то ли заливка ячейки происходит тока на экране.



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




Пост N: 2481
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.08.12 21:20. Заголовок: fil Давай XLS файли..


fil
Давай XLS файлик (пример) в студию и скажи точно что хош узнать. Поиграюсь.

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



Пост N: 140
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 05.08.12 12:11. Заголовок: Победил гада ! Т.к...


Победил гада !

Т.к. фомулы условного форматирования отрабатывают тока при визуализации Excel, то в момент заполнения Excel-отчета насильственно рассчитывал их из через Evaluate() и в зависимости от результата клеил комент к ячейке.

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




Пост N: 329
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 09.08.12 06:57. Заголовок: fil пишет: Победил ..


fil пишет:

 цитата:
Победил гада !

Победу в студию плиз :) (хотя бы в простейшем примере) А то вдруг пригодится?

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



Пост N: 141
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 09.08.12 09:22. Заголовок: Так рассказал же, вр..


Так рассказал же, вроде, все ?!

1. Требовалось брать инфу из исходных Excel файлов и заливать ее в некий Excel файл-шаблон
2. В шаблоне присутствуют как обычные формулы, так и формулы условного форматирования (ФУМ), красящие ячейки в разные цвета
3. ФУМ отрабатывают тока при визуализации Excel, а мне требовалось отловить событие выполнения этих ФУМ при заполнении шаблона
4. Узнать это моно так
a) получить ФУМ - ..cells(x, y):FormatConditions(nn):Formula1
б) выполнить ФУМ методом - ..oExc:Evaluate(ФУМ), чтобы оценить возвращаемое значение


Пример писать неохота


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




Пост N: 331
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 10.08.12 07:33. Заголовок: Более-менее понятно...


Более-менее понятно. Спасибо, fil , за разгадку "еще одной тайны Harbour-вселенной" :)

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




Пост N: 2582
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.12.12 15:57. Заголовок: Как правильно ? oShe..


Как правильно ?
oSheet := oExcel:ActiveSheet()
или так
oSheet := oExcel:ActiveSheet

У меня задача работает нормально а у клиента с таким же EXCEL виснет

Код примерно такой. Виснет судя по всему в цикле (временно включил oExcel:Visible)

 
oWorkBook := oExcel:WorkBooks:Add()
oSheet := oExcel:ActiveSheet()
oSheet:Cells:Font:Name := "Arial Cyr"
oSheet:Cells:Font:Size := 10
oSheet:Cells( 1, 1 ):Value :=Hb_oemtoansi("Код")
oSheet:Cells( 1, 2 ):Value :=Hb_oemtoansi("Наименование")
oSheet:Cells( 1, 3 ):Value :=Hb_oemtoansi("Цена")
oSheet:Cells( 1, 4 ):Value :=Hb_oemtoansi("Ед.изм")
oSheet:Cells( 1, 5 ):Value :=Hb_oemtoansi("Группа")
oSheet:Cells( 1, 6 ):Value :=Hb_oemtoansi("Фирма")
oSheet:Cells( 1, 7 ):Value :=Hb_oemtoansi("Примечание")

oSheet:Range(osheet:cells(1,1),osheet:cells(1,7)):HorizontalAlignment := xlCenter //центр
oSheet:Range(osheet:cells(1,1),osheet:cells(1,7)):Font:Bold := .T.
oSheet:Range(osheet:cells(1,1),osheet:cells(1,7)):BorderAround( xlContinuous, xlThin)

for i=1 to len(mmas)
oSheet:Cells( j, 1 ):Value :=mmas[1]
oSheet:Cells( j, 1 ):HorizontalAlignment := xlLeft
oSheet:Cells( j, 2 ):Value :=mmas[2]
oSheet:Cells( j, 2 ):HorizontalAlignment := xlLeft

oSheet:Cells( j, 3 ):NumberFormat:="0.00"
oSheet:Cells( j, 3 ):Value :=mmas[4]
oSheet:Cells( j, 3 ):HorizontalAlignment := xlRight

oSheet:Cells( j, 4 ):Value :=mmas[3]
oSheet:Cells( j, 4 ):HorizontalAlignment := xlCenter

oSheet:Cells( j, 5 ):Value :=mmas[5]
oSheet:Cells( j, 5 ):HorizontalAlignment := xlLeft
oSheet:Cells( j, 6 ):Value :=mmas[6]
oSheet:Cells( j, 6 ):HorizontalAlignment := xlLeft
oSheet:Cells( j, 7 ):Value :=mmas[7]
oSheet:Cells( j, 7 ):HorizontalAlignment := xlLeft


oSheet:Range(osheet:cells(j,1),osheet:cells(j,7)):BorderAround( xlContinuous, xlThin)
j++
next
oSheet:Columns( 1 ):AutoFit()
oSheet:Columns( 2 ):AutoFit()
oSheet:Columns( 3 ):AutoFit()
oSheet:Columns( 4 ):AutoFit()
oSheet:Columns( 5 ):AutoFit()
oSheet:Columns( 6 ):AutoFit()
oSheet:Columns( 7 ):AutoFit()



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




Пост N: 2629
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.12.12 16:14. Заголовок: Я использую oExcel:A..


Я использую oExcel:ActiveSheet, но кажется разницы нет никакой.
Подвисание лучше все-таки локализовать, выдавать на экран окно состояния: заполнение заголовка, номер строки массива, выравнивание столбцов.
Возможно, что-то делает сам эксель: выполняет какие-то макросы, проверяет орфографию, и при этом подвисает.
В коде программы ведь самые простые команды.

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




Пост N: 2584
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.12.12 16:28. Заголовок: Dima пишет: oSheet:..


Dima пишет:

 цитата:
oSheet:Cells( j, 3 ):NumberFormat:="0.00"


Выяснил , падает тут , ненравится ему NumberFormat:="0.00"
хммм

Error WINOLE 1006 Argument Error _NumberFormat

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




Пост N: 2585
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.12.12 16:39. Заголовок: Фсе разобрался В ре..


Фсе разобрался

В региональных настройках Винды в качестве разделителя целой и дробной части стояла запятая а у меня заявлена точка.

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




Пост N: 3141
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.05.13 13:22. Заголовок: Порча какая то в Har..


Порча какая то в Harbour 3.2 , в 2.0 было нормально.
В итоговом документе Excel русский текст выглядит как китайский.

Исходник

 
proc main
local oSheet
local oWorkBook

private oExcel


if Start_Excel()
oExcel:Visible := .f.
oExcel:DisplayAlerts:=.f.
oWorkBook := oExcel:WorkBooks:Add()
oSheet := oExcel:ActiveSheet()

oSheet:Cells:Font:Name := "Arial Cyr"
oSheet:Cells:Font:Size := 10
oSheet:Cells( 1, 1 ):Value :=Hb_oemtoansi("Код")
oSheet:Cells( 1, 2 ):Value :=Hb_oemtoansi("Наименование")
oSheet:Cells( 1, 3 ):Value :=Hb_oemtoansi("Цена")
oSheet:Cells( 1, 4 ):Value :=Hb_oemtoansi("Ед.изм")
oSheet:Cells( 1, 5 ):Value :=Hb_oemtoansi("Группа")
oSheet:Cells( 1, 6 ):Value :=Hb_oemtoansi("Фирма")
oSheet:Cells( 1, 7 ):Value :=Hb_oemtoansi("Примечание")
oWorkBook:saveas(hb_CurDrive()+":\"+CurDir()+"\price.xls")
oWorkBook:close(.f.,,.f.)
oExcel:Quit()
oWorkBook:=nil
oSheet:=nil
oExcel:=nil
endif
return
**********************
func Start_Excel()
Local Res:=.f.
#ifndef __XHARBOUR__
#xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )}
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#endif

TRY
oExcel := GetActiveObject( "Excel.Application" )
oExcel:DisplayAlerts:=.f.
Res:=.t.

CATCH
Res:=.f.
TRY
oExcel := CreateObject( "Excel.Application" )
Res:=.t.
CATCH
Res:=.f.
END
END
Return Res



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




Пост N: 3142
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.05.13 13:37. Заголовок: Разобрался. Пришлось..


Разобрался.
Пришлось добавить
REQUEST HB_CODEPAGE_RU1251
hb_cdpSelect( "RU1251" )

ранее и без этого нормально было.

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



Пост N: 90
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 13.05.13 15:49. Заголовок: Подскажите : Есть ..


Подскажите :
Есть строковое значение Артикул - может быть как строкой так и числом (по факту в DBF базе как символьное значение) . При записи этих артикулов - EXCELL отрезает лидирующий ноль , то есть значение '0125' запишет как '125'
Каким способом принудительно заставить EXCELL этого не делать ? Тоесть ячейка по факту должна быть ТЕКСТОВОЙ .... соотв. значения не модифицируются !
Какие ещё есть команды чтоб обойти эту дрянь ?

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




Пост N: 2873
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.05.13 15:57. Заголовок: Указать формат ячейк..


Указать формат ячейки - текстовый, или программно:

oSheet:Cells(nRow, nCol):NumberFormat := "@"

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



Пост N: 91
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 13.05.13 16:37. Заголовок: Символ собаки "@..


Символ собаки "@" - это текстовый ?
Если можно - сообщите какие ещё команды управления форматами . Мне нужнее всего текстовый и дата


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




Пост N: 2832
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.05.13 21:03. Заголовок: Softlog86 пишет: Мн..


Softlog86 пишет:

 цитата:
Мне нужнее всего текстовый


Пробел добавь впереди и будет тебе текстовый формат.

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




Пост N: 2874
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.05.13 07:47. Заголовок: Softlog86 пишет: Си..


Softlog86 пишет:

 цитата:
Символ собаки "@" - это текстовый ?
Если можно - сообщите какие ещё команды управления форматами . Мне нужнее всего текстовый и дата



Да, текстовый. А насчет остальных форматов - сделайте запись макросов, и гляньте сами. У меня на работе и экселя то нет, чтобы посмотреть :)

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



Пост N: 92
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 14.05.13 12:09. Заголовок: Andrey Пробовал ! Пр..


Andrey Пробовал ! Пробел не решает сути вопроса - Эксель автоматом рубит лидирующий ноль если в строке только цифры .
Так что " 0123" всё-равно получается как "123" . Паша верно подсказал - теперь всё работает как надо !

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




Пост N: 3345
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.13 09:29. Заголовок: Вопросец назрел. Exc..


Вопросец назрел.
Excel уже открыт и в нем загружена куча документов.
Необходимо средствами Harbour создать документ Excel , заполнить его , сохранить и выйти.
Как при этом оставить открытыми ранее документы , ведь по команде oExcel:Quit() закроются все.
Как корректно это реализовать ?

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




Пост N: 82
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.08.13 10:54. Заголовок: Dima пишет: ведь по..


Dima пишет:

 цитата:
ведь по команде oExcel:Quit() закроются все



Дима, открывай 2 объекта
в примере OExcelTwo останется открыт :

oExcel := CreateObject( "Excel.Application" )
oExcelTwo := CreateObject( "Excel.Application" )

oExcel:WorkBooks:Add()
oExcelTwo:WorkBooks:Add()

oExcelTwo:Visible := .T.
oExcel:Visible := .T.

oExcel:Quit()


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




Пост N: 3346
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.13 11:19. Заголовок: Haz Да точно это я ..


Haz
Да точно это я тормознул что то.
Сенкс.

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




Пост N: 3347
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.13 11:25. Заголовок: Хотя........ Я делал..


Хотя........
Я делал вот так
 
proc main
private oExcel
if Start_Excel()
oExcel:WorkBooks:Add()

oExcel:Visible := .t.

oExcel:Quit()
endif

return
**************

func Start_Excel()
Local Res:=.f.
#ifndef __XHARBOUR__
#xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )}
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#endif

TRY
oExcel := GetActiveObject( "Excel.Application" )
oExcel:DisplayAlerts:=.f.
Res:=.t.

CATCH
Res:=.f.
TRY
oExcel := CreateObject( "Excel.Application" )
Res:=.t.
CATCH
Res:=.f.
END
END
Return Res



В этом случае закрывается все в Excel
Понял в чем дело.....надо переделать слегка Start_Excel() что бы понять делать ли при выходе
из проги oExcel:Quit()

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




Пост N: 83
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.08.13 16:00. Заголовок: я делаю примерно так..


я делаю примерно так же но через ссылку

типа того:

Func Main()
local oExcel


StartExcel( @oExcel )

IF Valtype(oExcel) == "O"
....
ELSE
...
END

RETURN NIL

В общем смысл в том что в стартексель передаем ссылку на любую переменную, и она становится объектом ексель и какой объект закрывать вопросов не вызывает )





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




Пост N: 3349
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.13 16:07. Заголовок: Haz Это понятно. А ..


Haz
Это понятно. А мой косяк был в том что использовал уже существующий объект EXCEL , поэтому по oExcel:Quit() все и закрывалось

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





Пост N: 298
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 22:57. Заголовок: Дабы не плодить новы..


Дабы не плодить новых тем, спрошу здесь. Название темы подходящее.

Программа на Harbour формирует отчет в формате XLS методом OLE. Отчет сформирован, сохранен в локальной папке, осталось его открыть. Раньше не парился, делал RUN("excel /e "+cXlsName) и все дела. Все неплохо, но если путь к Excel на машине не прописан - разумеется облом. Нужно либо прописывать путь, либо кидать батник excel.bat, содержащий строку запуска в папку с программой. Захотелось сделать все красиво и элегантно, (как сам Harbour:) ). Пробовал:

1) Создание Excel-объекта с открытием нужного файла - проблема оказалась в том, что после отработки последней строки типа oExcel.WindowState := Maximized управление передается назад программе. А она должна удалить xls файл и локальной папки. Соотв. пока Excel не "отпустит" файл - ничего не выходит.

2) Делал RUN("start /w "+xlsName) - облом на длинных именах, даже помещенных в двойные кавычки. Удивлен.

3) Пока остановился на RUN('cmd /c "'+cXlsName+'"') - и длинные имена понимает и путь к самому Excel прописывать не требуется.

Но вот какой вопрос возник: если юзер УЖЕ РАБОТАЕТ с Excel (например, с другим документом) и из Harbour-программы вызывает этот отчет - он формируется, открывается и... сразу управление возвращается программе. Та пытается удалить временный файл с отчетом - разумеется облом, тк он еще открыт.

Какие могут быть варианты? Пытаться зациклить программу "по кругу", пока файл можно будет удалить - мне кажется не совсем "правильным" способом. К тому-же так вышло, что создание и удаление временных файлов сосредоточено в одном месте, а вызов и обработка формата Excel - в другом. Если Excel-модуль будет пытаться удалить файл, то придется в вызывающем коде тоже городить огород. Кроме этого, есть часть отчетов, которые не должны быть удалены. Модуль формирования Excel отчетов об этом не в курсе.

Подскажите плиз элегантное решение.

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



Пост N: 43
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 21.09.13 07:51. Заголовок: Список на удаление - очередь


Можно создать "очередь" - список файлов, заявленных на удаление.
Добавление в список - в одном месте кода,
удаление файлов по списку можно позже и в любом другом месте кода.
В рамках одного экземпляра программы - для очереди можно взять массив, для разных - таблицу.

При попытке удаления одного файла - нужно проверить возможность этого:
файл есть и можно открыть (и закрыть) файл XLS монопольно - fopen(f_name,FO_EXCLUSIVE)

Для открытия XLS файлов
__RUN("start "+f_name)

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





Пост N: 299
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.09.13 11:56. Заголовок: Да, про FOPEN() как-..


Да, про FOPEN() как-то не подумал - СПАСИБО! Нужно будет сделать. А то уж шальные мысли в голову лезли - пытаться переименовать...

По поводу "start" - только у меня эта команда тупо игнорирует длинные имена файлов? Вместо запуска Экселя на 'start "d:\dir\some long name file.xls"' открывает консольное окно (Microsoft Corporation...) и ждет команд...

А по запуску Excel - запустить, когда вернется управление - лучшего решения, чем зациклить пока не получится открыть монопольно, нет ?



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



Пост N: 121
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 21.09.13 12:26. Заголовок: Ну если это Harbour,..


Ну если это Harbour, открыть и показать пользователю через
OLE ( CreateObject("Excel.Application") ) и проверять например, получая какую-нибудь
ячейку. Если это не объект, идти дальше работать

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



Пост N: 44
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 21.09.13 12:36. Заголовок: Все не так


Фишка в том, что запуск __RUN("start "+xls)
открывает окно EXcel, но Harbour-программа не ждет закрытия окна Excel,
оно живет независимо и отдельно (похоже, так устроен вызов Win Gui приложений)
а программа пилит дальше.
Можно, если надо, определить через какой-то момент - запустился Excel или нет.
Поэтому - не нужно сразу удалять файл и не нужно ничего ждать в цикле.

пример - открывается 5 окон XLS
Скрытый текст


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



Пост N: 122
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 21.09.13 14:52. Заголовок: Но ведь Sergy писал ..


Но ведь Sergy писал


 цитата:
Но вот какой вопрос возник: если юзер УЖЕ РАБОТАЕТ с Excel (например, с другим документом) и из Harbour-программы вызывает этот отчет - он формируется, открывается и... сразу управление возвращается программе. Та пытается удалить временный файл с отчетом - разумеется облом, тк он еще открыт.



т.е. по идее ему нужно стоять и ждать, пока не закончится EXCEL.
А вообще-то пусть уже он решает, наше дело предложить решение



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


Пост N: 939
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 21.09.13 14:58. Заголовок: Можно очищать папку ..


Можно очищать папку с временными файлами при старте программы. В этот момент все они обычно уже не нужны. Но, если какой-то будет отрыт другим приложением, - ничего страшного, пусть остается. Удалится в следующий раз. Вот, к примеру, во временной папке пользователя в винде таких "нужных" файлов иногда десятки тысяч. И ничего, работает... )))

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




Пост N: 3583
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.09.13 15:08. Заголовок: PSP пишет: Можно оч..


PSP пишет:

 цитата:
Можно очищать папку с временными файлами при старте программы


То же так делаю

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





Пост N: 300
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.09.13 17:37. Заголовок: nick_mi пишет: т.е...


nick_mi пишет:

 цитата:
т.е. по идее ему нужно стоять и ждать, пока не закончится EXCEL.



Вопрос возникает, только если Excel был запущен раньше, чем сформирован отчет: управление сразу возвращается в программу.

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





Пост N: 301
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.09.13 18:00. Заголовок: PSP пишет: Можно оч..


PSP пишет:

 цитата:
Можно очищать папку с временными файлами при старте программы. В этот момент все они обычно уже не нужны. Но, если какой-то будет отрыт другим приложением, - ничего страшного, пусть остается. Удалится в следующий раз. Вот, к примеру, во временной папке пользователя в винде таких "нужных" файлов иногда десятки тысяч. И ничего, работает... )))


Согласен. Сам так делаю. Но захотелось красивого решения.

Пока остановился на вызове через OLE с немедленной передачей управления назад. Это чтобы не гадать вернется/не вернется. А после возврата программа в цикле с интервалом в полсекунды пытается открыть файл в режиме FO_EXCLUSIVE. Как только открылся - значит работа с файлом завершена, а закрыл юзер Excel или продолжает в нем работать с другим документом - дело десятое...

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



Пост N: 123
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 21.09.13 18:05. Заголовок: Но ведь нужен вариан..


Но ведь нужен вариант который будет работать правильно во всех случаях.
Можно, конечно проверить, как показано у Dima
oExcel := GetActiveObject( "Excel.Application" ) и в зависимости от этого выпускать
или Run ()
или oExcel := CreateObject( "Excel.Application" ) и выполнять
проверку, так как я писал выше правда, в этом случае тоже цикл, но только
не FOPEN (cFile,FO_EXCLUSIVE) а на наличие объекта.Пока объект существует,
программа будет ждать, независимо от того, запущен ранее EXCEL или запущен из вашей програмы


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





Пост N: 302
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.09.13 18:09. Заголовок: nick_mi пишет: Пока..


nick_mi пишет:

 цитата:
Пока объект существует,
программа будет ждать, независимо от того, запущен ранее EXCEL или запущен из вашей програмы


Хм. звучит логично. Ну вот допустим, Excel не был запущен. Юзер сформировал отчет, мы создали CreateObject("Excel.Application") и ждем, пока он не исчезнет.

Но юзер решил в Экселе с сформированным отчетом открыть еще один документ: например, ему туда нужно вставить данные из только что сформированного отчета. Получается, пока он не закроет все документы и не выйдет из Excel, работать с программой он не сможет? А если ему нужно сформировать другой отчет ?

 цитата:
Но ведь нужен вариант который будет работать правильно во всех случаях.


Да и потом, не очень понятно, какая разница, чего ожидать в цикле - исчезновения объекта или возможности открыть файл в FO_EXCLUSIVE режиме ?

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



Пост N: 124
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 21.09.13 18:27. Заголовок: 1) Пока пользователь..


1) Пока пользователь не закроет документ в EXCEL, программа будет ждать, если документ закрыт
независимо от того работает EXCEL дальше с другим документом, или полностью из него вышли
программа продолжит свою работу .

2) Разница собственно только в обращению к диску, или проверка объекта в памяти.
Решать вам

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



Пост N: 10
Зарегистрирован: 21.02.13
ссылка на сообщение  Отправлено: 04.10.13 00:55. Заголовок: проблема с сохранением файла


есть такой код - сохраняет сформированную новую книгу в файл
предварительно сформировав имя файла и удалив старый файл
	// сохранить 
cFile:=wReport01.txt_Folder.Value
if RIGHT(cFile, 1)#"\"
cFile:=cFile+"\"
endif
cFile:=cFile+str(wReport01.Spinner_Year.Value,4)+ STRZERO(wReport01.COMBOBOX_MONTH.Value,2)+ ' '+aPDocs[1,5]+'.xls'
if file(cFile)
FILEDELETE(cFile) //--> lDeleted
endif
oBook:SaveAs(cFile)
//oBook:SaveAs(cFile, xlExcel9795) <==== в Excell Office 2007 - падает

проблема в команде сохранения (я отлаживаюсь на Excel 2003).
1. Если не задаю в cFile расширение '.xls' -- Excel действует хитрым образом.
Если в cFile нет точек - то сам приписывает к имени файла '.xls'
Если точки есть - то не приписывает.
Например сохраненые файлы "C:\public\201308 Рахимов А.П" и "C:\public\201308 Склад.xls"
Но первый файл совпадает с cFile и поэтому находится и удаляется.
А второй - не совпадает и поэтому Excel начинает задавать вопросы - что не есть хорошо.
Да и файл без расширения - очень не хорошо.
обязательно приписываю +'.xls'

2.
В Excel 2003 - сохраняет и открывает без вопросов.
В Excel 2007 - сохраняет без вопросов. А при открытии пишет что формат файла не соответствует расширеню.
И действительно - сохраняет в формате .xlsx = (упакованый набор xml-лек) но с расширением xls естесственно.

Попробовал задать формат сохранения так oBook:SaveAs(cFile, xlExcel9795)
в Excell Office 2007 - падает

Посоветуйте
либо как правильно задать формат сохранения (что предпочтительно для совместимости со старыми версиями Excel)
либо как получить от Экселя расширение файла по умолчанию чтобы подставить в имя файла.
либо какой нибудь третий способ решения проблемы



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



Пост N: 125
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 04.10.13 08:05. Заголовок: Может отлючить вывод..


Может отлючить вывод предупреждений в EXCEL? На форуме где-то было, как это сделать.
Касалось, по моему, записи, но может и на открытии прокатит.

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




Пост N: 102
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.10.13 09:30. Заголовок: oExcelTpl:SET( &#..


попробуйте действительно отключить предупреждения

oExcelTpl:SET( "DisplayAlerts", .F. )
...
...
...
oExcelTpl:SET( "DisplayAlerts", .T. )

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



Пост N: 11
Зарегистрирован: 21.02.13
ссылка на сообщение  Отправлено: 07.10.13 06:43. Заголовок: Haz пишет: попробу..


Haz пишет:

 цитата:

попробуйте действительно отключить предупреждения


В своей программе я могу отключить. А как отключить у пользователя когда он будет открывать файл в своей Экселке?


Мое решение такое
 
#define xlExcel9795 43
#define xlExcel8 56
.....
if val(oExcel:get("Version"))<12
oBook:SaveAs(cFile, xlExcel9795)
else
oBook:SaveAs(cFile, xlExcel8)
endif
....

Файлы созданные в Excel2007 и в Excell2013 без вопросов открываются в Excel2003.
потому что
56 = xlExcel8 (Excel 97 through Excel 2003 formatted files used in Excel 2007, .xls)

А xlExcel9795 нужен потому что Excel 2003 не знает о будущем коде формата 56 = xlExcel8


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




Пост N: 3616
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.13 14:35. Заголовок: Покажите на примере ..


Покажите на примере плиз как сделать автосумму в определенной ячейке.
Скажем в первой колонке заполнены числами 1 и 2 ячейки а в 3-й нужно сделать автосумму.
Макрос смотрел и синтаксиса не понял.
Спасибо.

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




Пост N: 3618
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.13 16:17. Заголовок: вопрос по разделител..


вопрос по разделителям разрядов
в макросе EXCEL тупо пишет NumberFormat:="#,##0" попробовал в Harbour получилось как то криво
и даже перед 0.00 он рисует ,0.00
Переделал так NumberFormat:="# ##0"+GET_SDECIMAL()+"00" , работает нормально но у меня EXCEL 2003
и не факт что такой код сработает на более свежем EXCEL
Вопрос: откуда EXCEL берет этот знак , и корректно ли если я его заменяю на пробел ?

PS
Как считать разделитель групп разрядов ?
Для считывания разделителя дробной и целой части использую
 
#pragma BEGINDUMP

#include "hbapi.h"
#include "windows.h"

HB_FUNC( GET_SDECIMAL )
{
char sDec[2];

GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_SDECIMAL,
(LPTSTR) sDec, 2 );
hb_retclen( sDec, 1 );
}

#pragma ENDDUMP



Dima пишет:

 цитата:
Как считать разделитель групп разрядов ?


Проехали , заюзал LOCALE_STHOUSAND

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





Пост N: 328
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.10.13 17:17. Заголовок: Dima пишет: Покажи..


Dima пишет:

 цитата:

Покажите на примере плиз как сделать автосумму в определенной ячейке.
Скажем в первой колонке заполнены числами 1 и 2 ячейки а в 3-й нужно сделать автосумму.
Макрос смотрел и синтаксиса не понял.


Не очень понятна суть вопроса...
Что мешает записать в ячейку содержимое "=RC[-2] + RC[-1]" ? Получится автосумма двух ячеек слева.

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




Пост N: 105
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.10.13 09:09. Заголовок: автосумма


или так

oExcel:ActiveCell:FormulaR1C1 := "=СУММ(R[-" + NTOC(nStart) + "]C:R[-1]C)

сумма колонки со строки nStart по активную строку -1

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




Пост N: 3631
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.10.13 15:03. Заголовок: EXCEL 2003 у меня и ..


EXCEL 2003 у меня и у клиента.
В ячейку цифры я пишу так .........:NumberFormat:="# ##0"+GET_SDECIMAL()+"00"
Он строит у себя отчет и в сформированной таблице видит (для примера одна ячейка)
0,91 наводит на нее курсор и вверху видит 90.65
Когда я у себя строю тот же отчет то в этой же ячейке сразу вижу 90.65
У него разделитель дробной и целой части запятая у меня точка. Почему так по разному
EXCEL выводит данные ? По идее у него в ячейке должно отобразится 90,65

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





Пост N: 350
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.10.13 16:04. Заголовок: Dima пишет: EXCEL 2..


Dima пишет:

 цитата:
EXCEL 2003 у меня и у клиента.
В ячейку цифры я пишу так .........:NumberFormat:="# ##0"+GET_SDECIMAL()+"00"
Он строит у себя отчет и в сформированной таблице видит (для примера одна ячейка)
0,91 наводит на нее курсор и вверху видит 90.65
Когда я у себя строю тот же отчет то в этой же ячейке сразу вижу 90.65
У него разделитель дробной и целой части запятая у меня точка. Почему так по разному
EXCEL выводит данные ? По идее у него в ячейке должно отобразится 90,65


Не очень понятно, о чем речь.
NumberFormat - это маска форматирования значения, хранящегося в ячейке. Формат сам по себе - но какое значение туда пишете, что вместо 90,65 получается 0,91 ?
"Хорошо-бы увидеть самодостаточный пример" (с)... :)

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




Пост N: 3633
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.10.13 16:16. Заголовок: Sergy пишет: "Х..


Sergy пишет:

 цитата:
"Хорошо-бы увидеть самодостаточный пример" (с)... :)


Кусочек кода ;)
 
oSheet:Cells( jj, i+1 ):NumberFormat:="# ##0"+GET_SDECIMAL()+"00"
oSheet:Cells( jj, i+1 ):Value :=vtv // число
oSheet:Range(osheet:cells(jj,i+1),osheet:cells(jj,i+1)):BorderAround( xlContinuous, xlThin)
oSheet:Columns(i+1 ):AutoFit()


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




Пост N: 3634
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.10.13 22:47. Заголовок: Проехали , решил воп..


Проехали , решил вопрос.

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





Пост N: 351
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.10.13 23:55. Заголовок: Dima пишет: Проехал..


Dima пишет:

 цитата:
Проехали , решил вопрос.


Чтобы не наступить на такие-же грабли - в чем оказалась проблема ?


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




Пост N: 3636
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.10.13 09:08. Заголовок: Sergy Он сделал в E..


Sergy
Он сделал в EXCEL и винде такие же региональные настройки как у меня в плане разделителей ;)

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



Пост N: 124
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 18.02.14 12:11. Заголовок: Помогите решить : Н..


Помогите решить :
Нужно создать несколько файлов EXCELL(таблиц) для дальнейшей рассылки (прайс-листы) . Хочу одновременно создавать несколько листов ( для разных клиентов) в одной книге , а затем эти листы поочередно сохранять в соответствующие файлы . До сего дня подготавливал последовательно ( вызов EXCELL , создание книги , заполнение данными , сохранение книги , закрываем EXCELL ). Но для подготовки большого числа документов я решил делать одновременно :

1) Вызов EXCELL
2) Создание книги
3) Создание Лист 1 , Лист 2 ..... Лиcт N
4) В цикле заполняем листы информацией
5) СОхраняем каждый лист в отдельный файл
Закрываем EXCELL

Знаний команд не хватает КАК :
ДОБАВИТЬ ЛИСТ ?
ПЕРЕКЛЮЧИТЬСЯ НА ЛИСТ ?
СОХРАНИТЬ ТОЛЬКО НУЖНЫЙ ЛИСТ ?

Поможете ?










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




Пост N: 3117
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.02.14 12:28. Заголовок: Хоть у объекта works..


Хоть у объекта worksheet и есть метод SaveAs, я не знаю, как он работает. Обычно сохраняется вся книга, а не отдельный лист. Во всяком случае, надо попробовать, как сработает SaveAs для отдельного листа.

А насчет добавления-переключения листов:

oSheets := oBook:Sheets

Выбор листа по номеру:
oSheet1 := oSheets:Item(1)
oSheet2 := oSheets:Item(2)
Переключение:
oSheet2:Select()
Хотя можно явно не переключаться на лист, а применять методы непосредственно к интересующему листу (oSheet2)

Добавление листа (из справки):

oSheets:Add(<Before>, <After>, <Count>, <Type>)

Before Optional Variant. An object that specifies the sheet before which the new sheet is added.

After Optional Variant. An object that specifies the sheet after which the new sheet is added.

Count Optional Variant. The number of sheets to be added. The default value is one.

Type Optional Variant. Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. If you are inserting a sheet based on an existing template, specify the path to the template. The default value is xlWorksheet.



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




Пост N: 3836
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.02.14 14:45. Заголовок: Softlog86 пишет: Но..


Softlog86 пишет:

 цитата:
Но для подготовки большого числа документов я решил делать одновременно :


Одновременно все равно не получится да и будет ли такой способ быстрее , не факт.
Вот ежели на каждого клиента да в отдельном потоке создавать прайс , тогда другое дело.
Но к сожалению мне не удалось запустить EXCEL в отдельном потоке , вероятно он
работает только в ST режиме.

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




Пост N: 3840
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.14 15:46. Заголовок: Помогите с рамкой р..


Помогите с рамкой разобраться.
Обычную сетку(плюс слитие ячеек) делаю так
 
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):MergeCells:=.t.
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):BorderAround( xlContinuous, xlThin)


Нужно что бы плюс к этому нижняя часть рамки была утолщенной.
Макросы смотрел и не очень въехал


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



Пост N: 26
Зарегистрирован: 22.03.06
ссылка на сообщение  Отправлено: 24.02.14 16:45. Заголовок: Dima пишет: Нужно ч..


Dima пишет:

 цитата:
Нужно что бы плюс к этому нижняя часть рамки была утолщенной.



так не пробовал?
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle( xlContinuous)
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight( xlMedium)

константы
These define the style of the border
xlNone = -4142; Note this is the same as xlLineStyleNone
xlContinuous = 1;
xlDash = -4115;
xlDashDot = 4;
xlDashDotDot = 5;
xlDot = -4118;
xlDouble = -4119;
xlSlantDashDot = 13;

These define the weight of the border
xlHairLine = 1;
xlMedium = -4138;
xlThick = 4;
xlThin = 2;

Thise is handy to make borders have the default color index
xlAutomatic = -4105;

These define the placement of border pieces
xlDiagonalDown = 5;
xlDiagonalUp = 6;
xlEdgeLeft = 7;
xlEdgeTop = 8;
xlEdgeBottom = 9;
xlEdgeRight = 10;
xlInsideVertical = 11;
xlInsideHorizontal = 12;

ps
проверить сейчас не могу.
взял с рабочего софта, но на другом языке


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




Пост N: 3119
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:49. Заголовок: Я устанавливаю грани..


Я устанавливаю границы по другому:

oBorder := oCell:Borders(<nNSEW>)

где параметр - одно из значений :
xlEdgeBottom
xlEdgeLeft
xlEdgeRight
xlEdgeTop

и затем:

oBorder:LineStyle := xlContinuous
oBorder:Weight := xlThin

стиль границы конечно можно указать другой

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




Пост N: 3841
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:52. Заголовок: kia пишет: так не п..


kia пишет:

 цитата:
так не пробовал?
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle( xlContinuous)
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight( xlMedium)



Cпасибо , заработало вот так
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle:=xlContinuous
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight:=xlMedium


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




Пост N: 3842
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:59. Заголовок: Pasha Идею понял. Т..


Pasha
Идею понял. Тоже подойдет. Спасибо !

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




Пост N: 4124
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 14:04. Заголовок: что еще может работа..


что еще может работать в Harbour c EXCEL кроме OLE ?
Оля медленно работает.

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



Пост N: 237
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 18:41. Заголовок: ADO видимо А в чем..


ADO видимо

А в чем тормоз ?

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




Пост N: 4125
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 21:14. Заголовок: fil пишет: А в чем ..


fil пишет:

 цитата:
А в чем тормоз ?


Ну это моё наблюдение на чисто выпуклый морской глаз.
Заполняю EXCEL форму 100 строк 10 колонок в цикле построчно.
Если заполнять DBF базу такую же ,то это происходит раз в 5 быстрее если не больше.
Реально в своей задаче я делаю выборку во временную DBF базу и затем на основании
её заполняю EXCEL форму и хорошо видно что ОЛЯ работает медленнее.
В общем то на форуме где то уже писали ОЛЯ медленный механизм.
С ADO не работал. Он умеет с EXCEL работать ?

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



Пост N: 238
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 21:56. Заголовок: А ты, небось, каждую..


А ты, небось, каждую ячейку строки отдельно заполняешь ?

ADO умеет с EXCEL работать ?

Вроде как, у Линареса посмотри

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




Пост N: 4126
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 23:04. Заголовок: fil пишет: А ты, не..


fil пишет:

 цитата:
А ты, небось, каждую ячейку строки отдельно заполняешь ?


Ну типа да ;) А что не так ?

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



Пост N: 239
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 23:37. Заголовок: Вот поэтому и медлен..


Вот поэтому и медленно. Надо типа так

for st=1 to 100
oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st]
next

и будет шустро


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




Пост N: 267
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.08.14 11:12. Заголовок: fil пишет: ADO умее..



 цитата:
ADO умеет с EXCEL работать ?



Дима, привет.
Лови пример ADO

Function Read_XLS
Local cFile := 'TEST.XLS'

oConection = todbc():new("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq="+ cFile + ";DefaultDir="+GetCurrentFolder()+";")
oConection:Setsql("SELECT * FROM [ЛИСТ1$]")

if !oConection:Open()
? " Error connection "
return
endif

for n := 1 to len(oConexion:aRecordSet)
for j := 1 to len(oConection:aRecordSet[n])
do case
case valtype(oConection:aRecordSet[n][j]) == "C"
? alltrim(oConection:aRecordSet[n][j])
case valtype(oConection:aRecordSet[n][j]) == "N"
? alltrim(str(oConection:aRecordSet[n][j]))
case valtype(oConection:aRecordSet[n][j]) == "D"
? alltrim(DtoC(oConection:aRecordSet[n][j]))
case valtype(oConection:aRecordSet[n][j]) == "L"
? alltrim(oConection:aRecordSet[n][j])
end case
next
next

oConection:Close()
oConection:Destroy()
Return


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




Пост N: 4127
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.08.14 13:13. Заголовок: Haz Спасибо. Думаеш..


Haz
Спасибо. Думаешь он быстрее будет ?
А в нем доступны вещи типа : назначить шрифт , изменить его размер , залить фон ячейки цветом , рамочки построить и т д
и тп то что доступно через Олю ?


fil пишет:

 цитата:
for st=1 to 100
oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st]
next


То есть ты заполняешь ячейки построчно с колонки А по J. А что ж тогда лежит
в элементе массива ? Ведь каждую ячейку нужно заполнить своим значением.

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



Пост N: 240
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 02.08.14 16:32. Заголовок: Каждый элемент масси..


Каждый элемент массива это инфа для ячейки
{ {1,2,3,..10}
{11,12,13...20}}

чего тут неясного ?

Если в форме много формул, желательно сначала отключить автоматический расчет (application.clculation), а потом включить и пересчитать

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




Пост N: 4128
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.08.14 17:14. Заголовок: fil Прикольно , не ..


fil
Прикольно , не знал что так можно делать.
Проверил , работает.
Сенкс !

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




Пост N: 268
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.08.14 19:15. Заголовок: Dima пишет: и тп то..


Dima пишет:

 цитата:
и тп то что доступно через Олю


нет , только данные , лучший вариант предложил fil, а я просто внес альтернативу как пример

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




Пост N: 4129
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.14 10:44. Заголовок: Haz пишет: лучший в..


Haz пишет:

 цитата:
лучший вариант предложил fil


Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.

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




Пост N: 3526
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.08.14 13:56. Заголовок: Dima пишет: Да сдел..


Dima пишет:

 цитата:
Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.



А посмотреть на сам тест и пример можно ?

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




Пост N: 4130
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.14 14:01. Заголовок: Andrey Да конечно. ..


Andrey
Да конечно.

 
Proc main
local oExcel
local oWorkBook
local oSheet
local secs:=0
local i

oExcel := CreateObject( "Excel.Application" )
IF Valtype(oExcel) == "O"
oExcel:Visible := .f.
oExcel:DisplayAlerts:=.f.
oWorkBook := oExcel:WorkBooks:Add()
oSheet := oExcel:ActiveSheet()
oSheet:Cells:Font:Name := "Arial Cyr"
oSheet:Cells:Font:Size := 12
oExcel:ActiveWindow:DisplayZeros:=.F.


secs:=seconds()
for i=1 to 1000
oSheet:Cells( i, 1 ):Value:=1
oSheet:Cells( i, 2 ):Value:=date()
oSheet:Cells( i, 3 ):Value:=time()
oSheet:Cells( i, 4 ):Value:="TEST"
oSheet:Cells( i, 5 ):Value:=1000
oSheet:Cells( i, 6 ):Value:=112345.123
oSheet:Cells( i, 7 ):Value:=dtos(date())
oSheet:Cells( i, 8 ):Value:=2
oSheet:Cells( i, 9 ):Value:=3
oSheet:Cells( i, 10 ):Value:=4
next
? seconds()-secs

secs:=seconds()
for i=1001 to 2000
oSheet:Range(osheet:cells(i,1),osheet:cells(i,10)):Value:={1,date(),;
time(),"TEST1",1000,112345.123,dtos(date()),2,3,4}
next
? seconds()-secs


wait
oExcel:Visible := .t.
ENDIF
return



PS
У меня при 1000 строках и 10 столбцах быстрее в 5 раз.
100 строк и 10 столбцов в 7 раз

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




Пост N: 3527
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.08.14 21:27. Заголовок: Dima пишет: Да коне..


Dima пишет:

 цитата:
Да конечно.


Спасибо БОЛЬШОЕ !

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




Пост N: 4146
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.08.14 15:35. Заголовок: WVT программа. Задач..


WVT программа.
Задача установить что открыт нужный лист EXCEL.
Такую проверку я сделал но почему то после проверки оказываюсь в EXCEL (оно как бы понятно почему).
а надо бы вернуться в программу. Как это правильно сделать ?
Делаю примерно так

 
do while .t.

if Start_EXCEL()
IF Valtype(oExcel) == "O"
oExcel:Visible := .f.
oExcel:DisplayAlerts:=.f.
oSheet := oExcel:ActiveSheet()
if oSheet:UsedRange:Columns:Count#15
oExcel:Visible := .t.
soob("Открыта не та книга........","r/r","gr+/r")
exit
endif



oExcel:Visible := .t.
ELSE
soob("Объект не найден.........","r/r","gr+/r")
exit
ENDIF
endif

exit
enddo


Решил пробнуть hwnd:=hb_gtInfo(HB_GTI_GETWIN) а затем Hb_gtInfo( HB_GTI_SETWIN, hwnd) ,
но hb_gtInfo(HB_GTI_GETWIN) совсем ни чего не возвращает.

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



Пост N: 241
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 08.08.14 22:30. Заголовок: Правильно ли я понял..


Правильно ли я понял, что нужно типа листнера состояния Excel ? Тогда можно сидеть на окне и по таймеру опрашиваать

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




Пост N: 4147
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.08.14 23:16. Заголовок: fil Нужно: опросил ..


fil
Нужно: опросил состояние EXCEL и остался в окне своей проги.

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



Пост N: 242
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 08.08.14 23:24. Заголовок: ну так в чем проблем..


ну так в чем проблема сделать это по таймеру ?

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




Пост N: 275
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.08.14 08:11. Заголовок: Dima пишет: опросил..


Dima пишет:

 цитата:
опросил состояние EXCEL и остался в окне



Дима, а :Visible := .T. зачем если не та книга ?
Как еще вариант - из цикла вызывать проверку отдельным потоком , который всегда можно прибить в случае ненадобности

PS. Протестировал выгрузку в Excel через ADODB - результат устроил полностью 10 000 строк выгружается 5 сек

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




Пост N: 4148
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.08.14 14:15. Заголовок: Разобрался. Просто н..


Разобрался. Просто не нужно юзать oExcel:Visible.

Странная штука.
Если ячейки я могу заполнить вот так

oSheet:Range(osheet:cells(1,1),osheet:cells(1,5)):Value:={1,2,3,4,5}

А если сделать обратную операцию и считать значения в массив

amas:=(oSheet:Range(osheet:cells(j,1),osheet:cells(j,15)):Value)

То массив имеет вид не {1,2,3,4,5} а {{1},{2},{3},{4},{5}}
Это нормально ?



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



Пост N: 243
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 09.08.14 15:07. Заголовок: массив имеет вид не ..



 цитата:
массив имеет вид не {1,2,3,4,5} а {{1},{2},{3},{4},{5}}



Нормально.

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




Пост N: 4149
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.08.14 16:37. Заголовок: Haz пишет: PS. Прот..


Haz пишет:

 цитата:
PS. Протестировал выгрузку в Excel через ADODB - результат устроил полностью 10 000 строк выгружается 5 сек


А где можно пример посмотреть по работе с EXCEL ? Что то не нашел.
Смотрел тут harbour\contrib\hbwin\tests\

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




Пост N: 276
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.08.14 17:05. Заголовок: Dima пишет: А где м..


Dima пишет:

 цитата:
А где можно


можно в исходниках ADORDD на core-master

но я тестил проще

#include 'adordd.ch'
Func Test()
local cFile := "TEST.XLS"
local cConnectStr := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source= ' + cFile + ';Extended Properties= "Excel 8.0;HDR=YES"'
local oConnection := TOleAuto():New( "ADODB.Connection" )
local oCommand
local i := 0

oConnection:ConnectionString := cConnectStr
oConnection:Open()
oCommand := TOleAuto():New("ADODB.Command")
oCommand:ActiveConnection := oConnection

oCommand:CommandText = "CREATE TABLE [МояТаблица] (Символьный char(255), Дата date, Целый int, Дробный float)"
oCommand:Execute()

For i := 1 TO 10000
oCommand:CommandText = "INSERT INTO [МояТаблица] (Символьный, Дата, Целый, Дробный) values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')"
oCommand:Execute()
END

return nil


PS если TEST.XLS есть - не сможет создать и выдаст ошибку

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




Пост N: 4150
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.08.14 18:12. Заголовок: Haz Спасибо !..


Haz
Спасибо !

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




Пост N: 278
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.08.14 19:20. Заголовок: Dima пишет: Спасибо..


Dima пишет:

 цитата:
Спасибо


незачто
Есть смысл в Excel гнать через ADO, а потом красоту наводить через OLE


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




Пост N: 4236
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.10.14 17:06. Заголовок: а как загнать нужные..


а как загнать нужные строки в группу ? Что то макрос мало что сказал....

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





Пост N: 427
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 30.10.14 18:37. Заголовок: Dima пишет: а как з..


Dima пишет:

 цитата:
а как загнать нужные строки в группу ? Что то макрос мало что сказал....



Речь об объединении ячеек ?

Мой макрос вот что показал:

Sub Макрос1() 
Range("D8:D10").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = True
End With
End Sub

Работает там последняя строка. Все остальные - задают параметры вновь создаваемого объединения.

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




Пост N: 4237
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.10.14 18:48. Заголовок: Sergy Да оно , спас..


Sergy
Да оно , спасибо !

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




Пост N: 4238
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.11.14 19:01. Заголовок: EXCEL 2003 В нем воо..


EXCEL 2003
В нем вообще работает заливка фона вида Interior.Color = RGB(220,220,220) ,
пробовал через макрос и похоже что не работает и цвета берутся из
ColorIndex

PS
Хотел серым цветом залить от 10 до 15 % черного и ни как.

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





Пост N: 428
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 03.11.14 16:43. Заголовок: Dima пишет: Хотел с..


Dima пишет:

 цитата:
Хотел серым цветом залить от 10 до 15 % черного и ни как.



Работает в любом Экселе, от 97 до 2010 точно:
...
Selection.Interior.ColorIndex = 15

вот тут: http://infostart.ru/public/58191/ есть другие цвета.

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




Пост N: 4239
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.11.14 16:57. Заголовок: Sergy 15 не подходи..


Sergy
15 не подходит в том и дело. нужно светлее.
а цвета я тут смотрю http://www.databison.com/excel-color-palette-and-color-index-change-using-vba/

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



Пост N: 276
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 16.02.15 18:17. Заголовок: Приветствую ! В лис..


Приветствую !

В лист Excel нужно вставить разрыв страницы - HPageBreaks. Никак не разберусь как это выглядит в Харборе ?

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




Пост N: 4499
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.02.15 18:27. Заголовок: не оно ? http://five..

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



Пост N: 277
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 16.02.15 19:04. Заголовок: Все работает :sm36:..


Все работает

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



Пост N: 278
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 16.02.15 19:11. Заголовок: Только замедление в ..


Только замедление в разы

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



Пост N: 279
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 17.02.15 11:12. Заголовок: Интересно, почему вс..


Интересно, почему вставка более чем 1 разрыва страницы жутко тормозит ?

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




Пост N: 4502
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.02.15 14:35. Заголовок: fil Процесс формиро..


fil
Процесс формирования тормозит или уже готовая таблица ?

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



Пост N: 280
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 17.02.15 15:33. Заголовок: Тормозит сам ввод ра..


Тормозит сам ввод разрыва станицы (даже попробовал вставить разрывы после созданияих документа, таже песня). Впечатление такое, что после каждой вставки запускается некая обработка

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



Пост N: 156
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 17.02.15 21:13. Заголовок: А долго это сколько?..


А долго это сколько? Я попробовал, ну чтоб для нормальной статистики, 200 разрывов- 5 секунд.
Приведите кусок кода по разрывам

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




Пост N: 4505
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.02.15 21:26. Заголовок: nick_mi пишет: Я по..


nick_mi пишет:

 цитата:
Я попробовал, ну чтоб для нормальной статистики, 200 разрывов- 5 секунд.


Пример не большой можно ? Проверю на своем оффисе 2003

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



Пост N: 157
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 17.02.15 22:24. Заголовок: function main () l..


 
function main ()

local oExel
local osheet
local ocell
local opagebreak
local line_break
local time1
local time2

cls
time1 := time()
If ( oExcel := win_oleCreateObject( "Excel.Application" ) ) != NIL
oExcel:Visible := .t.
oWorkBook := oExcel:WorkBooks:open("D:\PUBLIC\harbexamp\obdc.xls")
osheet := oWorkBook:WorkSheets(1)
opagebreak := osheet:HPageBreaks()
line_break := 0
For I:= 1 to 200
line_break := line_break + 20
ocell := osheet:cells(line_break, 1)
opagebreak: add (ocell)
next
oExcel:Visible := .t.
time2 := time ()
@ 1,1 say "Time1="+ time1 + " Time2=" + time2
inkey (0)
EndIf



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




Пост N: 4506
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.02.15 22:30. Заголовок: nick_mi пишет: 200 ..


nick_mi пишет:

 цитата:
200 разрывов- 5 секунд.


Так и есть , 5 секунд.

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



Пост N: 158
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 17.02.15 22:35. Заголовок: Мож просто комп очен..


Мож просто комп очень медленный, поэтому
 цитата:
жутко тормозит



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



Пост N: 281
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 18.02.15 09:04. Заголовок: Вроде разобрался - т..


Вроде разобрался - тормоза это следствия леченного вируса (именно с офисои иногда проблемы)



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




Пост N: 4516
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.02.15 17:38. Заголовок: В EXCEL (2003) в мен..


В EXCEL (2003) в меню Сервис - Параметры - Международные ,есть
галя "Использовать системные разделители".
Считать системные разделители я могу.
А как считать разделители в самом EXCEL если галя снята с пункта "Использовать системные разделители" ?
+
Как узнать в каком положении находится пункт "Использовать системные разделители" (вкл/выкл)?

ЗЫ
Проехали , поюзал макрос (не думал что сработает)

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



Пост N: 215
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 20.03.15 16:24. Заголовок: Подскажите , как узн..


Подскажите , как узнать номер последней строки в Эксел-таблице ? То есть нужно отследить , когда заканчиваются данные .
С макросом как-то не получается :(


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




Пост N: 4605
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.03.15 16:30. Заголовок: Softlog86 oSheet:Us..


Softlog86
oSheet:UsedRange:Rows:Count

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




Пост N: 4643
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.04.15 21:21. Заголовок: Вот такая вот таблич..


Вот такая вот табличка

Большой беленький прямоугольник в левом верхнем углу - результат работы
oSheet:Range(osheet:cells(1,1),osheet:cells(2,3)):MergeCells:=.t.

Вопрос: Места в нём гуляй не хочу. Каким образом можно в нём написать несколько строк
текста ?

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




Пост N: 506
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.04.15 23:20. Заголовок: а так :sm12: oshe..


а так
osheet:cells(1,1):Value := "Несколько строк текста"

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




Пост N: 4644
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 09:01. Заголовок: Ёлки , я пробовал ру..


Ёлки , я пробовал руками в EXCEL это сделать не получилось.
А из проги в ряд строк вывести не проблема оказывается ;)
oSheet:Cells(1,1):Value:="Проверка1"+chr(10)+"Проверка2"+chr(10)+"TEST"+chr(10)+"hgjhgjhg"+chr(10)+"1111111111"

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




Пост N: 507
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 10:32. Заголовок: Dima пишет: руками..


Dima пишет:

 цитата:
руками в EXCEL это сделать не получилось


вместо ENTER жми ALT+ENTER

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




Пост N: 4645
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 10:39. Заголовок: Haz Дякую :sm12: ..


Haz
Дякую

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




Пост N: 4646
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 11:44. Заголовок: Макрос EXCEL ActiveW..


Макрос EXCEL
ActiveWorkbook.Colors(15) = RGB(234, 234, 234)

Как сделать на Harbour ?
Пробнул так
OExcel:ActiveWorkbook:Colors(15):RGB(234,234,234)
не компилится ........

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




Пост N: 508
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 12:08. Заголовок: Dima пишет: Макрос ..


Dima пишет:

 цитата:
Макрос EXCEL


Дим, а цвет чего он устанавливает ?

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




Пост N: 4647
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 12:12. Заголовок: В EXCEL есть стандар..


В EXCEL есть стандартные заливки фона.
Например (Harbour)
oSheet:Cells(jj,2):Interior:ColorIndex:=15
ColorIndex:=15 это 25 процентов серого а мне надо всего 15 процентов серого.
Попробовал в EXCEL изменить цвет этой заливки и получил макрос который привел выше


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




Пост N: 509
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 12:23. Заголовок: понял ) тогда так O..


понял )
тогда так
OExcel:ActiveWorkbook:Colors(15, RGB(234,234,234) )


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




Пост N: 4648
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 12:29. Заголовок: Неа. Неверный аргуме..


Неа.
Неверный аргумент COLORS
Ошибка WinOLE/1007
Код DOS ошибки -2147352562

Я еще пробовал ячейку красить так
oSheet:Cells(jj,2):Interior:Colors:=RGB(234,234,234) // до лампочки , все равно 25 процентов серого

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




Пост N: 510
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 12:31. Заголовок: странно у меня срабо..


странно у меня сработало

тестил так

oExcel:ActiveWorkbook:Colors(15, RGB(234,100,200) )
oSheet:Cells(1,1):Interior:ColorIndex:=15



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




Пост N: 4649
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 12:45. Заголовок: Не фига тогда не пон..


Не фига тогда не понимаю ;)
 
Вот так не компилится
OExcel:ActiveWorkbook:Colors(15):=RGB(234,234,234)

и вот так не компилится
OExcel:ActiveWorkbook:Colors(15):RGB(234,234,234)


Компилится только толку ноль от такого вызова
OExcel:ActiveWorkbook:Colors(15)

Компилится , но в работе падает с ошибкой
OExcel:ActiveWorkbook:Colors(15,RGB(234,234,234) )






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




Пост N: 511
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 12:49. Заголовок: так тоже сработало ..


так тоже сработало

oExcel:ActiveWorkbook:SET("Colors", 15, RGB(234,100,200) )


PS. мож от версии экселя зависит ...

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




Пост N: 4650
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 12:51. Заголовок: Haz пишет: oExcel:A..


Haz пишет:

 цитата:
oExcel:ActiveWorkbook:SET("Colors", 15, RGB(234,100,200) )


Жесть а у меня снова ошибка ОЛИ

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




Пост N: 4651
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 12:54. Заголовок: Вероятно дело не в H..


Вероятно дело не в Harbour а в версии EXCEL.
У меня 2003

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




Пост N: 512
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 13:11. Заголовок: Dima пишет: Вероятн..


Dima пишет:

 цитата:
Вероятно дело не в Harbour а в версии EXCEL.
У меня 2003



и не просто в версии , а можбыть в сборке.
На одной работает в 2003 на другой нет , на 2007 вроде везде работает



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




Пост N: 513
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 13:14. Заголовок: и так тоже работает ..


и так тоже работает

oExcel:Selection:Interior:Color := Rgb(240, 240, 240)

только Color , а не ColorS

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




Пост N: 4652
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 13:16. Заголовок: Haz Получается что ..


Haz
Получается что в моем EXCEL из Harbour
я не смогу сменить 15-й ColorIndex на свой цвет




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




Пост N: 4653
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 13:17. Заголовок: Haz пишет: oExcel:S..


Haz пишет:

 цитата:
oExcel:Selection:Interior:Color := Rgb(240, 240, 240)


Игорь я писал выше что да такой вызов работает , но заливка получается не Rgb(240, 240, 240) а
такая же как с ColorIndex:=15

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




Пост N: 514
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 13:18. Заголовок: сможешь, но пока не ..


сможешь, но пока не совсем ясно как . Макрос ведь работает , значит меняет

Мож Excelсменить

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




Пост N: 515
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 13:21. Заголовок: Ты писал через "..


Ты писал через "S"
oSheet:Cells(jj,2):Interior:Colors:=RGB(234,234,234) // до лампочки , все равно 25 процентов серого


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




Пост N: 516
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.04.15 13:22. Заголовок: Сорь, я уехал ..... ..


Сорь, я уехал .....

а Excel смени

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




Пост N: 4654
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 13:45. Заголовок: Haz пишет: Ты писал..


Haz пишет:

 цитата:
Ты писал через "S"


Да то моя очепятка на форуме. В реале без этой буквы.
Вот так Interior:Color:=RGB(234,234,234) и заливка получается БЕЛОЙ а не серый 15 %

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



Пост N: 161
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 03.04.15 14:15. Заголовок: вот так получается с..


вот так получается серой только последние две ячейки
obook:sheets(1):cells(2,2):interior():color := RGB(234,234,234)
obook:sheets(1):cells(3,3):interior():color := RGB(230,230,230)
obook:sheets(1):cells(4,4):interior:color := RGB(225,225,225)
obook:sheets(1):cells(5,5):interior:color := RGB(220,220,220)
obook:sheets(1):cells(6,6):interior:color := RGB(210,210,210)

почему так - хз, наверное, Мелкософт рулит

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




Пост N: 4655
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.04.15 16:48. Заголовок: Ладно поставим вопро..


Ладно поставим вопрос иначе ;)
Имеем макрос в EXCEL вида ActiveWorkbook.Colors(15) = RGB(234, 234, 234)
В самом EXCEL он срабатывает правильно и со цветами порядок.

Как правильно сказать Harbour что бы такой макрос заработал.
EXCEL 2003

1. OExcel:ActiveWorkbook:Colors(15):RGB(234,234,234) // Не компилится Harbour-ом
2. OExcel:ActiveWorkbook:Colors(15, RGB(234,234,234)) // Падает прога с ошибкой WinOLE/1007
3. OExcel:ActiveWorkbook:SET("Colors", 15, RGB(234,234,234)) // Падает прога с ошибкой WinOLE/1007

Есть еще варианты ?


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




Пост N: 4098
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.04.15 02:40. Заголовок: Haz пишет: и не про..


Haz пишет:

 цитата:
и не просто в версии , а можбыть в сборке.
На одной работает в 2003 на другой нет , на 2007 вроде везде работает


Вопрос может и не совсем в тему, но очень необходим.
А как у себя из программы узнать версию EXCEL и WinWord ?
Чтобы юзеру в красном окошке сообщить, что может случиться фигня из-за старой версии....

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




Пост N: 4661
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 10:29. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как у себя из программы узнать версию EXCEL


? oExcel:Version // у меня 11

PS
12 - Excel 2007
11 - Excel 2003
10 - Excel 2000
и тд

Или так
Ob:= win_oleCreateObject("Scripting.FileSystemObject")
? Ob:GetFileVersion(Путь к EXCEL+"excel.exe")
Дорогу к EXCEL можно взять в теме


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




Пост N: 517
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 12:53. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как у себя из программы узнать версию EXCEL



или вариант посложнее - WMI запрос к системе

SELECT VERSION FROM Win32_Product WHERE Caption Like '%EXCEL%'

PS. примеры WMI в минигуи ЕСТЬ

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




Пост N: 4662
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 14:23. Заголовок: Haz пишет: или вари..


Haz пишет:

 цитата:
или вариант посложнее - WMI запрос к системе


Или так

 
OLocator:=CreateObject("wbemScripting.SwbemLocator")
oWMI:= oLocator:ConnectServer()
arr:=oWMI:ExecQuery("SELECT * FROM Win32_Product")
for each oitem in arr
if hb_at("Microsoft Office",oitem:Name)>0
if hb_at("2003",oitem:Name)>0
? 2003
elseif hb_at("2007",oitem:Name)>0
? 2007
elseif hb_at("2010",oitem:Name)>0
? 2010

endif
endif
next



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




Пост N: 518
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 14:40. Заголовок: Dima пишет: Или так..


Dima пишет:

 цитата:
Или так


Можно еще папку Program Files просканировать и по циферкам в пути понять версию
\Program Files\Microsoft Office\Office15

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




Пост N: 4663
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 14:42. Заголовок: Да и это пожалуй сам..


Да и это пожалуй самый быстрый способ

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




Пост N: 519
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 14:47. Заголовок: есть еще быстрее из..


есть еще быстрее из реестра взять по пути
Software => Microsoft => Office => [номер версии]

но мне нравится через WMI - пофиг что код длинный и долго, зато подход к задаче системный

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




Пост N: 4664
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 14:55. Заголовок: Haz пишет: есть еще..


Haz пишет:

 цитата:
есть еще быстрее из реестра взять по пути
Software => Microsoft => Office => [номер версии]


Вот и нет.
Я только что посмотрел туда и там есть остатки от старых версий , хотя у меня стоит 11 (2003)
У меня там 12 , 11 , 8 ,9 ))

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




Пост N: 520
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 14:59. Заголовок: Dima пишет: там ес..


Dima пишет:

 цитата:
там есть остатки от старых версий



я ж говорил - тогда твой пример с WMI

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




Пост N: 4665
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 15:05. Заголовок: Можно вообще не замо..


Можно вообще не заморачиваться и если отчет заточен под конкретный EXCEL
тогда в проге делать такой вызов ;)
 
OX:=CreateObject("Excel.Application.12")
if valtype(OX)#"O"
* Досвидос
endif



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




Пост N: 521
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 15:13. Заголовок: Dima пишет: Можно в..


Dima пишет:

 цитата:
Можно вообще не заморачиваться



А вот это правильные слова т.к. у клиента может быть аллергия на микрософт офис и он пользует исключительно опенофис

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




Пост N: 4666
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 15:15. Заголовок: Haz что то нафлудил..


Haz
что то нафлудили мы с тобой , Андрей и ответ не найдет

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




Пост N: 522
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 15:30. Заголовок: потри лишнее , а кто..


потри лишнее , а кто ищет - тот найдет

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




Пост N: 4667
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 15:51. Заголовок: Нужно сделать сетку ..


Нужно сделать сетку в диапазоне.
Сейчас делаю так
osheet:cells(1,1):BorderAround( xlContinuous, xlThin)
osheet:cells(1,2):BorderAround( xlContinuous, xlThin)
osheet:cells(1,3):BorderAround( xlContinuous, xlThin)

Но если строк/столбцов много наверное это будет работать медленно.
Если сделать вот так
oSheet:Range(osheet:cells(1,1),osheet:cells(1,3)):BorderAround( xlContinuous, xlThin)
то сетка будет только по периметру.
Нужен быстрый способ сделать сетку на диапазон.

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




Пост N: 523
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 15:59. Заголовок: Dima пишет: Нужен б..


Dima пишет:

 цитата:
Нужен быстрый способ сделать сетку на диапазон.



а так

oSheet:Range(oSheet:Cells(nRowStart, 1), oSheet:Cells(nRow, 13)):Select()
WITH OBJECT oExcel:Selection
:Borders(xlDiagonalDown):LineStyle := xlNone
:Borders(xlDiagonalUp):LineStyle := xlNone
:Borders(xlEdgeLeft):LineStyle := xlContinuous
:Borders(xlEdgeLeft):Weight := xlContinuous

:Borders(xlEdgeTop):LineStyle := xlContinuous
:Borders(xlEdgeTop):Weight := xlContinuous

:Borders(xlEdgeBottom):LineStyle := xlContinuous
:Borders(xlEdgeBottom):Weight := xlContinuous

:Borders(xlEdgeRight):LineStyle := xlContinuous
:Borders(xlEdgeRight):Weight := xlContinuous

:Borders(xlInsideVertical):LineStyle := xlContinuous
:Borders(xlInsideVertical):Weight := xlContinuous

:Borders(xlInsideHorizontal):LineStyle := xlContinuous
:Borders(xlInsideHorizontal):Weight := xlContinuous

ENDWITH



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




Пост N: 4668
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 16:01. Заголовок: А это быстрее будет ..


А это быстрее будет чем делать поячеячно ?

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




Пост N: 524
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 16:03. Заголовок: Dima пишет: А это б..


Dima пишет:

 цитата:
А это быстрее будет чем делать поячеячно



точно попробуй на большом диапазоне

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




Пост N: 4669
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 16:11. Заголовок: Да сделал тестик ;) ..


Да сделал тестик ;)
100 колонок 1000 строк.
Твой способ - доли миллисекунды ;)
Мой - 2 минуты.

Сложил методу в свою копилку

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




Пост N: 4670
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 16:24. Заголовок: Игорь а как снять от..


Игорь а как снять отметку то что отметилось в Select() ?
Гугл копал но нормального ответа не увидел.

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




Пост N: 525
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 16:51. Заголовок: Dima пишет: Игорь а..


Dima пишет:

 цитата:
Игорь а как снять отметку то что отметилось


попробуй переселектить cells(1,1):Select()

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




Пост N: 4671
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.04.15 16:52. Заголовок: Haz пишет: попробуй..


Haz пишет:

 цитата:
попробуй переселектить cells(1,1):Select()


Ну это понятно. Я думал что есть что то типа UNSelect()

А каким образом в диапазоне поменять цвет фона ячеек ?

Все нашел что то типа :Interior:ColorIndex:=36 в WITH OBJECT oExcel:Selection

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




Пост N: 526
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.15 17:01. Заголовок: Dima пишет: А каким..


Dima пишет:

 цитата:
А каким образом в диапазоне поменять цвет фона ячеек


я делел так
oHoja:Range(oHoja:Cells(nRow1, nCol1), oHoja:Cells(nRow2, nCol2)):Interior:Color := nColor

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




Пост N: 4816
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.05.15 15:44. Заголовок: Создаю отчетик в EXC..


Создаю отчетик в EXCEL и при завершении в проге
выдаю oExcel:Visible := .t.
В Windows XP сразу появлялось окно EXCEL поверх моей программы и было активным окном.
В Windows 7 , оно появляется , но не поверх а рядом.
Как изменить такое поведение в Windows 7 ?

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




Пост N: 557
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.05.15 17:10. Заголовок: Dima пишет: Как изм..


Dima пишет:

 цитата:
Как изменить такое поведение в Windows 7



hWnd := oExcel:hWnd
ShowWindow(hWnd, 3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6
BringWindowToTop(hWnd)


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




Пост N: 4817
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.05.15 17:14. Заголовок: Спасибо Игорь попроб..


Спасибо Игорь попробую. Надеюсь этот код будет и в XP себя также вести.

ЗЫ
Проверил. Работает отлично.

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




Пост N: 558
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.05.15 17:18. Заголовок: Dima пишет: Надеюсь..


Dima пишет:

 цитата:
Надеюсь этот код будет и в XP себя также вести.



Да вроде везде одинаково себя ведет. Более того по hWnd можно это окно двигать или менять размеры т.е. можно разделить экран и использовать excel типа для предпросмотра )

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




Пост N: 4818
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.05.15 17:26. Заголовок: Haz пишет: Более то..


Haz пишет:

 цитата:
Более того по hWnd можно это окно двигать или менять размеры т.е. можно разделить экран и использовать excel типа для предпросмотра )


Круто !

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




Пост N: 4180
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.05.15 19:41. Заголовок: Haz пишет: hWnd := ..


Haz пишет:

 цитата:
hWnd := oExcel:hWnd
ShowWindow(hWnd, 3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6
BringWindowToTop(hWnd)


А я долбился года 2 назад, как поверх всех окон выводить Ёксель в Win7 и выше...
Спасибо !
А как изменять размеры окна Ёкселя ?

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




Пост N: 559
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.05.15 09:47. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как изменять размеры окна Ёкселя



MoveWindow( hWnd, ...)

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




Пост N: 3304
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.07.15 16:44. Заголовок: Пришлось тут заполня..


Пришлось тут заполнять большую форму в экселе: много листов, строки разбиты на множество клеточек
Получилось мееееедленно.

Строку заполнял традиционным способом:
oCell := oSheet:Cells(nRow, nCol)
oCell:Value := c1
oCell := oCell:Next
oCell:Value := c2
...

Как оказалось, допустим такой синтаксис:
aValue := {c1, c2, ...}
oSheet:Range(oSheet:Cells(nRow, nCol), oSheet:Cells(nRow, nCol+len(aValue)-1)):Value := aValue

При этом заполняется значениями сразу вся строка документа, что значительно быстрее.
Некоторые ячейки при этом можно пропускать:
aValue := {c1,, c3, ...}


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




Пост N: 5075
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.07.15 16:55. Заголовок: Pasha Паш об этом у..


Pasha
Паш об этом уже писалось. И про сеточку и про заполнение.

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




Пост N: 3305
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.07.15 18:25. Заголовок: Действительно, я про..


Действительно, я прозевал этот трюк. Но пока сам не пощупаешь.. действительно быстрее в разы
Еще лучше преобразовывать адрес ячеек сразу в текст:

Вместо:

oSheet:Range(oSheet:Cells(nRow, nCol), oSheet:Cells(nRow, nCol2))

использовать

oSheet:Range(;
if(nCol>26,Chr(Int((nCol-1)/26)+64),'')+Chr((nCol-1)%26+65) + LTrim(Str(nRow)) + ':' +;
if(nCol2>26,Chr(Int((nCol2-1)/26)+64),'')+Chr((nCol2-1)%26+65) + LTrim(Str(nRow)) )

это минус вызов 2-х методов excel

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




Пост N: 5077
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.07.15 18:37. Заголовок: Там еще одна мелочуш..


Там еще одна мелочушка.
Если присвоение делаем так :={1,2}
А вот если в с того же Range считать данные то получим уже в таком формате {{1},{2}}

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




Пост N: 5084
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.15 15:19. Заголовок: В Ёксель задаю отсту..


В Ёксель задаю отступы листа , но иногда бывает что широкая таблица целиком
на страницу не влазит при печати и начинаются авто-переносы.
Что надо сказать Ёкселю что бы он вписал таблицу в нужную ширину скажем
за счет какой то колонки ?


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




Пост N: 5085
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.15 15:42. Заголовок: Вроде нашлось ;) .F..


Вроде нашлось ;)
.FitToPagesWide = 1
.FitToPagesTall = 32000

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




Пост N: 5086
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.15 16:00. Заголовок: Окончательный вариан..


Окончательный вариант
oSheet:PageSetup:FitToPagesWide:= 1
oSheet:PageSetup:Zoom:= .f. // это обязательно
oSheet:PageSetup:FitToPagesTall:= 32000


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




Пост N: 602
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.07.15 20:32. Заголовок: Dima пишет: oSheet:..


Dima пишет:

 цитата:
oSheet:PageSetup:Zoom:= .f. // это обязательно



все верно делаю так

oExcel:ActiveSheet:PageSetup:Zoom := FALSE
oExcel:ActiveSheet:PageSetup:FitToPagesWide := 1
oExcel:ActiveSheet:PageSetup:FitToPagesTall := 10
oExcel:ActiveSheet:PageSetup:Orientation := xlLandscape

PS. Раньше ответить не мог - винда рухнула, пол дня ставил

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




Пост N: 5088
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.07.15 21:22. Заголовок: Haz пишет: oExcel:A..


Haz пишет:

 цитата:
oExcel:ActiveSheet:PageSetup:Orientation := xlLandscape


я в портрет хотел вписать , xlLandscape был не вариант ;)

Haz пишет:

 цитата:
PS. Раньше ответить не мог - винда рухнула, пол дня ставил


Беккап не юзаем конечно (типа Acronis True Image) и точки восстановления тоже ?

ЗЫ
Если винты у тебя Сигейт или WD , есть бесплатный вариант ATI.
Научу что надо делать. Вещь не заменимая. Ну или аналог Paragon Домашний Эксперт
Там все довольно просто Игорь.


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




Пост N: 4394
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.07.15 12:20. Заголовок: Привет всем. Есть ли..


Привет всем.
Есть ли у кого простой текст программы для переноса dbf в xls ?
База небольшая 30-40 записей. Ну и вверху листа экселя сделать титул и шапку на русском...
Или дайте пожалуйста схему как сделать без всяких наворотов.
А то я до этого делал обратную задачу из xls в dbf.


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





Пост N: 9
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 23.07.15 13:19. Заголовок: Например : #define ..


Например :

#define xlWorkbookNormal -4143

FUNCTION MAIN()

LOCAL oExcel, oWorkBook, _tec_dir := GetCurrentFolder(), _line := 3
SET LANGUAGE TO RUSSIAN

oExcel := TOleAuto():New( "Excel.Application" )
oWorkBook := oExcel:WorkBooks:Open( _tec_dir + "\TEST1.DBF" )

oWorkBook:Cells:Font:Name := "Arial" // Офолрмление колонок, ячеек
oWorkBook:Cells:Font:Size := 10
oWorkBook:Columns( 15 ):Set( "NumberFormat", '@' )
oWorkBook:Cells(3, 3):Borders():LineStyle := 1
oWorkBook:Range("A2:D2"):Borders():LineStyle := 1
oWorkBook:columns(14):columnwidth := 18

oWorkBook:Cells( 1, 3):Value := "Титул"

DO WHILE .NOT.EOF()

oWorkBook:Cells( _line, 1):Value := 1->PU // значени полей DBF
oWorkBook:Cells( _line, 2):Value := 1->KF

oWorkBook:Cells( _line, 4):Value := 1->TV
oWorkBook:Cells( _line, 4 ):Set( "NumberFormat", '@' ) // текстовая ячейка

oWorkBook:Cells( _line, 12):Value := 1->ZU
oWorkBook:Cells( _line, 12 ):Set( 'NumberFormat', '########0,00' ) // числовая ячейка

.......

_line++
SKIP
ENDDO

oWorkBook:SaveAs( _tec_dir + "\NEW.XLS", xlWorkbookNormal )
oExcel:Visible = .T.

RETURN NIL



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




Пост N: 4395
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.07.15 13:24. Заголовок: Спасибо БОЛЬШОЕ ! :..


Спасибо БОЛЬШОЕ !

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




Пост N: 4397
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.15 17:33. Заголовок: Есть цвет из МиниГуи..


Есть цвет из МиниГуи {234,240,207}.
Как сделать заливку ячейки в Экселе этим цветом ?

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




Пост N: 5149
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.15 17:43. Заголовок: Как то так ActiveWor..


Как то так
ActiveWorkbook.Colors(1) = RGB(234,240,207)
Затем красим с индексом 1

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




Пост N: 4398
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.15 18:28. Заголовок: Alex_Cher пишет: oE..


Alex_Cher пишет:

 цитата:
oExcel := TOleAuto():New( "Excel.Application" )
oWorkBook := oExcel:WorkBooks:Open( _tec_dir + "\TEST1.DBF" )



А как сделать без открытия базы ?
База у меня открывается в другом месте и не все поля нужно перетаскивать в Эксель.
Как создать новый документ xls ?

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




Пост N: 4399
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.15 18:33. Заголовок: Dima пишет: А посмо..


Dima пишет:

 цитата:
А посмотри примерчик
\svn\harbour\contrib\hbwin\tests\testole.prg


Нашёл. Спасибо !

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




Пост N: 4401
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.15 02:53. Заголовок: Задал фонт на таблиц..


Задал фонт на таблицу:
oSheet:Cells:Font:Name := "Arial"
oSheet:Cells:Font:Size := 15

Как узнать ширину строки заголовка таблицы (например "Кол-во товара") по этому фонту, чтобы установить ширину колонки:
oSheet:columns( 2 ):columnwidth := ???


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




Пост N: 5150
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.07.15 09:31. Заголовок: Сделай проще :sm12:..


Сделай проще
oSheet:Columns(2):AutoFit()

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




Пост N: 4403
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.15 17:37. Заголовок: Dima пишет: Сделай ..


Dima пишет:

 цитата:
Сделай проще
oSheet:Columns(2):AutoFit()


Классно ! Работает. Спасибо !

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




Пост N: 4406
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.15 20:44. Заголовок: Делаю вывод чисел та..


Делаю вывод чисел так:
oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '########0,00' ) // числовая ячейка
а для целых чисел какой вывод нужно делать ?
И как определить по значению - целое число или дробное ?

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




Пост N: 5151
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.07.15 21:44. Заголовок: Andrey пишет: а для..


Andrey пишет:

 цитата:
а для целых чисел какой вывод нужно делать ?


гугл ни кто не отменял
NumberFormat := '#,##0'

ЗЫ
// Установим формат целых чисел с разделителем тысяч

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




Пост N: 5152
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.07.15 21:47. Заголовок: Andrey пишет: И как..


Andrey пишет:

 цитата:
И как определить по значению - целое число или дробное ?


считай , преобразуй в символьную и чекани строку на предмет ".000" если TRUE значит
целое.
Хотя может в Ёксель что то есть в этом плане.
Гуглить надо.

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




Пост N: 4407
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.15 00:37. Заголовок: Dima пишет: Хотя мо..


Dima пишет:

 цитата:
Хотя может в Ёксель что то есть в этом плане.
Гуглить надо.


Я это и имел ввиду, что может уже кто знает.
Спасибо, погуглил... Решение то оказывается на поверхности лежит:
IF INT(xValue) == xValue // значит целое число
oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '########0' ) // числовая ячейка
ELSE
oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '########0,00' ) // числовая ячейка
ENDIF


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




Пост N: 4409
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.15 19:48. Заголовок: Сделал прогу, под Ёк..


Сделал прогу, под Ёкселем 2003 - работает нормально. 5 сек. и появляется таблица.
У клиента стоит Ёксел 2007, окно не появляется, пока не залезть в Диспетчер задач и не переключиться на "Microsoft Office Excel - проверка совместимости" и в этом дурацком окне нужно нажать кнопку "Продолжить" !!! Блин, юзера выть будут...
Погуглил, решения не нашёл.
Подскажите пожалуйста решение ?
Или отключить в Ёкселе 2007 эту проверку или при создание в ОЛЕ прописать, что файл 2007 версии.

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




Пост N: 5156
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.07.15 21:29. Заголовок: Начинаешь так ? Crea..


Начинаешь так ?
CreateObject( "Excel.Application" )

Заканчиваешь так ?
oExcel:Visible := .t.

ЗЫ
Вижу...http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=23794
Дело не в этом похоже о чем выше я написал.
Думаю нужно определять активную версию оффиса ну и дописывать цифирки после точки в "Excel.Application.999"
Нужно выложить готовую функцию думаю для проверки версии (100 % работающую) , мне такая была не нужна
так как все сидят на 2003.
Функцию для CreateObject( "Excel.Application"+VersEXCEL() )

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




Пост N: 4410
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.15 21:46. Заголовок: Делаю так: oExcel..


Делаю так:
oExcel := TOleAuto():NEW( "Excel.Application" )
oWorkBook := oExcel:WorkBooks:Add()

Dima пишет:

 цитата:
Думаю нужно определять активную версию оффиса ну и дописывать цифирки после точки в "Excel.Application.999"


А какие цифирьки для 2007 поставить нужно ?


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




Пост N: 5157
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.07.15 21:54. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А какие цифирьки для 2007 поставить нужно ?


Погугли я точно не помню так как не использую НО они есть.

Где то было на форуме.....лень искать
Гугл :)
' open Excel 2003
Set obj1 = CreateObject("Excel.Application.11")

' open Excel 2007
Set obj2 = CreateObject("Excel.Application.12")


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




Пост N: 4411
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.15 22:02. Заголовок: Ещё нашел такой ключ..


Ещё нашел такой ключ:
ActiveWorkbook.CheckCompatibility = False
Может его к себе в прогу засунуть ?

Dima пишет:

 цитата:
Функцию для CreateObject( "Excel.Application"+VersEXCEL() )


Пишем с точкой или без точки - "Excel.Application.999" - ?
Увидел ответ на свой вопрос... Уже ответил. Спасибо !

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




Пост N: 4412
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.15 22:18. Заголовок: Dima пишет: ? oExce..


Dima пишет:

 цитата:
? oExcel:Version


А как тогда создаем CreateObject("Excel.Application.11"), если версию можем получить после создания объекта ?

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




Пост N: 5158
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.07.15 22:20. Заголовок: Версию получить нужн..


Версию получить нужно ДО создания.
Поищи на форуме что то типа "Excel.Application.11"

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




Пост N: 5159
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.07.15 22:32. Заголовок: http://clipper.borda..


http://clipper.borda.ru/?1-4-0-00000578-000-0-0-1345918268
Пост 92

Там же твой ответ "спасибо попробую" , но похоже руки не дошли.
Бывает.

PS
Если разобрался , выкладывай готовую функцию , проверим.

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




Пост N: 4413
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.15 23:13. Заголовок: Dima пишет: Если ра..


Dima пишет:

 цитата:
Если разобрался , выкладывай готовую функцию , проверим.


Делаю отдельный пример. Как сделаю - выложу !

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




Пост N: 5160
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.07.15 09:04. Заголовок: Andrey В этой теме ..


Andrey
В этой теме посмотри посты номер 4662 , 518

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




Пост N: 4416
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.07.15 18:26. Заголовок: Сделал тест. На Exce..


Сделал тест. На Excel 2013 тоже работает без проблем.
Поставил в виртуалке 2007. Опять фигня, уже в другом месте:


Строка 226 - oExcel:ActiveSheet:PageSetup:Zoom := FALSE
Что не нравиться опять 2007 ?

Блин, ни одного принтера в виртуалке нет...
Как у себя в проге проверить, чтобы не вылетало ?

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




Пост N: 4417
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.07.15 19:14. Заголовок: Нашёл функцию: oExce..


Нашёл функцию:
oExcel:ActivePrinter - возвращает "неизвестный принтер (проверте Панель Управления)"


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




Пост N: 4418
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.07.15 19:51. Заголовок: http://clipper.borda..


http://clipper.borda.ru/?1-20-0-00000371-000-0-0-1195742832
Pasha - Пост N: 645

В конце концов остановился на функции
Function MSExcel_PATH
Return GetRegistry(, "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe", 'Path' )
которая использует стандартные средства харбора для работы с реестром


Не работает ! Возвращает NIL


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


Пост N: 1112
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 28.07.15 20:33. Заголовок: Andrey пишет: Не ра..


Andrey пишет:

 цитата:
Не работает ! Возвращает NIL


А так? "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe"

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




Пост N: 5164
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.07.15 21:39. Заголовок: тоже не пашет с HBWI..


тоже не пашет с HBWIN
win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe" )
+ это
win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Opera.exe" )
win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe" )


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


Пост N: 1113
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 12:37. Заголовок: Работает так: win_re..


Работает так: win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe\Path" )

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




Пост N: 5165
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 12:48. Заголовок: PSP Точно !..


PSP
Точно !

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


Пост N: 1114
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 12:57. Заголовок: Dima пишет: Точно !..


Dima пишет:

 цитата:
Точно !


И даже больше: если в конце не указывать Path, а оставить только слэш,

 цитата:
win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe\


то вернет значение параметра "По умолчанию".
Просто, если нет слэша, то функция возвращает NIL, потому что "excel.exe" - название раздела, а не параметра.

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




Пост N: 5166
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 12:58. Заголовок: PSP пишет: то верне..


PSP пишет:

 цитата:
то вернет значение параметра "По умолчанию".


Да и имена папок в формате 8.3

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


Пост N: 1115
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 12:59. Заголовок: Dima пишет: Да и им..


Dima пишет:

 цитата:
Да и имена папок в формате 8.3


Для excel - да, для firefox - нормально )))

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




Пост N: 4420
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.07.15 17:51. Заголовок: А как заменить внизу..


А как заменить внизу: "Лист 1", "Лист 2" ....



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




Пост N: 5167
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 21:37. Заголовок: PSP То есть коррект..


PSP
То есть корректно получить версию можно так...или туплю слегка.
Первое что пришло в голову
left(right(win_regRead( "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe\Path" ),3),2)

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




Пост N: 5168
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 21:41. Заголовок: Andrey пишет: А ка..


Andrey пишет:

 цитата:

А как заменить внизу: "Лист 1", "Лист 2" ....


Включить макрос как минимум на запись и переименовать руками
После смотрим что же там...........
 
Sheets("Лист1").Select
Sheets("Лист1").Name = "XXX"


затем это превращаем в код Harbour.

PS
Спать ночью надо Андрей

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


Пост N: 1116
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 22:20. Заголовок: Dima пишет: То есть..


Dima пишет:

 цитата:
То есть корректно получить версию можно так...или туплю слегка.


Вот еще есть кое-что: "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office". В этом разделе должен быть подраздел с номером версии, в котором, в свою очередь, подразделы для всех установленных программ. Не знаю, удаляются ли эти ветки из реестра в случае деинсталляции офиса. В принципе, можно проверить, существует ли файл, к примеру excel.exe, по пути из соответствующего подраздела, т.е. File( win_regRead( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Excel\InstallRoot\Path" ) + "\Excel.exe" )

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




Пост N: 5170
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 22:26. Заголовок: PSP в этой ветке ви..


PSP
в этой ветке вижу у себя 11.0 и 9.0
стрянно , ставил только 2003 оффис


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




Пост N: 5171
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 22:29. Заголовок: PSP пишет: В принци..


PSP пишет:

 цитата:
В принципе, можно проверить, существует ли файл


я понял корректного получения номера оффиса нет (включая 32 или 64 бит) , или есть ?


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


Пост N: 1117
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 22:30. Заголовок: Dima пишет: PSP в э..


Dima пишет:

 цитата:
PSP
в этой ветке вижу у себя 11.0 и 9.0
стрянно , ставил только 2003 оффис


Нужно проверять наличие соответствующих путей к exe-шникам в обоих ветках. Если есть и там, и там, - использовать более свежее.

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




Пост N: 5172
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 22:31. Заголовок: PSP Понял. Бум дума..


PSP
Понял. Бум думать :)

PS
2-х офисов (или более) надеюсь не может быть установлено

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


Пост N: 1118
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 22:35. Заголовок: Dima, а какие переме..


Dima, а какие переменные есть в объекте, который возвращает CreateObject( "Excel.Application" ) ? Сам не могу глянуть сейчас. Нет ли там номера версии?

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




Пост N: 5173
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 22:38. Заголовок: PSP Номерок то есть..


PSP
Номерок то есть НО после CreateObject( "Excel.Application" )
а нужно ведь сразу создать правильный CreateObject( "Excel.Application"+ExVer() )

типа так oExcel:Version

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


Пост N: 1119
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 29.07.15 22:44. Заголовок: Dima пишет: Номерок..


Dima пишет:

 цитата:
Номерок то есть НО после CreateObject( "Excel.Application" )
а нужно ведь сразу создать правильный CreateObject( "Excel.Application"+ExVer() )


Ну, ок... А если создать без номера версии, прочитать версию, закрыть, а потом создать с нужным номером? Понимаю, что не очень красиво, но, имхо, правильней, чем в реестре рыться.

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




Пост N: 5174
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.07.15 22:47. Заголовок: PSP Кстати да , вар..


PSP
Кстати да , вариант.


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




Пост N: 4421
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.07.15 23:15. Заголовок: Dima пишет: Sh..


Dima пишет:

 цитата:
Sheets("Лист1").Select
Sheets("Лист1").Name = "XXX"



Спасибо ! Получилось !

Почту свою напомни ?



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




Пост N: 4422
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.07.15 23:24. Заголовок: PSP пишет: А если с..


PSP пишет:

 цитата:
А если создать без номера версии, прочитать версию, закрыть, а потом создать с нужным номером? Понимаю, что не очень красиво, но, имхо, правильней, чем в реестре рыться.



Да не обязательно это делать !
Лист создаётся нормально, только при записи файла вылазит ОКНО-СОВМЕСТИМОСТИ !
Я для себя уже сделал проверку:
IF nVerExcel > 11 // Excel 2003
// проверка совместимости на версиях старше 2003
// нельзя записать файл, так как вылазит ОКНО-СОВМЕСТИМОСТИ
// из-за этого пускай юзер сам пишет файл
lSave := .F.
ENDIF



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




Пост N: 3338
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.15 10:40. Заголовок: Если при заполнении ..


Если при заполнении строки листа значениями из массива командой

oSheet:Range(oSheet:Cells(nRow, nCol), oSheet:Cells(nRow, nCol2)):Value := aArray

внутри строки есть формулы, то эти формулы сносятся, даже если в соответствующей позиции aArray находится значение nil
Нет ли какой настройки, чтобы формулы сохранялись ? Или без вариантов ?

Спасибо: 0 
Профиль
Панченко





Пост N: 87
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 24.12.15 20:35. Заголовок: В Foxpro есть следую..


В Foxpro есть следующая полезная фишка по быстрому заполнению области листа данными из массива с использованием указателя на него:

aArray[ nRow, nCol ] - массив данных

WITH oEcel 
.WorkBooks.Add
.Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=GetPtr("aArray")
ENDWITH
. . .
Function GetPtr(cArrName)
Return @&cArrName

Очень удобно и быстро. Как добиться аналогичного результата в Harbour?


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




Пост N: 5429
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.12.15 22:22. Заголовок: Панченко oSheet:Ra..


Панченко
 
oSheet:Range(osheet:cells(i,1),osheet:cells(i,15)):Value:=;
{elem[1],elem[2],elem[3],elem[4],elem[5],elem[6],elem[7],;
elem[8],elem[9],elem[10],elem[11],elem[12],elem[13],elem[14],dtoc(elem[15])}

Выдрал у себя из сырца , думаю понятно.

Впрочем можно и через WITH oEcel

Спасибо: 0 
Профиль
Панченко





Пост N: 88
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 09:17. Заголовок: Dima Может быть я н..


Dima
Может быть я непонятно написал. Речь идет не о применении WITH или заполнении однрй строки. В моем примере заполняется весь прямоугольный диапазон ячеек за один раз за счет передачи в VALUE указателя на массив значений.

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




Пост N: 5430
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.12.15 11:16. Заголовок: Панченко Смотри в э..


Панченко
Смотри в этой теме пост 239 (от fil) и 3304 (от Pasha)
Впрочем я показал тот же подход где VALUE присваивается массив

Спасибо: 0 
Профиль
Панченко





Пост N: 89
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 13:09. Заголовок: Dima Эти сообщения ..


Dima
Эти сообщения я видел. Везде речь идет о заполнении ОДНОЙ строки. В примере на ФОКСе заполняется НЕСКОЛЬКО строк и колонок, что дает значительное сокращение времени.
Т.е.:
oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value = ...


Спасибо: 0 
Профиль
Панченко





Пост N: 90
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 13:11. Заголовок: Задача сводится к по..


Задача сводится к получению адреса массива. Кто знает С - подскажите, как должна выглядеть эта функция.

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




Пост N: 5431
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.12.15 13:42. Заголовок: Панченко пишет: oSh..


Панченко пишет:

 цитата:
oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value = ...


Думаю и тут чудно сработает
oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value: =твой массив


Спасибо: 0 
Профиль
Панченко





Пост N: 91
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 13:44. Заголовок: Dima пишет: Думаю и..


Dima пишет:

 цитата:
Думаю и тут чудно сработает


Увы... Уже проверял - не работает, заполнения всего диапазона не происходит.

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




Пост N: 5432
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.12.15 14:06. Заголовок: счас подумаем..


счас подумаем

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




Пост N: 3383
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.12.15 14:17. Заголовок: В харборе массив все..


В харборе массив всегда передается по адресу, так что его адрес получать не надо.
Надо просто привоить ячейкам значение:
<obj>:Value := aArray

Спасибо: 0 
Профиль
Панченко





Пост N: 92
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 14:38. Заголовок: И в харборе и в фокс..


И в харборе, и в фоксе при присвоении :VALUE = aArray не заполняются 2, 3 и т.д. строки диапазона.

В фоксе при присвоении :VALUE = <указатель на массив> все заполняется великолепно. Если же применить промежуточное присвоение типа
<переменная> = <указатель на массив>
:VALUE = <переменная>
то получается заполнение то ли только первой строки, то ли все заполняется первым элементом массива - уже не помню.
Кроме того, в функции, возвращающей указатель, массив должен быть виден (например, глобально).

Хотел проверить это в харборе, но как получить указатель на массив? В С я "непонимэ".

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



Пост N: 387
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 25.12.15 17:17. Заголовок: Считать в массив мож..


Считать в массив можно любой ранг из Excel, а вот писать только однострочный массив
(по край мере не получилось) но всегда есть ADO..

Спасибо: 0 
Профиль
Панченко





Пост N: 93
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 18:37. Заголовок: И все-таки, Си-шники..


И все-таки, Си-шники, может кто-нибудь набросать функцию, возвращающую указатель на массив по его имени?

Спасибо: 0 
Профиль
Панченко





Пост N: 94
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 25.12.15 20:58. Заголовок: Может это и бессмысл..


Может это и бессмысленно, но нужна функция на С, на входе получающая массив (скажем R) и заканчивающаяся return &R. Увы, не знаю синтаксиса С.

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




Пост N: 5434
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 14:40. Заголовок: Панченко Хочешь ска..


Панченко
Хочешь сказать что это ты сам реально проверил ?
То есть вот так в Фоксе сработает правильно
.Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=GetPtr("aArray")
А вот так уже нет
.Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=aArray

Спасибо: 0 
Профиль
Панченко





Пост N: 95
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 18:32. Заголовок: Dima пишет: Хочешь..


Dima пишет:

 цитата:

Хочешь сказать что это ты сам реально проверил ?


А в чем сомнения? Первый вариант работает во многих моих программах, давно и надежно. Что не так со вторым - я писал выше, что уже не помню. Сегодня специально проверил - весь диапазон заполняется значением первого элемента массива.

Спасибо: 0 
Профиль
Панченко





Пост N: 96
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 18:43. Заголовок: Именно поэтому и пот..


Именно поэтому и потому, что на практике сталкивался с разными "чудесами" в разных языках, я и прошу пример функции на С, которая принимала бы aArray или "aArray" и возвращала бы (без всяких промежуточных присваиваний) &aArray.
Хочу проверить в харборе вариант присваивания ...:Value := <имя_этой_фунции>(aArray /или "aArray"/).
Можешь написать?

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




Пост N: 5435
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 18:50. Заголовок: Панченко пишет: Мож..


Панченко пишет:

 цитата:
Можешь написать?


Нет я не дружу с СИ

Панченко пишет:

 цитата:
Сегодня специально проверил - весь диапазон заполняется значением первого элемента массива.


Ну это не совсем так.
Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов.
Результат по всех строках был одинаков - первые 10 элементов массива.

Панченко пишет:

 цитата:
А в чем сомнения?


Да просто подумал , что ты вычитал где то в инете а на практике , не проверял.
Значит я ошибся !

Спасибо: 0 
Профиль
Панченко





Пост N: 97
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 19:35. Заголовок: Dima пишет: Ну это ..


Dima пишет:

 цитата:
Ну это не совсем так.
Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов.
Результат по всех строках был одинаков - первые 10 элементов массива.


Странно. Мой массив:
11 12
21 22
31 32
Во все ячейки занеслось 11.

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




Пост N: 3384
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.15 20:07. Заголовок: Вопрос не в том, как..


Вопрос не в том, как передать массив по ссылке, или как это сделать на С. В харборе массивы и так передаются по ссылке.
Вопрос в том, как заполнить диапазон ячеек в Excel из массива

В книге Excel добавляю такой макрос:

Sub Макрос1()
'
Dim AStr(1 To 6) As String
AStr(1) = "1"
AStr(2) = "2"
AStr(3) = "3"
AStr(4) = "4"
AStr(5) = "5"
AStr(6) = "6"

Range("A1:C2").Value = AStr

Range("A1:C2").Select
End Sub

после его выполнения ячейки заполняются так:
1 2 3
1 2 3

Точно так же делает харбор через механизм OLE.
А как можно заполнить диапазон в fox ? Желательно, чтобы это можно было бы воспроизвести через VBA ?

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




Пост N: 5436
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 22:32. Заголовок: И у меня так же loc..


И у меня так же
 
local j:=1
local arr:={}

local oExcel := CreateObject( "Excel.Application" )
local oWorkBook := oExcel:WorkBooks:Add()
local oSheet := oExcel:ActiveSheet()
for j=1 to 100
aadd(arr,j)
next
oExcel:Visible := .t.
oSheet:Range(osheet:cells(1,1),osheet:cells(10,10)):Value:=arr




http://shot.qip.ru/00Pp9x-5Ha2NU8N7/

Спасибо: 0 
Профиль
Панченко





Пост N: 98
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 23:20. Заголовок: Pasha пишет: В харб..


Pasha пишет:

 цитата:
В харборе массивы и так передаются по ссылке.


Я выше уже писал, что фоксовский трюк работает только напрямую, без промежуточного присвоения адреса.
Вся разница в том, в терминах харбор @r - это число, а r - это имя переменной, хранящей адрес первого элемента массива. С интерпретацией этого значения в харборе вопросов не возникает. А при передаче в Excel желаемого эффекта не происходит. Поэтому я и хотел попробовать передать в Excel именно число.

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




Пост N: 5438
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 23:40. Заголовок: Панченко пишет: r -..


Панченко пишет:

 цитата:
r - это имя переменной, хранящей адрес первого элемента массива


Примерчик выше проверь .

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




Пост N: 5439
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 09:47. Заголовок: А вот такой макрос з..


А вот такой макрос заполнит столбец в диапазоне
 
Sub Macros1()

Dim a(1 To 10, 1 To 1)
For i = 1 To 10
a(i, 1) = i
Next
Worksheets("Лист1").Range(Cells(1, 1), Cells(10, 1)).Value = a

End Sub



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




Пост N: 5440
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 10:02. Заголовок: Фокус покус Sub Fi..


Фокус покус

 
Sub FillCellRect1()

Dim lngRows As Long, intCols As Integer

Dim lngRow As Long, intCol As Integer

Dim lngStep As Long, lngVal As Long

Dim alngValues() As Long

Dim rgRange As Range



lngVal = 1

lngStep = 1


lngRows = Val(InputBox("Количество ячеек в высоту"))

intCols = Val(InputBox("Количество ячеек в ширину"))

ReDim alngValues(1 To lngRows, 1 To intCols)

Set rgRange = ActiveCell.Range(Cells(1, 1), Cells(lngRows, intCols))

For lngRow = 1 To lngRows

For intCol = 1 To intCols

alngValues(lngRow, intCol) = lngVal

lngVal = lngVal + lngStep

Next intCol

Next lngRow

' Перенос значений из массива в таблицу

rgRange.Value = alngValues

End Sub




Сырец тут
http://www.studfiles.ru/preview/3568974/page:2/
Листинг 2.27.Заполнение диапазона

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




Пост N: 734
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.12.15 11:12. Заголовок: Dima пишет: rgRange..


Dima пишет:

 цитата:
rgRange.Value = alngValues


Дима, в VB это работает и полно примеров присвоения двумерного массива. Если это все перенести в Harbour
то не работает. Просто назначается всему диапазону первая строка массива

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




Пост N: 5441
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 11:21. Заголовок: Haz Да , пытался пр..


Haz
Да , пытался преобразовать в Harbour , не получилось

Спасибо: 0 
Профиль
Панченко





Пост N: 99
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 27.12.15 12:13. Заголовок: Панченко пишет: С и..


Панченко пишет:

 цитата:
С интерпретацией этого значения в харборе вопросов не возникает.


Тоже не совсем так. Имеем массив r := { 1, 2, 3, 4, 5 } и функции
function fun1( arr ) 
arr[ 5 ] := 9
return nil
function fun2( arr )
arr := { 7, 8, 9 }
return nil

Если fun1( r ) и fun1( @r ) дают одинаковый результат, то fun2( r ) и fun2( @r ) - разный. Несмотря на то, что
Pasha пишет:

 цитата:
В харборе массивы и так передаются по ссылке.




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




Пост N: 3385
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.12.15 20:48. Заголовок: По-видимому, причина..


По-видимому, причина того, что в харборе не работает заполнение диапазона ячеек, следующая:
Для типа VARIANT двумерный массив можно представить и как одномерный массив, каждый элемент которого является массивом, и как двумерный вариантный массив.
Харбор, что естественно, использует первый вариант. А для заполнения диапазона ячеек нужен второй вариант. Вот в харборе заполнение и не работает.

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




Пост N: 3386
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.12.15 20:54. Заголовок: Панченко пишет: Тож..


Панченко пишет:

 цитата:
Тоже не совсем так. Имеем массив r := { 1, 2, 3, 4, 5 } и функции

function fun1( arr )
arr[ 5 ] := 9
return nil
function fun2( arr )
arr := { 7, 8, 9 }
return nil


Если fun1( r ) и fun1( @r ) дают одинаковый результат, то fun2( r ) и fun2( @r ) - разный. Несмотря на то, что
Pasha пишет:

цитата:
В харборе массивы и так передаются по ссылке.





В харборе массивы передаются всегда по ссылке. Благодаря этому функция, которая получает массив в качестве параметра, может изменять значение массива, а так же изменять его размерность.
Когда в такой функции выполняется присвоение вида:

arr := {...}

первоначальный массив arr уничтожается, вернее, уменьшается на единицу счетчик его использования, и, если он будет равен нулю, при последующей сборке мусора эти элементы будут уничтожены.
А переменной arr присваивается новый массив.
Если же переменная arr передана функции по ссылке: как @arr, то вызывающей функции будет доступен новый массив.

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




Пост N: 5442
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 21:17. Заголовок: Pasha пишет: Вот в..


Pasha пишет:

 цитата:
Вот в харборе заполнение и не работает.


В принципе есть костыль для этого (идея не моя).
Массив "правильно" сложить в буффер обмена а затем сделать вставку в Excel.

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




Пост N: 735
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.12.15 22:41. Заголовок: Dima пишет: есть ко..


Dima пишет:

 цитата:
есть костыль


Этот костыль успешно прижился в методе :Excel() из класса TsBrowse в Minigui

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




Пост N: 3387
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 07:58. Заголовок: Причем формат буфера..


Причем формат буфера обмена там предельно простой: разделитель столбцов по строке - табуляция Chr(9), а разделитель строк - Chr(13). Надо попробовать у себя такой вариант. Все-таки будет быстрее работать, причем гораздо. Правда, при этом теряется информация о типе ячеек - все вставляется как строки. Но такая информация не очень - то и нужна, Excel сам преобразовывает типы данных.
Правда, иногда так преобразовывает, что лучше бы не преобразовывал. Но это уже другой вопрос.

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




Пост N: 736
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.12.15 10:45. Заголовок: Pasha пишет: Надо п..


Pasha пишет:

 цитата:
Надо попробовать у себя такой вариант.


Пробовал , работает и быстрее,
Pasha пишет:

 цитата:
Правда, при этом теряется информация о типе ячеек - все вставляется как строки.


Да, так и есть. Если не доверять Excel самостоятельно определить тип - то можно перед вставкой задать тип на все колонки через ОЛЮ
 
Пример для колонки 1
oSheet:Columns(1):Set( "NumberFormat", "(# ##0,00)" )


В догонку:
Вставка из буфера обмена производится в выделенный диапазон.
К примеру для массива 10 х 10
Можно использовать Range:
 
oSheet:Range( osheet:cells(1,1),osheet:cells(10,10) ):Select()
oSheet:Paste()

Можно ресайсить ячейку
 
oSheet:Cells(1,1):Resize(10,10):Select()
oSheet:Paste()

Результат будет одинаков







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




Пост N: 3388
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 13:22. Заголовок: Excel иногда преподн..


Excel иногда преподносит сюрпризы. Скажем, обычная строка вида 03/07 или 07/13 неожиданно становится "03 июля" или "июль 2013"
Такой же фокус может случиться с числом. Причем фокус-покус происходит, если просто вводить такие данные с клавиатуры.
И отключить автоматическое преобразование типов в Excel никак нельзя.

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




Пост N: 737
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.12.15 13:43. Заголовок: Pasha пишет: И откл..


Pasha пишет:

 цитата:
И отключить автоматическое преобразование типов в Excel никак нельзя.


Паша, можно перед записью в ячейку указать формат. Можно указать формат всей строки, всей колонки , любого диапазона ячеек или одной ячейки
Если попытаться через ОЛЮ записать в ячейку (1:1) строку вида вида 03/07 то Excel преобразует ее к дате и получим бред "03 июля"
т.е. простое oSheet:Cells(1,1):Value := "03/07" выдаст "03 июля"
Если перед записью указать формат
oSheet:Columns(1):Set( "NumberFormat", "@" ) // Вся первая колонка листа назначается символьного формата
oSheet:Cells(1,1):Value := "03/07" выдаст правильную строку в ячейке "03/07"
все это справедливо и с цифрами.

Аналогично и при вводе с клавиатуры , если задать формат ДО ввода - автопреобразования не происходит




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




Пост N: 3389
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 14:10. Заголовок: Паша, можно перед за..



 цитата:
Паша, можно перед записью в ячейку указать формат



Конечно, так и поступаю. По другому никак.

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




Пост N: 3390
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.12.15 13:17. Заголовок: Нашел я в коде это м..


Нашел я в коде это место:

Строки 712-720 из contrib\hbwin\olecore.c:

SAFEARRAYBOUND sabound[ 1 ];
HB_SIZE n, nLen;

nLen = hb_arrayLen( pItem );

sabound[ 0 ].lLbound = 0;
sabound[ 0 ].cElements = ( long ) nLen;

pSafeArray = SafeArrayCreate( VT_VARIANT, 1, sabound );

если заменить на что-то вроде:


SAFEARRAYBOUND sabound[ 2 ];
HB_SIZE n, nLen1, nLen2;

nLen1 = hb_arrayLen( pItem );
nLen2 = ...

sabound[ 0 ].lLbound = 0;
sabound[ 0 ].cElements = ( long ) nLen1;

sabound[ 1 ].lLbound = 0;
sabound[ 1 ].cElements = ( long ) nLen2;

pSafeArray = SafeArrayCreate( VT_VARIANT, 2, sabound );

и далее заменить присваивание, то будет создаваться двумерный вариантный массив.

Проблема в том, что в каких-то случаях нужен одномерный массив, а в каких-то - двумерный.


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




Пост N: 738
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 29.12.15 14:43. Заголовок: Pasha пишет: Пробле..


Pasha пишет:

 цитата:
Проблема в том, что в каких-то случаях нужен одномерный массив, а в каких-то - двумерный.


Паша, проблема в другом ...
на форуме, почти для всех ( для многих точно ) все что написано выше цитируемой строки это китайская грамота

PS. за упорство - спасибо. Будем хоть знать где это зло живет

Спасибо: 0 
Профиль
Панченко





Пост N: 100
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 29.12.15 18:59. Заголовок: Pasha Так, может бы..


Pasha
Так, может быть, имеет смысл оформить все это дело отдельной функцией?

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




Пост N: 739
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 29.12.15 20:01. Заголовок: Панченко пишет: Так..


Панченко пишет:

 цитата:
Так, может быть, имеет смысл оформить все это дело отдельной функцией?



Это пол OLE переписать

Спасибо: 0 
Профиль
Панченко





Пост N: 101
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 29.12.15 21:35. Заголовок: Haz пишет: Это пол ..


Haz пишет:

 цитата:
Это пол OLE переписать


Pasha пишет:

 цитата:
Строки 712-720


а остальное (как я понял) без изменений. Хотя не утверждаю, что прав. Если это большие трудозатраты, то действительно нет смысла. Будем продолжать работать через буфер обмена.

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




Пост N: 3391
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.12.15 10:32. Заголовок: Чтобы не плодить тем..


Чтобы не плодить темы, задам маленький вопрос здесь:

Open Office Calc

Берем ячейку по номеру строки и столбца
oCell := oSheet:getCellByPosition(nCol-1, nRow-1)

А как теперь выбрать эту ячейку ? Что-то подобное на метод Select() для Excel ?
Хочу затем вставить из буфера обмена фрагмент в данную ячейку.

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




Пост N: 5447
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.12.15 11:09. Заголовок: Паша а там макросы е..


Паша а там макросы есть в Open Office Calc ?
Можно с ним поиграться и посмотреть как выбрать ячейку.

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




Пост N: 740
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.12.15 11:21. Заголовок: Open Office Calc П..



 цитата:
Open Office Calc


Паша, а как в Excel не проходит ? у меня Open не установлен
oCell := oSheet:Cells( 10, 2)
oCell:Select()


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




Пост N: 3393
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.12.15 11:22. Заголовок: Да там макросы не то..


Да там макросы не той системы. Фактически в ОО есть 2 структуры объектов, и запись макросов не дает тот результат, как в экселе.

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




Пост N: 5448
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.12.15 11:32. Заголовок: Дернул в инете , не ..


Дернул в инете , не оно ?

//позиционируемся на ячейке
Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y);

//устанавливаем значение ячейки
rCell->setValue(val);

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




Пост N: 741
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.12.15 11:46. Заголовок: так работает ..


так работает


IF ( oServiceManager := win_oleCreateObject( "com.sun.star.ServiceManager" ) ) != NIL
oDesktop := oServiceManager:createInstance( "com.sun.star.frame.Desktop" )
oDoc := oDesktop:loadComponentFromURL( "private:factory/scalc", "_blank", 0, {} )

oSheet := oDoc:getSheets:getByIndex( 0 )

ControlCell := oSheet:getCellByPosition(5, 10)
oDoc:CurrentController:Select(ControlCell)


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




Пост N: 3394
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.12.15 11:47. Заголовок: Это метод для записи..


Это метод для записи в ячейку, а не для выбора

Вот нашел какой-то пример из Delphi, буду пробовать:

ControlCell := Sheet.getCellByPosition(j, i);
Document.CurrentController.Select(ControlCell);


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




Пост N: 3395
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.12.15 11:49. Заголовок: Haz Спасибо, похоже,..


Haz
Спасибо, похоже, это то, что нужно

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





Пост N: 483
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 02.01.16 12:11. Заголовок: Pasha пишет: И откл..


Pasha пишет:

 цитата:
И отключить автоматическое преобразование типов в Excel никак нельзя.


В Экселе всё можно.
Сначала для ПУСТЫХ ячеек задать формат. Например, "числовой". Дальше туда пишем что нужно.
Например, "07/03" по умолчанию дает у меня "07.мар", если ячейка перед этим была помечена как числовая - 2,33, если как текст - 07/03.

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





Пост N: 484
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 02.01.16 13:09. Заголовок: Панченко пишет: С ин..


Панченко пишет:
 цитата:
С интерпретацией этого значения в харборе вопросов не возникает.

Тоже не совсем так. Имеем массив r := { 1, 2, 3, 4, 5 } и функции
function fun1( arr )
arr[ 5 ] := 9
return nil
function fun2( arr )
arr := { 7, 8, 9 }
return nil

Если fun1( r ) и fun1( @r ) дают одинаковый результат, то fun2( r ) и fun2( @r ) - разный. Несмотря на то, что Pasha пишет:
В харборе массивы и так передаются по ссылке.


fun2(r) - передача оригинального массива в виде его адреса.
fun2(@r) - передача указателя на адрес оригинального массива.

Команда arr := {7, 8, 9} внутри функции меняет указатель (адрес) массива на новый. Если был переда адрес - вызывающий код не узнает об этом изменении. Если передать указатель на адрес - узнает.


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




Пост N: 5455
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.01.16 11:42. Заголовок: Имеем ячейку с общим..


Имеем ячейку с общим форматом EXCEL
Нужно сложить туда дату в формате DD.MM.YY , собственно так и ложу , но Ёксель преобразует
значение к формату DD.MM.YYYY.
Как не меняя формат ячейки сложить в нее значение в формате DD.MM.YY ?

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




Пост N: 3399
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.01.16 14:07. Заголовок: Наверное, только изм..


Наверное, только изменив региональные установки windows.
Я искал ответ на этот вопрос: как отключить автоматическое преобразование типов в экселе. Нашел ссылку на страницу ms, где было написано английским по белому: никак. Сейчас я конечно эту ссылку не найду. То есть, надо только прямо указывать формат ячейки.
Эксель умный, знает что надо делать лучше, чем мы.

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




Пост N: 5456
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.01.16 14:14. Заголовок: Pasha пишет: Эксель..


Pasha пишет:

 цитата:
Эксель умный, знает что надо делать лучше, чем мы.



Понятно
Просто я заполняю чужой бланк из Harbour и затем отсылаю его по почте из той же проги.
В нем я должен только заполнять данные , не меняя форматы ячеек.
Вероятно у получателя тоже есть автоматическая обработка бланка.
На свой страх и риск заменил Общий формат на Текстовый , надеюсь его прога не слетит

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





Пост N: 485
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 04.01.16 22:19. Заголовок: Dima пишет: Имеем я..


Dima пишет:

 цитата:
Имеем ячейку с общим форматом EXCEL
Нужно сложить туда дату в формате DD.MM.YY , собственно так и ложу , но Ёксель преобразует
значение к формату DD.MM.YYYY.
Как не меняя формат ячейки сложить в нее значение в формате DD.MM.YY ?

Dima пишет:

 цитата:
Просто я заполняю чужой бланк из Harbour и затем отсылаю его по почте из той же проги.
В нем я должен только заполнять данные , не меняя форматы ячеек.
Вероятно у получателя тоже есть автоматическая обработка бланка.
На свой страх и риск заменил Общий формат на Текстовый , надеюсь его прога не слети


В данном случае, на первый взгляд, ничего менять не нужно.
Дата - она в любом случае датой останется. Что в "общем" формате, что в "дате":



Чтобы получить такое отображение, нужно задать формат ячейки "ДД.ММ.ГГ" вместо "ДД.ММ.ГГГГ"
Неужели принимающая сторона сообщает об ошибках ?

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




Пост N: 5457
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.01.16 22:27. Заголовок: Sergy пишет: Неужел..


Sergy пишет:

 цитата:
Неужели принимающая сторона сообщает об ошибках ?


Пока нет , так как тестю :)
Что касаемо картинки ....проделывал уже такой эксперимент , результат выше описал.

PS
Оффис 2003

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