BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Работа с Excel файлом из БЭСТ, Выгрузка данны в УЖЕ существуюий Excel файл.
 
Входные данные:
Excel файл с тремя страничками и макросом.

Очень требуется посредством БЭСТ открыть этот Excel файл и выгрузить на страничку "Данные" наши данные из БЭСТ.

Вопросы:
1. Как открыть файл созданным процесоом Excel'я ?
Цитата

oApp := oleCreateObject( "Excel.Application" )


(или хотя бы где и что почитать?)

2. Как выгрузить данные на страничку "данные"?
Изменено: Саак Шахламджян - 01.12.2010 09:45:20
 
Код
oWorkBook:=oApp:WorkBooks:Open(cFile)
oAS:=oWorkBook:Worksheets(1)
oAS:Activate()


А дальше подглядывая в макросы пишем все что нам надо...
 
Читать надо описание Visual Basic в еxcel, только помнить что мы командами пользоваться не можем, а только методами...
 
Ещё Вопрос по теме.
БЭСТ 4+ sp65
Хотел выходную форму в Excel украсить немного, а именно зафиксировать часть таблицы с заголовком.
вот такой код
Код
   N:=AllTrim(Str(6+Len(cMngr)))
  oAS:Rows(N+":"+N):Select()
  oApp:ActiveWindow:FreezePanes := .T.

долго думает и выпадает ошибка на строке
Код
  oAS:Rows(N+":"+N):Select()



может подскажете что нибудь.
очевидно метод select() как то затыкается.
 
Подобную конструкцию
Код
 oAS:Rows("7:7"):Select()
  oApp:ActiveWindow:FreezePanes := .T. 

пробовал в АРМ гл. бух все работает нормально, а вот в товарах никак, такая странность?
 
oAS:Rows("7:7"):Select()
ROWS(7:7) ???? Вы ничего не путаете ?
Rows(7) причем 7 - числовой параметр

Есть лог скрипта из макроса в Excel ?
Опубликуйте его плз
 
Странная штука
на пробу написал такой текст
Код
Function uOutExcel()
 Local oApp,oWorkBook,oRange,oAS
 Local  N, I, R:=1, C
 AltD()
 TRY
 oApp := CreateObject( "Excel.Application" ) //попытка создать объект Excel
 CATCH
 Alert("Excel не доступен!")
 Return
 END
 AltD()
oWorkBook:=oApp:WorkBooks:Add() 
oAS:=oWorkBook:Worksheets():Add()
oAS:Name:=OemToAnsi("Кредиторы")
oApp:visible:=.T. 
C:=1
oAS:Cells(R,C):NumberFormat := "@" 
oAS:Cells(R,C):value:=OemToAnsi("Всего")
C:=2
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi("<0")
oAS:Cells(R+1,C):value:=C*100
R:=R+1
For I=1 To 20
 R := R+1
 C:=1
 oAS:Cells(R,C):NumberFormat := "@"
 oAS:Cells(R,C):value:=OemToAnsi('Привет'+ Str(R,5,2))
 C:=2
 oAS:Cells(R,C):value:=R
 oAS:Cells(R,C):Select()
Next
N:='2'
//oAS:Rows(N):Select()
oAS:Rows(N+":"+N):Select()
oApp:ActiveWindow:FreezePanes := .T.
//oApp:visible:=.T. //отобразить Excel
Return 2

в товарах работает отлично. функция select() работает.

беру этот код и вставляю в свою программу, у меня эта функция вызывается по F5
Код
#Include "inkey.ch"
Function uTest
 Local AN,D1,D2, D3:= Date(), C :={}, AG:={}, N, I,J,K,Ot:=0, aName, aMng, aShifr, nNomer
 Local M1:=.F., A1 := .F., P1 := .F., fAll:=.t.,nAll:='',U, M2
 Local aSet, aSetKey, bScr, aLastDate, Porog:=0.00,tMng
 Local aS1:=0, aS2:=0, aS3:=0, aS4:=0, aS5:=0, aS6:=0
 Private  C1:=0, C5:=5, C15:=10, C30:=30 // C1-C30 Время просрочки
 Private  S0:=0,S1:=0,S5:=0, S15:=0,S30:=0, S31:=0 // Суммы кредиторки S0- общаяб S1 - до C1 и т.д.
 Private  SP1:=0,SP15:=0,SP30:=0, SP31:=0 // Процент дебеторки S0- общаяб S1 - до C1 и т.д.
 Private _numrec:=1, hnRowAct,rnRowAct ,cMngr:={}, uUser:='', nUser:=''
 Private  aJurist:={'31'}, aEcon:={'52','111'}, aNach:={'46','150'}
 Private dScrInit,dHeads, Mened:='Все'+Space(29), dRef:={'sm',}, dRow:=10, dCol:=15, dPict:={'@S20'}, cDate:=Date()// cDate -  дата расчета
   bScr:=SaveScreen()
   aSet:=SAVESET()
   aSetKey:=SaveSetKey()
   SetKey(K_F5,{||uOutExcel()})
   SetKey(K_F6,{||uPrim()})
   SetKey(K_F9,{||uDet()})
   SetLastKey(0)
   DBPUSH('MPRIM','MPrim')
   DBPUSH('PARTNER','CODE')
   DBPUSH('MDOC','MDOC',,{'UPPER(Sclad+Vid+Type+CodeDoc)','00000221001'})
   MPrim->(OrdSetFocus('Prim_Mng'))
...
     Do While INIT1(.T.).And.INIT2(.T.)
     EndDo
...
Return .T.


у меня там два инитлиста, так вот затыкается на первом же
Код
 oAS:Cells(R,C):Select()


и ещё забавный факт функция View() тоже не работает просто игнорируется.
может хитрость какая есть?
 
Интересный эффент, Harbour случайно не требует Forward определений функций?
Заработало но при 1 условии, дело в том, что моя функция
Код
Function uOutExcel()
была объявлена где-то в хвосте программы, у меня их около 2х десятков. Я перенес ее в начало сразу за основной функцией и все заработало как надо. Вот как это объяснить не знаю.
 
Сергей, что за задачу решаете? Если не секрет.
С уважением,
Ильин Евгений
 
Цитата
Сергей Иваницкий пишет:
у меня там два инитлиста, так вот затыкается на первом же
Код
oAS:Cells(R,C):Select()


и ещё забавный факт функция View() тоже не работает просто игнорируется.
может хитрость какая есть?


Надо с отладчиком идти и на логи смотреть.
Думаю что скорее связано с тем что каие-то переменные надо по-другому определять
Цитата
Сергей Иваницкий пишет:
была объявлена где-то в хвосте программы, у меня их около 2х десятков. Я перенес ее в начало сразу за основной функцией и все заработало как надо. Вот как это объяснить не знаю.

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

Вы отладчиком пользуетесь ?
можете четко указать на строку где сваливается ?
 
да не секрет, управление кредиторской задолженностью.
вот ещё Вопрос.
хотел погруппировать строчки
Код
       oAS:Rows(AllTrim(Str(R0))+":"+AllTrim(Str( R ))):Select()
       oAS:Selection:Rows():Group()

на операторе
Код
       oAS:Selection:Rows():Group() 

выпадает ошибка.

Excel сгенерировал такой код
Код
    Rows("4:7").Select
    Selection.Rows.Group
    ActiveSheet.Outline.ShowLevels RowLevels:=1

может я что-то не так делаю?
 
Вот такая конструкция заработала
Код
 oAS:Rows(AllTrim(Str(R0))+":"+AllTrim(Str(R))):Group() // группировка
...
 oAS:Outline:ShowLevels(1) // свертывает все групы
 
Проморгал сообщение Константина, да отладчиком пользуюсь, а вот на счет логов не не очень понимаю на что смотреть. вылетало на функции
Код
 oAS:Rows(N+":"+N):Select()

а вот функция View() просто игнорируется ничего не происходит. хотя переданный массив не пустой.
Программа достаточно длинная, прикреплю следующим постом, кстати сегодня специально поместил мою функцию вывода в Excel в середину программы. Ошибка с select() повторилась,прошёл отладчиком но на строке
Код
  oAS:Rows(N+":"+N):Select() 
программа задумалась секунд на 10 и выпала в ошибку смотри пост #4, лог которой можно прочитать если нажать на ссылку, поискал лог БЭСТа и не нашёл.
Работает моя функция только когда стоит второй или третьей, если ставлю дальше выпадает ошибка.
Алгоритм программы такой сначала отбираются нужные шифры партнеров в массив, потом на основании его проходит проверка на предмет КЗ и когда она возникла, далее все записывается в 2 БД собственно поставщики которым мы задолжали и предыстория. вот и все, по F5 можно вывести отчет об этом в Excel, куда просто переписываются строчки из БД + шапка с подвалом.
 
странно не вставляется, видно есть ограничения. Ужал до 845 строк но все равно не вставляется.
 
По частям тоже не лезет, а функции дробить не хочу.
 
Моя программа не причем, написал вот такой код:
Код
Function uExcel()
 uOutExcel()
 Return
...
// строка 330
Function uOutExcel()
 Local oApp,oWorkBook,oRange,oAS
 Local  N, I, R:=1, C
 AltD()
 TRY
 oApp := CreateObject( "Excel.Application" ) //попытка создать объект Excel
 CATCH
 Alert("Excel не доступен!")
 Return
 END
AltD()
oWorkBook:=oApp:WorkBooks:Add()
oAS:=oWorkBook:Worksheets():Add()
oAS:Name:=OemToAnsi("Кредиторы")
oApp:visible:=.T.
C:=1
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi("Всего")
C:=2
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi("<0")
oAS:Cells(R+1,C):value:=C*100
R:=R+1
For I=1 To 20
 R := R+1
 C:=1
 oAS:Cells(R,C):NumberFormat := "@"
 oAS:Cells(R,C):value:=OemToAnsi('Привет'+ Str(R,5,2))
 C:=2
 oAS:Cells(R,C):value:=R
 oAS:Cells(R,C):Select()
Next
N:='2'
oAS:Rows(N+":"+N):Select()
oApp:ActiveWindow:FreezePanes := .T.
Return 2

Там где стоят точки заполнил описанием разных функций которые и вызывать то не собирался, надергал из разных своих программ, так вот когда до описания Function uOutExcel()
оказалось примерно 330 строк кода ошибка начала проявляться на строке oAS:Cells(R,C):Select(), а когда было 310 строк работало все нормально. Это что-то встроенный компилято мутит. ИМХО
 
Цитата
Сергей Иваницкий пишет:
Это что-то встроенный компилято мутит. ИМХО


Компилятор попрошу не обижать :surprise:
Между прочим ошибки которые выдаются - это ошибки которые нам возвращает сам Excel.
Копилятор полученный текст ошибки выводит в своем окне, потому и наблюдается
в сообщении расхождении в кодовой странице.
Чтобы его прочитать я его с экрана копирую, вставлю в текст в FAR и переключаю кодовую
страницу в редаrторе FAR.
Т.е. эту ошибку на выполнение дает Excel и то, что Excel глючит и в разных версиях
работает позразному с VBA-кодом это надо принимать как данность и искать другие пути решения.

Пишу Вам еще раз
У Вас не будет работать rows("7:7") - ЭТО ОШИБКА.
Надо писать rows(7)
Числовой параметр !!! А у Вас там какие-то кавычки внутри - нет конечно !

Цитата
Сергей Иваницкий пишет:
Работает моя функция только когда стоит второй или третьей, если ставлю дальше выпадает ошибка.

ПРишлите мне весь prg на почту когда функцию ставите третьей - уверен на 100% ошибка в Вашем коде.

Цитата
Сергей Иваницкий пишет:
оказалось примерно 330 строк кода ошибка начала проявляться на строке oAS:Cells(R,C):Select(),

Есть основание полагать, что у вас расходится исходник с откомпилированной версией и курсор дает ошибку на нормальной строке.
КОгда происходит ошибка системная и слетает БЭСТ создается лог файл а также есть лог на экране во время сбоя, который можно снять копией экрана.
Если ошибка из Excel - ее надо прочитать и будет понятно.
 
Константин пишет:
Цитата
Пишу Вам еще раз
У Вас не будет работать rows("7:7") - ЭТО ОШИБКА.
Надо писать rows(7)
Числовой параметр !!! А у Вас там какие-то кавычки внутри - нет конечно !

а вот что генерирует Excel
Цитата
Rows("6:6").Select
ActiveWindow.FreezePanes = True

как видите параметр строковый, но дело не в этом.
 
Номер строки не причём - вот откомпилируйте эту программку.
Код
Function uExcel()
 uOutExcel()
 Return

Function uLastRaz()
 Local R, R1, M1:=.F.
 If Select("Main01")=0
 // Главная книга
   Netuse("Main01",LoadPath() + "Main.dbf")
   M1 := .T.
 Else
   DBPush()
   Main01->(SetScope())
 EndIf
 Main01->(OrdSetFocus("KT_SCHET"))
 Main01->(SetScope("UPPER(KT_SCHET+KT_CODE)",Upper('511')))
 Main01->(DbGoBottom())
 Iif( Empty(Main01->DataOper),R := Date()-1,R := Main01->DataOper)
 Main01->(SetScope("UPPER(KT_SCHET+KT_CODE)",Upper('512')))
 Main01->(DbGoBottom())
 Iif( Empty(Main01->DataOper),R1 := Date()-1,R1 := Main01->DataOper)
 Iif(DtoS(R)<=DtoS(R1),R := R1,)
 Main01->(SetScope())
 Iif(M1,Main01->(DbCloseArea()),DBPop())
 Return R


Function uOutExcel()
 Local oApp,oWorkBook,oRange,oAS
 Local  N, I, R:=1, C
 AltD()
 TRY
 oApp := CreateObject( "Excel.Application" ) //попытка создать объект Excel
 CATCH
 Alert("Excel не доступен!")
 Return
 END
AltD()
oWorkBook:=oApp:WorkBooks:Add()
oAS:=oWorkBook:Worksheets():Add()
oAS:Name:=OemToAnsi("Кредиторы")
oApp:visible:=.T.
R:=5
For I=1 To 20
 R := R+1
 C:=1
 oAS:Cells(R,C):NumberFormat := "@"
 oAS:Cells(R,C):value:=OemToAnsi('Привет'+ Str(R,5,2))
 C:=2
 oAS:Cells(R,C):value:=R*10
 oAS:Cells(R,C):Select()
Next
oAS:Rows("7:7"):Select()
oApp:ActiveWindow:FreezePanes := .T.
Return 2

Если поменять местами Function uOutExcel() и Function uLastRaz() то все заработает,
или можно закомменитровать оператор в
Код
 If Select("Main01")=0
на
 If .T. //Select("Main01")=0
Function uLastRaz()
хотя эта функция даже не используется.
Попробуйте или это у меня только такой глюк.
 
Цитата
Сергей Иваницкий пишет:
а вот что генерирует Excel
Цитата
Rows("6:6").Select
ActiveWindow.FreezePanes = True

как видите параметр строковый, но дело не в этом.

дело в этом.
В БЭСТе будет работать числовой параметр.
Гоняться за каждой версией Excel дело неблагодарное
Код
      IF nRow>nRow0
         oAS:Rows(nRow-1):Insert(xlDown)
         oAS:Rows(nRow):Copy(oAS:Rows(nRow-1))
      ENDIF

Вот такой код в БЭСТ-4+ работает всегда. Поставьте числовой параметр таки.
 
Константин мы с вами говорим на разных языках.
я пишу вовсе не о том, что у меня там числовой или текстовый параметр, а про то, что не работает функция Excel Select()
Я хотел зафиксировать часть верхних строк для этого пишу
Код
Rows(6).Select
ActiveWindow.FreezePanes = True 

Ну исправил я на числовой параметр, а толку нет.
если вы читали пост #19 то там еще встречается такая конструкция

Код
oAS:Cells(R,C):Select()

R и C числовые параметры результат тотже на функции Select() вылетает.

Как я понял это как-то связано с функцией Select() самого Harbour. так как я её использовал несколькими сторками ранее и либо я её не правильно использую либо глюк.
 
Цитата
Сергей Иваницкий пишет:
функцией Select() самого Harbour

Да нет в харборе таких функций :lol:
Есть скрипт VBS.
А функции это продукт особенностей скрипта. Функции на самом деле не харбора а Excel.
И ошибки дает не харбор а Excel. Просто мелкомягкие не поддерживают толком в VBS
даже две соседние версии. И если на Вашем компе все заработает, не факт что это
будет работать в другом Excel также на другом компьютере - к этому Вы должны быть
морально готовы. Я в свое время этого уже очень даже наелся...
Excel все свои команды на самом деле переводит в функции, только в каждой версии
этого Excel бывает по разному.
Посмотрел у себя, например.
У меня Сells(r,c):SELECT() работают.
Но самое лучшее в экселе, самое универсальное всегда было применение RANGE.

Сергей сейчас нагрузка большая, очень оперативно не могу посмотреть Ваш Вопрос, но обязательно проверю.
 
Цитата
Константин пишет
Да нет в харборе таких функций

ну может не харбор, может ещё клиппер...
открываем файл news\develop\ng\weg.exe
и там написано:
Цитата

Синтаксис
SELECT([<алиас>]) --> номер рабочей области
...
SELECT() является функцией работы с базами данных, которая определяет
номер рабочей области по заданному алиасу. Возвращаемое число может
быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан,
возвращается номер текущей (активной) рабочей области. Если значение
аргумента <алиас> задано, но такого алиаса не существует, SELECT()
возвращает ноль.

Так вот если я использую её раньше(по тексту программы), чем функцию Excel с таким же именем, то Excel на соответствующей строке вылетает, а если не использую или использую после(по тексту), то все описанные мной конструкции у меня работают с теми версиями Excel которые у меня есть это XP(2002), и 2007.
Попробовал и
Код
oRange:=oAS:Range("8:8")
oRange:Select()
oApp:ActiveWindow:FreezePanes := .T.

результат тот-же.

А вы пробовали запустить то что написано в посте #19 как есть, напомню БЭСТ4+ арм товары.
Тут либо я не правильно что-то использую, либо глюк(особенность), и это надо просто в будущем учитывать и всё. Ну хоть у кого-нибудь такой эффект проявился? Или я один такой?
В смысле некогда, понимаю, спасибо за Внимание , не тороплю. И вообще всех с наступающим НОВЫМ ГОДОМ!
 
Цитата
Сергей Иваницкий пишет:
ну может не харбор, может ещё клиппер...
открываем файл news\develop\ng\weg.exe
и там написано:
Цитата

Синтаксис
SELECT([<алиас>]) --> номер рабочей области
...
SELECT() является функцией работы с базами данных, которая определяет
номер рабочей области по заданному алиасу. Возвращаемое число может
быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан,
возвращается номер текущей (активной) рабочей области. Если значение
аргумента <алиас> задано, но такого алиаса не существует, SELECT()
возвращает ноль.


Повеселили :lol:
Данная функция имеет отношение к работе с алиасом и никакого отношения к скрипту VBS не имеет. Другими словами "Это нога - у кого надо нога !!!..."
Сергей примите как данность - то, над чем Вы сейчас трудитесь не в харборе искать надо.
Другое дело надо Вам помочь найти путь решения. Пока ну очень занят - простите пожалуйста, но Ваш Вопрос держу на контроле для себя лично.
Цитата
Сергей Иваницкий пишет:
XP(2002),


Вот это самая страшная версия Офиса.
Мы заметили что в ней даже штатные в БЭСТе отчеты по шаблонам ни к каим другим версиям не подходят. Честно говоря офис 2002 я клиента прошу сразу сносить.
Цитата
Сергей Иваницкий пишет:
oRange:=oAS:Range("8:8")
oRange:Select()
oApp:ActiveWindow:FreezePanes := .T.


результат тот-же.

Вы не правильно написали RANGE
Попробуйте например
oAs:Range("A8"):Select()


Сергей я уже давно понял что мне надо самому посидеть повозиться чтобы Вам помочь, пока время не выбрал. Простите что вот такие советы "поробуй то, попробуй это выдаю..."
Это пока все, что могу
 
Цитата
Константин пишет
Данная функция имеет отношение к работе с алиасом и никакого отношения к скрипту VBS не имеет. Другими словами "Это нога - у кого надо нога !!!..."
Я прекрасно понимаю, что это к VBS отношения иметь не должно, однако проявляется именно так как я пишу. Ппоробую скомпилировать на компе где 2007 Office установлен.
Цитата
oRange:=oAS:Range("8:8")
у меня вполне себе отработал, мне ведь надо целую стоку выделить.
Цитата
Сергей я уже давно понял что мне надо самому посидеть повозиться чтобы Вам помочь, пока время не выбрал. Простите что вот такие советы "поробуй то, попробуй это выдаю..."
Это пока все, что могу
да обычно хватало вполне.
Страницы: 1 2 След.
Читают тему (гостей: 1)