Форум » [x]Harbour » Нужен конвертер DBF в XLS » Ответить

Нужен конвертер DBF в XLS

Oskar_Aa: Добрый день, нужен конвертер формата DBF (консольный xHarbour) в формат XLS, с перекодировкой из 866 в 1251 Спасибо...

Ответов - 105, стр: 1 2 3 4 5 6 All

Dima: Excel и так чудно понимает DBF формат

Oskar_Aa: Dima, Excel понимает, но проблема в том, что есть файл XLS в нем куча (30) листов, и 53 DBF файла-источника. При открытии XLS файла - запрос "обновить" и Если файлы источники в формате DBF то нужно Каждый файл DBF руками открывать - Грустно Если файлы источники в формате XLS - Excel Чудненько Все Сам Делает (Обновляет данные). Спасибо...

Pasha: Файл dbf можно просто открыть экселем, и затем сохранить его как xls Если это надо сделать программно - то с помощью TOleAuto


Oskar_Aa: Можно ли получить пример... xHarbour версия xHarbour Compiler build 1.0.0 (SimpLex) консольный вариант программы

Oskar_Aa: Можно ли получить пример... xHarbour версия xHarbour Compiler build 1.0.0 (SimpLex) консольный вариант программы

Pasha: Примерно так: oExcel := TOleAuto():New( "Excel.Application" ) cFile := '....dbf' oExcel:Workbooks:Open( cFile ) oExcel:Visible := .T. oSheet := oExcel:ActiveSheet oSheet:SaveAs('file.xls', 39)

Oskar_Aa: Ok, попробую...

Oskar_Aa: Dima, спасибо. Работает, как сделать обработку (конвертацию без активизации Excel). Обработка в фоновом режиме....

Pasha: У класса TSBrowse есть метод Excel2. Он как раз побайтно формирует файл xls. Этот класс есть, кажется, в поставке minigui

Oskar_Aa: Pasha, извени, что обращался к Dime... В строке oExcel:Visible := .Т. заменил на .F. результат Excel не активируется - то ЧТО Нужно, но файл XLS получается в режиме Read Only, в отдельных случаях тоже пойдет. с классом TSBROWSE метод Excel2 не разбирался... Пока нет времени. Спасибо.

Oskar_Aa: Где-то был момент по закрытию Excel... Pasha подскажи как де активировать (закрыть) Excel в процессах. oExcel := TOleAuto():New( "Excel.Application" ) cFile := Text_Dbf2 oExcel:Workbooks:Open( cFile ) oExcel:Visible := .F. oSheet := oExcel:ActiveSheet oSheet:SaveAs(Text_Xls2, 39)

Oskar_Aa: Поставил oExcel:Quit() - нормально.... Спасибо

Andrey: Есть DBF-база 80 тыс. записей. Нужно сделать из базы (взять часть полей) XLS-файл типа такого: Увеличить Сделал через Ole Excel - долго, минут 10-15 делается. Как бы побыстрей это сделать ? И еще до конца не просчитывает зараза, выдает в trace.log ошибку: TOleAuto Error 80010001 - и что это означает ?

SADSTAR4: Может сначала сделать что-то типа CSV-файла с выбранными данными а потом засосать его в Эксел

petr707: Excel имеет ограничение по числу строк, для версий ниже Excel 2007 - 64 или 32 тысячи строк. Возможно,проблема в этом.

gustow: Загуглил на "Excel error 80010001" - в частности, выдало ссылку и сюда: Перевод ошибок автоматизации (http://support.microsoft.com/kb/186063/ru). Может быть, поможет? А, скорее всего, это из-за ограничения Excel'а, про которое написал выше petr707 (сам я тоже как-то поубивался над длинной выборкой в Excel 2003 - вылетало, зараза, и все... оказалось - именно это). Андрей, а может выводить напрямую в BIF-файл? как здесь давненько обсуждалось

Andrey: gustow пишет: а может выводить напрямую в BIF-файл? А еще есть вариант сделать отчет в FastReport, а потом его экспортировать в BIF файл ! А что буржуи делают, может кто знает ?

Pasha: В классе TSBrowse из fivewin/minigui есть метод Excel2, который формирует файл xls, записывая двоичные данные. Его можно использовать, заменив источник информации: вместо колонок обьекта использовать поля файла. Это очень быстрый способ формирования xls

Oskar_AAA: Добрый день. Теперь поставлена задача: данные из файла(ов) DBF (количество записей разное) закинуть в файл XLS, имеющий кучу листов (10 - 15), с шапками и формтами ячеек....? Смотрел сообщения Gustow и Andrey, что-то не получается у меня. Октрываю два файла XLS источник и приемник, далее: 1. перейти на НУЖНЫЙ лист файла приеника 2. Скопировать данные из файла DBF/XLS (пример Gustow - "нумерация страниц excel") 3. Сформатировать лист файла приеника c Excel - грустно.. Вопросы: Как активировать Нужный лист в Нужной книге? Переход между книгами? Как форматироваь ячейки (формат, рамки, шрифт, фон итд)? Вариант, которым пользовался раньше (пакетная выгрузка в файлы DBF->конветация DBF to XLS->Загрузка Отчета(XLS) в котром просто ссылки на файл(ы) источник(и) ...) А Теперь переменное количество строк + форматирование (объединение ячеек по условию), + выделение цветом итд, + рамки.... Использую: Office 2010 & xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476)

Andrey: Oskar_AAA пишет: c Excel - грустно.. Согласен полностью. Его можно использовать как простой показ небольших отчетов. Но если ты гуру в Ехеле, то конечно можно делать все... Переходи на FastReport и проблемы пропадут....

SADSTAR4: Элементарные операции. Копия из текста одной утилиты. Начало работы [pre2] // oExcel := TOleAuto():New( "Excel.Application" ) oBook:=oExcel:WorkBooks:Add() //новая пустая книга //подогнать количество листов под количестко точек измерения k:=oBook:Sheets:Count //количество листов в новой книге do while (oBook:Sheets:Count)<len(aTmp) //листов меньше чем точек измерения - добавить oBook:Sheets:Add() enddo [/pre2] Если нужно - добавляй еще новые книги - oBook1, oBook2, ... ---------- заполнение и форматирование ячеек [pre2] Row1:=3 //начало таблицы for mpi:=1 to len(aTmp) //пойти по точкам измерения oSheet:=oBook:Worksheets(mpi) //выбрать лист номер mpi oSheet:name:=aTmp[mpi] //имя листа изменить //рисуем "шкалу часов" oSheet:Cells( Row1, 1 ):Value:="час суток" oSheet:Cells( Row1, 1 ):set('WrapText',.t.) oSheet:Cells( Row1, 1 ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1 ):Value:=i //oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble next //рисуем данные for i:=1 to len(aRes) //перебрать даты oSheet:Cells( Row1, 1+i ):Value:=aRes[i,1] //дата oSheet:Cells( Row1, 1+i ):Set( "VerticalAlignment", xlCenter) oSheet:Cells( Row1, 1+i ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+i ):Borders(xlEdgeBottom):Weight := xlMedium //найти ветку нужной точки измерения if (j:=aScan(aRes[ i ],{|x| x[1]=aTmp[mpi]}))=0 loop endif //значения за дату k:=1 do while k<=len(aRes[i,j,2]) if aRes[i,j,2,k,3]=2 //за час просуммированы два измерения oSheet:Cells( Row1+aRes[i,j,2,k,1], 1+i ):Value:=aRes[i,j,2,k,2] endif //oSheet:Cells( Row1+aRes[i,j,2,k,1], 1+i ):BorderAround( xlContinuous, xlThin) k++ enddo next //=СЧЁТ(RC[-10]:RC[-1]) //=СУММ(RC[-11]:RC[-2])/RC[-1] //написать формулы k:=len(aRes) oSheet:Cells( Row1, 1+k+1):Value:="колич. измерений" oSheet:Cells( Row1, 1+k+1):set('WrapText',.t.) oSheet:Cells( Row1, 1+k+1):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+k+1):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1+k+2):Value:="среднее потребление" oSheet:Cells( Row1, 1+k+2):set('WrapText',.t.) oSheet:Cells( Row1, 1+k+2):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1+k+2):Borders(xlEdgeBottom):Weight := xlMedium for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1+k+1):Formula:="=СЧЁТ(RC[-"+alltrim(str(k))+"]:RC[-1]" oSheet:Cells( Row1+i, 1+k+2):Formula:="=ОКРУГЛ(СУММ(RC[-"+alltrim(str(k+1))+"]:RC[-2])/RC[-1];0)" next //сумма по часам for i:=1 to 24 //часы суток //msgbox(valtype(aSum[ i ])) aSum[ i ]:=aSum[ i ]+oSheet:Cells( Row1+i, 1+k+2):Value next next //лист суммы oBook:Sheets:Add() oSheet:=oBook:Activesheet oSheet:name:="Итого" oSheet:Cells( Row1, 1 ):Value:="час суток" oSheet:Cells( Row1, 1 ):set('WrapText',.t.) oSheet:Cells( Row1, 1 ):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble oSheet:Cells( Row1, 2):Value:="среднее без вычета" oSheet:Cells( Row1, 2):set('WrapText',.t.) oSheet:Cells( Row1, 2):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 2):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1, 3):Value:="среднее с вычетом" oSheet:Cells( Row1, 3):set('WrapText',.t.) oSheet:Cells( Row1, 3):BorderAround( xlContinuous, xlThin) oSheet:Cells( Row1, 3):Borders(xlEdgeBottom):Weight := xlMedium n:=wMain.txt_Minus.Value //ежечасный вычет for i:=1 to 24 //часы суток oSheet:Cells( Row1+i, 1 ):Value:=i //oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeBottom):Weight := xlMedium oSheet:Cells( Row1+i, 1 ):Borders(xlEdgeRight):LineStyle := xlDouble oSheet:Cells( Row1+i, 2 ):Value:=aSum[ i ] oSheet:Cells( Row1+i, 3 ):Value:=aSum[ i ]-n next //msgbox("конец") oExcel:Visible := .T. [/pre2]

Oskar_AAA: Спасибо, за помощь.... С форматированием таблицы разобрался, на сегодня пойдет. Фрагмент кода oExcel :Visible := .F. oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // oSheet :=oBook:Worksheets(1) oAs :=oExcel:ActiveSheet() oExcel :Workbooks:Open(Dbf_file) // частный отчет (лист1), по которому проходит форматирование oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) nLenRecnoXls := oRange:Row nLenColumnXls := oRange:Column cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) oExcel:Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oAs:Columns(2):Font:Bold := .T. For J_Rec = 4 To cColumn-4 oAs:Columns(J_Rec):NumberFormat:= "# ##0,00;-0,00;" Next oAs:Columns(7):NumberFormat:= "0,0000;;" oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeTop):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeBottom):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeRight):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideVertical):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideHorizontal):LineStyle:= xlContinuous For I_Rec = 2 To cRecno I_Rec1:=I_Rec-1 If I_Rec1/Rc_OilKol-Int(I_Rec1/Rc_OilKol)==0 I_Rec2:=(Int(I_Rec1/Rc_OilKol)-1)*(Rc_OilKol+1)+2 I_Rec3:=Int(I_Rec1/Rc_OilKol)*(Rc_OilKol+1)+1 I_Rec4:=I_Rec3-1 * If I_Rec3<cRecno oAs:Rows(I_Rec3):Font:Bold:= .T. oAs:Rows(I_Rec3):Interior:ColorIndex = 6 oAs:Rows(I_Rec3):WrapText = .T. oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):Merge() oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):HorizontalAlignment := xlCenter oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):VerticalAlignment:= xlCenter * Endif Endif Next oAs:Cells(2,2):Select() oAs:SaveAs(Xls_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T. Теперь надо: 1. перейти в Общий файл (Main_File) на Конкретный Лист 2. Скопировать диапазон из Open_Dbf 3. Вставить на Конкретный Лист Main_File SADSTAR4: по коду oSheet:=oBook:Worksheets(1) вылетает ошибка Error BASE/1004 Class: 'NIL' has no exported method: WORKSHEETS Arguments: ( [ | |1] = Type: U [ 2] = Type: N Val: 1) Что в коде не так? PS. Думаю переделать алгоритм формирования отчета.... 1. Открыть сводный отчет (Main_File) 2. Перейти на Нужный Лист 3. Добавить в него данные из DBF 4. Сформатировать лист Переход на другой лист 3. Добавить в него данные из DBF 4. Сформатировать лист итд. Запись отчета Main_File Закрыть Excel.

SADSTAR4: Oskar_AAA пишет: SADSTAR4: по коду oSheet:=oBook:Worksheets(1) вылетает ошибка Если это в четвертой строке - я не вижу создания ранее объекта oBook

Oskar_AAA: SADSTAR4, да это 4 строка кода. Но там открывается Сводный (конечный) отчет, в котром куча листов, шапки итд. Мне нужно перейти на Лист N, допустим 1 или 3. Далее по тексту кода в Excel Открывается полученный в результате обработки файл формата DBF, проходит его форматирование итд. теперь скопировать текущий лист и далее вставить его в соответсвующий Лист Сводного отчета. Т.е. не надо создавать (добавлять) листы в существующие файлы Excel....

SADSTAR4: Если объект oBook не существует, то обращение к нему вызывает ошибку попробуй сделать так oBook:=oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // <-это не объект а число oSheet :=oBook:Worksheets(1) P.S. Что-то не пойму смысла этого кода cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) Числовое значение преобразовать в строку а затем опять в число?

Oskar_AAA: попробовал "oSheet :=oBook:Worksheets(1) " oBook:=oExcel :Workbooks:Open(Main_File) // сводный отчет XLS из 9 листов oKlSheet :=oExcel:Sheets:Count // количество листов книги - нормально oSheet :=oBook:Worksheets(1) Вылетает Ошибка Error BASE/1004 Class: 'NIL' has no exported method: WORKSHEETS Arguments: ( [ | 1] = Type: U [ 2] = Type: N Val: 1) PS. cRecno := Val(AllTrim(Str(nLenRecnoXls))) cColumn := Val(AllTrim(Str(nLenColumnXls))) - у меня "глаз замылился...." Остался только этот блок 1. "Выбрать данные из литса текущей книги" 2. "Перейти на другую книгу (сводный отчет)" 3. "Выбрать Нужный лист" 4. "Вставить данные из п.1" фрагмент кода oAs:SaveAs(Xls_Copy,Excel97_10) // запись файла DBF в формате XLS oAs:Cells(2,2):Select() // переход на ячеку oAs:Cells:Copy() // копирование oExcel :Workbooks:Open(Main_File) // открытие сводного отчета oKlSheet :=oExcel:Sheets:Count // подсчет количества листов oSheet :=oBook:Worksheets(1) // выбор листа oAs :=oExcel:ActiveSheet() // надо установить на нужную ячйеку (A5) oSheet:Paste() // вставить данные oAs:SaveAs(Main_File,Excel97_10) // запись сводного отчета oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T.

Pasha: Oskar_AAA пишет: попробовал "oSheet :=oBook:Worksheets(1) " Откуда взялся worksheets ? В лучших домах Европы и Филадельфии используют Sheets

Oskar_AAA: т.е. надо oSheet:=oBook:Sheets(1) - все равно ошибка |Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| | Type: U [ 2] = Type: N Val: 1)░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| Paha, подскажи как сделать.....

Pasha: Oskar_AAA пишет: Error BASE/1004 Class: 'NIL' has no exported method: SHETTS Arguments: ( [ 1] =| Просто очепятка. Надо Sheets

Oskar_AAA: Pasha, точно опечатка, исправил: oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oSheet:=oBook:Sheets(1) ОШИБКА base/1004 - все равно есть???? oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste()

Pasha: Oskar_AAA пишет: Pasha, точно опечатка, исправил: oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oSheet:=oBook:Sheets(1) ОШИБКА base/1004 - все равно есть???? oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() Семен Семеныч ! А переменную oBook создать надо ? oBook := oExcel:ActiveWorkBook

Oskar_AAA: Pasha, в этом я вообще не понимаю, спасибо за помощь.... oAs:SaveAs(Xls_Copy,Excel97_10) oAs:Cells(2,2):Select() oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(1) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() oAs:SaveAs(Xls_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel :Visible := .T. Вот такой код... сейчас ошибка на Paste() понятно, что нет COPY()....

Pasha: Oskar_AAA пишет: понятно, что нет COPY().... Дык надо сделать copy. То, что надо вставить - предварительно скопировать. Метод Copy применяется к объекту range

Oskar_AAA: Pasha, oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер

Pasha: Oskar_AAA пишет: oAs:Cells(2,2):Select() переход на ячей oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() или как Правильно написать??? т.е надо с ячейки 2.2 до Crecno - количество строк, cColumn - количество столбцов выбрать в буфер Так правильно написано.

Oskar_AAA: ошибок нет oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() далее переход на сводный отчет oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(1) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:oSheet:Paste() // ошибка |Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: OSHEET Arguments: | |()░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |Error at ...: TOLEAUTO:OSHEET(0) in Module: source\rtl\win32ole.prg░░░░░░░░░░░░░| |Called from : EXPORT_DAY1(414) in Module: COMM_003.prg░░░░░░░░░░░░░░░░░░░░░░░░░░| |Called from : EXPORT_DATA(383) in Module: MAIN_000.prg░░░░░░░░░░░░░░░░░░░░░░░░░░| |Called from : MAIN(213) in Module: MAIN_000.prg░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| Pasha???

Pasha: Oskar_AAA пишет: oAs:oSheet:Paste() // ошибка |Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: OSHEET Arguments: | Зачем Sheet.Sheet, да ? Масло масляное. Надо просто oAs:Paste() см.help к Excel vba Или просто запись макросов с их последующим просмотром на предмет изучения.

Oskar_AAA: Pasha, спасибо.... с одним Листом справился. Остается объем данных в буфере обмена и выделение вставленных ячеек, где-то на форуме были сообщения по этому поводу.... Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета

Pasha: Oskar_AAA пишет: Теперь надо организовать переход на другие DBF отчеты, там обработка и вставка на соответсвующие листы... в памяти уже загружен Excel файл сводный отчет. Допустим переход на Лист 2,3,4.... N Открытие следующего DBF файла - форматирование итд вставка на листе сводного отчета. /// /// в конеце - 1 раз запись Сводного Отчета Ну и.. в чем проблема ? В Sheets задать номер листа, выдать select на нужный дбф

Oskar_AAA: Pasha, можно я выложу исходники и задчау в личку?

Pasha: Тогда уж лучше на форуме опубликуйте, больше шансов, что кто-то посмотрит и подскажет

Oskar_AAA: „P„‚„y„r„u„„ „r„ѓ„u„}! „I„ѓ„‡„Ђ„t„~„Ќ„z „„„u„{„ѓ„„ „{„Ђ„t„p Export:={} Aadd(Export,{"Code_Uprav","C",4,0}) Aadd(Export,{"Name_Uprav","C",20,0}) Aadd(Export,{"Name_Oil","C",10,0}) Aadd(Export,{"Ostat_N_Lt","N",13,2}) Aadd(Export,{"Ostat_N_Kg","N",13,2}) Aadd(Export,{"Prixod_Lt","N",13,2}) Aadd(Export,{"Plotnost","N",13,4}) Aadd(Export,{"Prixod_Kg","N",13,2}) Aadd(Export,{"Rasxod_Lt","N",13,2}) Aadd(Export,{"Rasxod_Kg","N",13,2}) Aadd(Export,{"Ostat_K_Lt","N",13,2}) Aadd(Export,{"Ostat_K_Kg","N",13,2}) Aadd(Export,{"Cena","N",6,2}) Aadd(Export,{"Fakt_N_lt","N",13,2}) Aadd(Export,{"Fakt_N_Kg","N",13,2}) Aadd(Export,{"Fakt_K_Lt","N",13,2}) Aadd(Export,{"Fakt_K_Kg","N",13,2}) Aadd(Export,{"Vdm_Lt","N",13,2}) Aadd(Export,{"Krt_Lt","N",13,2}) Aadd(Export,{"Ala_Lt","N",13,2}) Aadd(Export,{"Fgr_Lt","N",13,2}) Aadd(Export,{"Pro_Lt","N",13,2}) Aadd(Export,{"Kassa","N",13,2}) Aadd(Export,{"Delta_1","N",13,2}) Aadd(Export,{"Delta_2","N",13,2}) Aadd(Export,{"Vdm_Kg","N",13,2}) Aadd(Export,{"Krt_Kg","N",13,2}) Aadd(Export,{"Ala_Kg","N",13,2}) Aadd(Export,{"Fgr_Kg","N",13,2}) Aadd(Export,{"Data1","D",12,0}) Aadd(Export,{"Data2","D",12,0}) Aadd(Export,{"Record","N",12,0}) Aadd(Export,{"Recoil","N",3,0}) File_Ex:='01_Table' Net_Use(200,(Mar4+File_Ex),'Ex_Dbf',1,1) Index On Code_Uprav To (Mar4+'01_Table.Cdx') Set Index To (Mar4+'01_Table.Cdx') Select OILTYPE Count To Rc_OilKol For Type_Oil==1 Select DATAGSM Set Relation To Code_Oil Into OILTYPE Set Relation To Code_Uprav Into OFFICE Additive Select OFFICE Count To Kol_Lc For Type_Uprav==1 Kolf_Ntx:=Kol_Lc Kolf_Prc:=0 Set Order To 1 Set Filter To Type_Uprav==1 DbGoTop() Do While !Eof() Rec_Off:=Recno() Kode_Uprav:=Code_Uprav Ip_Movet(Padr('Ѓh„I„„„Ђ„s„Ђ„r„Ќ„z „Ђ„„„‰„u„„ ЃN '+Code_Uprav,69),Dy_15) Day_Azs1() Select OFFICE Set Order To 1 Goto Rec_Off Skip Enddo Set Filter To Select EX_DBF Pack Rc_Export:=Reccount() Repl All Record With Rc_Export,Recoil With Rc_OilKol Use Xls_File:=Mar4+File_Ex Dbf_File:=Mar4+File_Ex Xls_Copy:=Mar12+File_Ex Main_file:=Mar10+'Rpt_Azs' oExcel :=ToleAuto():New( "Excel.Application" ) oExcel :Visible := .F. oExcel :Workbooks:Open(Dbf_File) oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oExcel:Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oAs:Columns(2):Font:Bold := .T. For J_Rec = 4 To cColumn-4 oAs:Columns(J_Rec):NumberFormat:= "# ##0,00;-0,00;" Next oAs:Columns(7):NumberFormat:= "0,0000;;" oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeTop):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeBottom):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlEdgeRight):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideVertical):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn-4)):Borders(xlInsideHorizontal):LineStyle:= xlContinuous For I_Rec = 2 To cRecno I_Rec1:=I_Rec-1 If I_Rec1/Rc_OilKol-Int(I_Rec1/Rc_OilKol)==0 I_Rec2:=(Int(I_Rec1/Rc_OilKol)-1)*(Rc_OilKol+1)+2 I_Rec3:=Int(I_Rec1/Rc_OilKol)*(Rc_OilKol+1)+1 I_Rec4:=I_Rec3-1 * If I_Rec3<cRecno oAs:Rows(I_Rec3):Font:Bold:= .T. oAs:Rows(I_Rec3):Interior:ColorIndex = 6 oAs:Rows(I_Rec3):WrapText = .T. oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):Merge() oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):HorizontalAlignment := xlCenter oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):VerticalAlignment:= xlCenter * Endif Endif Next oAs:SaveAs(Xls_Copy,Excel97_10) oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(1) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:Paste() oExcel:CutCopyMode :=.F. oAs:SaveAs(Main_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel:Quit() Xls_Screen() ****************************** Export:={} Aadd(Export,{"Code_Uprav","C",4,0}) Aadd(Export,{"Name_Uprav","C",20,0}) Aadd(Export,{"Name_Oil","C",10,0}) Aadd(Export,{"Prixod_Lt","N",13,2}) Aadd(Export,{"Prixod_Kg","N",13,2}) Aadd(Export,{"Rasxod_Lt","N",13,2}) Aadd(Export,{"Rasxod_Kg","N",13,2}) Aadd(Export,{"Vdm_Lt","N",13,2}) Aadd(Export,{"Krt_Lt","N",13,2}) Aadd(Export,{"Ala_Lt","N",13,2}) Aadd(Export,{"Fgr_Lt","N",13,2}) Aadd(Export,{"Ostatok_Lt","N",13,2}) Aadd(Export,{"Ostatok_Kg","N",13,2}) Aadd(Export,{"Kassa","N",13,2}) Aadd(Export,{"Realnms_Lt","N",13,2}) Aadd(Export,{"Realnmk_Kg","N",13,2}) Aadd(Export,{"Kassanm","N",13,2}) File_Ex:='02_Table' Net_Use(200,(Mar4+File_Ex),'Ex_Dbf',1,1) Select DATAGSM Set Relation To Code_Oil Into OILTYPE Set Relation To Code_Uprav Into OFFICE Additive Select OFFICE Set Order To 1 Count To Kol_Lc For Type_Uprav==1 Kolf_Ntx:=Kol_Lc Kolf_Prc:=0 Set Filter To Type_Uprav==1 DbGoTop() Do While !Eof() Rec_Off:=Recno() Kode_Uprav:=Code_Uprav Ip_Movet(Padr('Ѓh„Q„p„ѓ„‰„u„„ „x„p „ѓ„…„„„{„y ' +Code_Uprav,69),Dy_15) Day_Azs2() Select OFFICE Set Order To 1 Goto Rec_Off Skip Enddo Set Filter To Select EX_DBF Use /// Xls_File:=Mar4+File_Ex Dbf_File:=Mar4+File_Ex Xls_Copy:=Mar12+File_Ex oExcel :=ToleAuto():New( "Excel.Application" ) oExcel :Visible := .F. oExcel :Workbooks:Open(Dbf_File) oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oExcel:Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oAs:Columns(2):Font:Bold := .T. For J_Rec = 4 To cColumn oAs:Columns(J_Rec):NumberFormat:= "# ##0,00;-0,00;" Next oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Borders(xlEdgeTop):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Borders(xlEdgeBottom):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn)):Borders(xlEdgeRight):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn)):Borders(xlInsideVertical):LineStyle:= xlContinuous oAs:Range(oAs:Cells(2,1),oAs:Cells(cRecno,cColumn)):Borders(xlInsideHorizontal):LineStyle:= xlContinuous For I_Rec = 2 To cRecno I_Rec1:=I_Rec-1 If I_Rec1/Rc_OilKol-Int(I_Rec1/Rc_OilKol)==0 I_Rec2:=(Int(I_Rec1/Rc_OilKol)-1)*(Rc_OilKol+1)+2 I_Rec3:=Int(I_Rec1/Rc_OilKol)*(Rc_OilKol+1)+1 I_Rec4:=I_Rec3-1 * If I_Rec3<cRecno oAs:Rows(I_Rec3):Font:Bold:= .T. oAs:Rows(I_Rec3):Interior:ColorIndex = 6 oAs:Rows(I_Rec3):WrapText = .T. oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):Merge() oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):HorizontalAlignment := xlCenter oAs:Range(oAs:Cells(I_Rec2,2),oAs:Cells(I_Rec4,2)):VerticalAlignment:= xlCenter * Endif Endif Next oAs:SaveAs(Xls_Copy,Excel97_10) oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Copy() oExcel:Workbooks:Open(Main_File) oBook := oExcel:ActiveWorkBook oSheet:=oBook:Sheets(2) oAs :=oExcel:ActiveSheet() oAs:Cells(5,1):Select() oAs:Paste() oExcel:CutCopyMode :=.F. oAs:SaveAs(Main_File,Excel97_10) oExcel:Set( "DisplayAlerts",.T.) oExcel:Quit() *Dbf_to_Xls(Mar4+File_Ex,1) Xls_Screen() „x„p„t„p„‰„p „ѓ„Ђ„ѓ„„„Ђ„y„„ „r „„„Ђ„} „‰„„„Ђ „‡„Ђ„‰„… „ѓ„t„u„|„p„„„Ћ 1. „O„„„{„‚„Ќ„„„Ћ „O„q„‹„y„z „†„p„z„| „Ђ„„„‰„u„„„p MAIN_FILE „†„Ђ„‚„}„p„„„p XLS, „r „~„u„} „~„u„ѓ„{„Ђ„|„Ћ„{„Ђ „|„y„ѓ„„„Ђ„r, „~„p „{„p„w„t„Ђ„} „ѓ„r„Ђ„‘ „Љ„p„Ѓ„{„p („s„Ђ„„„Ђ„r„Ђ) 2. „Ѓ„‚„Ђ„s„‚„p„}„}„p „†„Ђ„‚„}„y„‚„…„u„„ „|„Ђ„{„p„|„Ћ„~„Ќ„u „†„p„z„|„Ќ „†„Ђ„‚„}„p„„„p DBF „y „Ѓ„u„‚„u„r„Ђ„t„y„„ „y„‡ „r „†„Ђ„‚„}„p„„ XLS „y „x„p„Ѓ„y„ѓ„Ќ„r„p„u„„ „~„p „t„y„ѓ„{ („s„Ђ„„„Ђ„r„Ђ) „‰„„„Ђ „~„…„w„~„Ђ „ѓ„t„u„|„p„„„Ћ 1. „Ђ„„„{„‚„Ќ„„„Ћ „|„Ђ„{„p„|„Ћ„~„Ќ„z „Ђ„„„‰„u„„ XLS 2. „ѓ„{„Ђ„Ѓ„y„‚„Ђ„r„p„„„Ћ „t„y„p„Ѓ„p„x„Ђ„~ „‘„‰„u„u„{ 3. „Ѓ„u„‚„u„z„„„y „~„p „…„{„p„x„p„~„~„Ќ„z „|„y„ѓ„„ „Ђ„„„‰„u„„„p MAIN_FILE 4. „r„ѓ„„„p„r„y„„„Ћ „t„p„~„~„Ќ„u „y„x „|„Ђ„{„p„|„Ћ„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p „Ѓ„Ђ„r„„„Ђ„‚„y„„„Ћ „Ѓ. 1 - 3 „~„…„w„~„Ђ„u „{„Ђ„|„y„‰„u„ѓ„„„r„Ђ „‚„p„x („ѓ„{„Ђ„|„Ћ„{„Ђ „|„y„ѓ„„„Ђ„r „r „Ђ„„„‰„u„„„u MAIN_FILE) 5. „H„p„Ѓ„y„ѓ„p„„„Ћ „Ђ„„„‰„u„„ MAIN_FILE „r „Ѓ„‚„y„r„u„t„u„~„~„Ђ„} „Ѓ„‚„y„}„u„‚„u „r „|„y„ѓ„„ 1 „Ђ„„„‰„u„„„p MAIN_FILE „Ѓ„‚„r„y„|„Ћ„~„Ђ „Ѓ„u„‚„u„t„p„ђ„„„ѓ„‘ „t„p„~„~„Ќ„u „|„Ђ„{„p„|„Ћ„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p '01_Table', „r „~„p „|„y„ѓ„„2 „Ђ„„„‰„u„„„p MAIN_FILE „r„ѓ„„„p„r„|„‘„ђ„„„ѓ„‘ „t„p„~„~„Ќ„u „y„x „|„Ђ„{„p„|„Ћ„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p '01_table' „p „x„p„„„u„} „Ѓ„Ђ„r„u„‚„‡ „~„y„‡ „P„‚„p„r„y„|„Ћ„~„Ќ„u „t„p„~„~„Ќ„u „y„x „|„Ђ„{„p„|„Ћ„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p '02_table'.... „~„u „x„~„p„ђ „{„p„{ „Ђ„‰„y„ѓ„„„y„„„Ћ „q„…„†„u„‚ „Ѓ„Ђ„ѓ„|„u „Ђ„Ѓ„u„‚„p„?„y„y „Ropy() „y Paste()??? „t„…„}„p„ђ „‰„„„Ђ „Ѓ„‚„Ђ„q„|„u„}„p „y„}„u„~„~„Ђ „r „Џ„„„Ђ„}. „N„Ђ „~„p„t„Ђ „y„x„‘„‹„~„Ђ: 1 .„O„t„y„~ „‚„p„x „Ђ„„„‚„Ќ„„„Ћ „ѓ„r„Ђ„t„~„Ќ„z „Ђ„„„‰„u„„ MAIN_FILE 2. „P„Ђ„ѓ„|„u„t„Ђ„r„p„„„u„|„Ћ„~„Ђ „Ђ„„„{„‚„Ќ„r„p„„„Ћ „|„Ђ„{„p„|„Ћ„~„Ќ„u „Ђ„„„‰„u„„„Ќ Dbf->XLS 3. „B„Ќ„q„y„‚„p„„„Ћ „t„p„~„~„Ќ„u „y„x „|„Ђ„{„p„|„Ћ„~„Ќ„Ђ„s„Ђ „Ђ„„„‰„u„„„p Dbf->XLS 4. „P„u„‚„u„z„„„y „r „ѓ„r„Ђ„t„~„Ќ„z „Ђ„„„‰„u„„ MAIN_FILE 5. „B„Ќ„q„‚„p„„„Ћ „~„…„w„~„Ќ„z „|„y„ѓ„„ 6. „B„ѓ„„„p„r„y„„„Ћ „t„p„~„~„Ќ„u „y„x „|„Ђ„{„p„|„Ћ„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p Dbf->XLS 7. „O„‰„y„ѓ„„„y„„„Ћ „q„…„†„u„‚ „Ђ„q„}„u„~„p „y„„„t „‚„| „Ѓ 2-7 8.„H„p„Ѓ„y„ѓ„p„„„Ћ „ѓ„r„Ђ„t„~„Ќ„z „Ђ„„„‰„u„„ MAIN_FILE 9.„D„u„p„{„„„y„r„y„‚„Ђ„r„p„„„Ћ Excel. PS. „†„…„~„{„?„y„y DAY_AZS1, DAY_AZS2 - „‚„p„ѓ„‰„u„„ „t„p„~„~„Ќ„‡ „A„D „y „x„p„Ѓ„y„ѓ„Ћ „r „|„Ђ„{„p„|„Ћ„~„…„ђ „A„D

S-A-N: Oskar_AAA пишет: „x„p„t„p„‰„p „ѓ„Ђ„ѓ„„„Ђ„y„„ „r „„„Ђ„} „‰„„„Ђ „‡„Ђ„‰„… „ѓ„t„u„|„p„„„Ћ 1. „O„„„{„‚„Ќ„„„Ћ „O„q„‹„y„z „†„p„z„| „Ђ„„„‰„u„„„p MAIN_FILE „†„Ђ„‚„}„p„„„p XLS, „r „~„u„} „~„u„ѓ„{„Ђ„|„Ћ„{„Ђ „|„y„ѓ„„„Ђ„r, „~„p „{„p„w„t„Ђ„} „ѓ„r„Ђ„‘ „Љ„p„Ѓ„{„p („s„Ђ„„„Ђ„r„Ђ) 2. „Ѓ„‚„Ђ„s„‚„p„}„}„p „†„Ђ„‚„}„y„‚„…„u„„ „|„Ђ„{„p„|„Ћ„~„Ќ„u „†„p„z„|„Ќ „†„Ђ„‚„}„p„„„p DBF „y „Ѓ„u„‚„u„r„Ђ„t„y„„ „y„‡ „r „†„Ђ„‚„}„p„„ XLS „y „x„p„Ѓ„y„ѓ„Ќ„r„p„u„„ „~„p „t„y„ѓ„{ („s„Ђ„„„Ђ„r„Ђ) Это на каком языке :))

SADSTAR4: Круто - ни одного комментария. Через неделю сам поймешь что там делается? Код лучше вставлять в тэгах [ pre ][ /pre ] которые вставляются кнопкой < 123 > (или набрать вручную) Тогда сохраняются отступы (если они есть в тексте). Если в тексте есть "[ i ]" (="["+"i"+"]") то нужно заменить на "["+" "+"i"+" "+"]" т.е. вставить пробелы между скобками и i, т.к. сайт понимает это как тэг перехода на шрифт Italic.

Oskar_AAA: Круто написал... на предпросмотре было ОК... комметарии к тексту. 1. Проходит обработка БД и создание локальных DBF файлов (01_table, 02_table итд) 2. Преобразование локальных DBF файлов (01_table, 02_table итд) в формат XLS и форматирование ячеек 3.Запись XLS файлов на диск в текщем коде формирование локальных XLS и их форматирование проходит нормально. Но хочу сделать следующее: 1.Открыть сводный отчет XLS (Main_File) - в нем 9 Листов, с шапками и прочими атрибутами 2.Открывать локальные XLS файлы (01_table, 02_table .... 09_table) 3.Копировать диапазон ячеек, уже сформатированных 4.Перейти в сводный отчет XLS (Main_File) 5.Установить нужный лист 6.Вставить данные локального отчета XLS 7. Повторить п 2-6 в данном случае 9 раз (01_table, 02_table ..... 09_table) 8.Записать сводный отчет XLS Main_File. в коде программы есть функции DAY_AZS1, DAY_AZS2 - это обработка основной БД, расчет и ФОРМИРОВАНИЕ выходных локальных DBF Копирование данных проходит в первом случае (01_table) проходит правильно, при переходе к обработке 02_table и переходе к листу 2 отчета MAIN_FILE происходит копирование данных из 01_table а затем уже из 02_Table.... Вопросы: Как очистить буфер обмена? Как организовать последовательный переход между книгами и листами, ранее уже открытыми? Форумчане , прошу помочь советами... Сейчас я каждый раз открываю сводный MAIN_FILE, затем открываю локальный 01_table.xls копирую данные и ЗАКРЫВАЮ оба файла, затем снова открываю сводный MAIN_FILE и локальный 02_table.xls.

Oskar_AAA: Не понял как организовать тэги, для передачи PRG в явном виде, т.е. с отспупами ?

Pasha: Oskar_AAA пишет: Вопросы: Как очистить буфер обмена? Как организовать последовательный переход между книгами и листами, ранее уже открытыми? 1. hb_gtinfo(HB_GTI_CLIPBOARDDATA, "") 2. oBook:Sheets(n):Select()

Oskar_AAA: Pasha, добрый день. п.1 консольный xharbour, какая там команда п.2 можно по нагляднее, подробнее описать oBook:Sheets(1):Select() //// oBook1:Sheets(1):Select()Psate() ////

Pasha: 1. Эта функция как раз для консольного харбора. Надо только включить hbgtinfo.ch 2. oSeet:Select() делает указанный лист активным Затем в этом листе надо выбрать нужную ячейку, и вызвать для листа метод Paste() Метод Paste можно вызвать как для активного листа (переменная oAs), так и для произвольного: oSheet5 := oBook:Sheets(5) oSheet5:Paste() или oBook:Sheets(5):Select() oAs:Paste()

Oskar_AAA: Ошибка Error: Unresolved external '_HB_FUN_HB_GETINFO' referenced from COM_003.prg в начале проги подключаются # Include 'Command.Ch' # Include 'Inkey.Ch' # Include 'Dbedit.Ch' # Include 'Setcurs.ch' # Include 'Excel.Ch' # Include 'Hbgtinfo.Ch' /// /// oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() oExcel :Workbooks:Open(Main_File) oBook :=oExcel:ActiveWorkBook oSheet:=oBook :Sheets(1) oAs :=oExcel:ActiveSheet() oAs :Cells(5,1):Select() oAs :Paste() oAs :=Hb_getInfo(HB_GTI_CLIPBOARDDATA, "") oExcel:CutCopyMode :=.F. oAs :=Hb_getInfo(HB_GTI_CLIPBOARDDATA, "") это я правильно записал? Что дальше?

Pasha: Oskar_AAA пишет: Ошибка Error: Unresolved external '_HB_FUN_HB_GETINFO' referenced from COM_003.prg Опять очепятка. Надо вызывать функцию hb_gtinfo()

Oskar_AAA: oAs :Cells(5,1):Select() oAs :Paste() oAs :Hb_getInfo('') Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: HB_GETINFO Arguments: ( [ 1] = Type: C Val: )

Pasha: Я два раза написал имя функции hb_gtinfo(), а Вы упорно пишите зачем-то hb_getinfo Где я показывал, что hb_gtinfo - это метод обьекта Sheet ? Это функция, и ее надо вызывать так: Hb_getInfo(HB_GTI_CLIPBOARDDATA, "") Зачем ее результат присваивать обьекту Sheet ?

Oskar_AAA: Pasha, туго мне с этим направлением, поэтому мучаю Вас и самому тоскливо... oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() oExcel :Workbooks:Open(Main_File) oBook :=oExcel:ActiveWorkBook oSheet:=oBook :Sheets(1) oAs :=oExcel:ActiveSheet() oAs :Cells(5,1):Select() oAs :Paste() Hb_getInfo(HB_GTI_CLIPBOARDDATA, "") Все варно ошибка Error: Unresolved external '_HB_FUN_HB_GETINFO' Покажи на этом фрагменте как правильно записать....

Pasha: hb_gtinfo(HB_GTI_CLIPBOARDDATA, "")

Oskar_AAA: Pasha, так и написано hb_gtinfo(HB_GTI_CLIPBOARDDATA, "") но ошибка то осталась, похоже я точно устал....., может какую-то Lib надо подключить? Список библиотек, подключаемых при формировании EXE lang.lib vm.lib rtl.lib rdd.lib macro.lib pp.lib dbfcdx.lib dbffpt.lib common.lib gtwin.lib codepage.lib ct.lib tip.lib pcrepos.lib hsx.lib hbsix.lib zlib.lib debug.lib import32.lib cw32.lib DbfNtx.Lib

Pasha: В старых версих xHarbour эта функция называлась gtinfo()

Oskar_AAA: „D„Ђ„q„‚„Ќ„z „t„u„~„Ћ.... „N„u „Ѓ„Ђ„|„…„‰„p„u„„„ѓ„‘ „Ѓ„Ђ„ѓ„|„u„t„Ђ„r„p„„„u„|„Ћ„~„Ђ „Ђ„„„{„‚„Ќ„„„Ћ, „r„Ќ„q„‚„p„„„Ћ „t„y„p„Ѓ„p„x„Ђ„~ „‘„‰„u„u„{ „y„x „Ђ„t„~„Ђ„z „{„~„y„s„y, „ѓ„{„Ђ„Ѓ„y„‚„Ђ„r„p„„„Ћ „y „r„ѓ„„„p„r„y„„„Ћ „r „|„y„ѓ„„ „t„‚„…„s„Ђ„z „{„~„y„s„y... Pasha, Sadstar4, „‰„„„Ђ „~„u „„„p„{ „r „{„Ђ„t„u. // „ѓ„r„Ђ„t„~„Ќ„z „Ђ„„„‰„u„„ XLS Main_File:=Mar10+'Rpt_Azs' oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Main_File) oBook_S :=oExcel_S:ActiveWorkBook oExcel_S:Set( "DisplayAlerts",.F.) oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1) oExcel_S:Visible := .T. // 1 xls „Ђ„„„‰„u„„ File_Ex:='01_Table' Xls_Copy:=Mar12+File_Ex oExcel :Workbooks:Open(Xls_Copy) oExcel :Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() // „Ѓ„u„‚„u„‡„Ђ„t „~„p „ѓ„r„Ђ„t„~„Ќ„z „Ђ„„„‰„u„„ oAs_S:Cells(5,1):Select() oAs_S:Paste() Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") oExcel:CutCopyMode := .F. oExcel:Quit() *oAs_S:SaveAs(Main_File,Excel97_10) *oExcel_S:Quit() *Main_File:=Mar10+'Rpt_Azs' *oExcel_S:=ToleAuto():New("Excel.Application") *oExcel_S:Workbooks:Open(Main_File) *oBook_S :=oExcel_S:ActiveWorkBook // 2 XLS „Ђ„„„‰„u„„ File_Ex:='02_table' Xls_Copy:=Mar12+File_Ex oExcel :Workbooks:Open(Xls_Copy) oAs:= oExcel:ActiveSheet() oExcel :Visible := .T. oExcel :Set( "DisplayAlerts",.F.) oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Copy() oExcel:Quit() // „Ѓ„u„‚„u„‡„Ђ„t „~„p „ѓ„r„Ђ„t oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel:ActiveSheet() oSheet_S:=oBook_S :Sheets(2) oAs_S :Cells(5,1):Select() oAs_S:Paste() oAs_S:SaveAs(Main_File,Excel97_10) Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") oExcel:CutCopyMode := .F. oAs_S:SaveAs(Main_File,Excel97_10) // „x„p„Ѓ„y„ѓ„Ћ „ѓ„r„Ђ„t„~„Ђ„s„Ђ „Ђ„„„‰„u„„„p oExcel_S:Quit() „B„Ќ„|„u„„„p„u„„ „Ђ„Љ„y„q„{„p Error BASE/1004 Class: 'NIL' has no exported method: CELLS Arguments: ( [ 1] = | |Type: U [ 2] = Type: N Val: 5 [ 3] = Type: N Val: 1) „ | „r„Ђ„„ „~„p „Џ„„„Ђ„z „ѓ„„„‚„Ђ„{„u „y „Џ„„„Ђ „Ѓ„‚„y „Ђ„q„‚„p„q„Ђ„„„{„u 2 XLS oAs_S :Cells(5,1):Select()

Oskar_AAA: Опять кракозябры.... Ошибка Error BASE/1004 Class: 'NIL' has no exported method: CELLS Arguments: ( [ 1] = | |Type: U [ 2] = Type: N Val: 5 [ 3] = Type: N Val: 1) „ при обработке 2 отчета.... Как написать, что бы не было Кракозябриков?

AlexMyr: Oskar_AAA пишет: Как написать, что бы не было Кракозябриков? Прикрепить файл.

Oskar_AAA: Прикрепил файл... только ссылку не запомнил Function Xls_Cvod Local oExcel,oSheet,oBook,oAs Local oExcel_S,oSheet_S,oBook_S,oAs_1 Main_File:=Mar10+'Rpt_Azs' // сводный отчет oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Main_File) oBook_S :=oExcel_S:ActiveWorkBook oExcel_S:Set( "DisplayAlerts",.F.) oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1) oExcel_S:Visible := .T. // 1 xls отчет File_Ex:='01_Table' Xls_Copy:=Mar12+File_Ex oExcel :Workbooks:Open(Xls_Copy) oExcel :Set( "DisplayAlerts",.F.) oAs:= oExcel:ActiveSheet() oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn-4)):Copy() // переход на сводный отчет oAs_S:Cells(5,1):Select() oAs_S:Paste() Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") // очистка буфера обмена oExcel:CutCopyMode := .F. oExcel:Quit() // закрытие локального xls файла // 2 xls отчет File_Ex:='02_table' Xls_Copy:=Mar12+File_Ex oExcel :Workbooks:Open(Xls_Copy) Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") // очистка буфера обмена oAs:= oExcel:ActiveSheet() oExcel :Visible := .T. oExcel :Set( "DisplayAlerts",.F.) oRange := oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Copy() oExcel:Quit() // переход на сводный отчет oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel:ActiveSheet() oSheet_S:=oBook_S :Sheets(2) oAs_S :Cells(5,1):Select() oAs_S:Paste() oAs_S:SaveAs(Main_File,Excel97_10) Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") oExcel:CutCopyMode := .F. oAs_S:SaveAs(Main_File,Excel97_10) // запись сводного отчета oExcel_S:Quit()

Oskar_AAA: „O„Љ„y„q„{„p „Ѓ„‚„y „Ђ„‚„p„q„Ђ„„„{„u 2 xls „†„p„z„|„p „~„p „ѓ„„„‚„Ђ„{„u oAs_S :Cells(5,1):Select() |Error BASE/1004 Class: 'NIL' has no exported method: CELLS Arguments: ( [ 1] = | |Type: U [ 2] = Type: N Val: 5 [ 3] = Type: N Val: 1) „ |

Oskar_AAA: ссылка на файл http://zalil.ru/31804807

Oskar_AAA: Нашел ошибку, в строке oAs_S :=oExcel:ActiveSheet() записал как oAs_S :=oExcel_S:ActiveSheet(), теперь ругается на oAs_S:Paste() Error Excel.Application:ACTIVESHEET/3 DISP_E_MEMBERNOTFOUND: PASTE Arguments: (| |)

Oskar_AAA: Получилось, спасибо за советы и терпение.... Теперь вопрос как снять выделение диапазона на листах сводного отчета? Использую команду Hb_gtInfo(HB_GTI_CLIPBOARDDATA, "") // очистка буфера обмена oExcel_S:CutCopyMode :=.F. // снятие выделения диапазона ячеек все листы, которые получены через копирование ячеек из локальных XLS остаются с выделенным диапазоном.

Oskar_AAA: Дективировал выделение ячеек, через выбор ячейки на листе.... Всем успехов и удачи.

Andrey: Oskar_AAA пишет: Дективировал выделение ячеек, через выбор ячейки на листе.... А как ? Нам тоже интересно !

Oskar_AAA: Andrey, установил куросор или другими словами активировал ячейку... oSheet_S:=oBook_S :Sheets(3):Select() // выбор листа и активация нужного листа oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(3) oAs_S :Cells(5,1):Select() // установка нужной ячейки с которой надо вставлять из буфера oSheet_S:Paste() // собственно вставка oAs_S :Cells(5,1):Select() // активация ячейки

Oskar_AAA: Добрый день, возникла интересная ситуация. На 1 ПК установлена русская версия Windows 7, SP1 и Office 2010, на 2 ПК XP, SP1 и Office 2003. На этих ПК установлены xHarbour, BCC5 одинаковые. Так вот на Windows 7, SP1 и Office 2010 обработка сводного отчета XLS проходит нормально, а на другом вываливается по ошибке фрагмент кода обработки oSheet_S:=oBook_S :Sheets(1):Select() oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(5,1):Select() Day_Excel:=Mar12+Dtos(Cdata)+'Day' // формирование имени файла отчета oAs_S:SaveAs(Day_Excel,Excel97_10) // запись файла отчета oExcel_S:Quit()

Chikanuk: Oskar_AAA пишет: oAs_S:SaveAs(Day_Excel,Excel97_10) // запись файла отчета А Office 2003 разве работает с форматом Office 2010 Надо бы сохранять в формате 97-2003 (или же 97-2000). Как вариант - поставить на остальные 2 компа Office 2010.

Pasha: Огласите, что за ошибка и что такое Excel 97_10 ? Какая-то переменная ?

Chikanuk: Pasha пишет: что такое Excel 97_10 ? Какая-то переменная ? oAs_S:SaveAs(Day_Excel,Excel97_10) Это из VBA: параметр, указывающий, в каком формате Excel будет сохранять файл с именем, указанным в первом параметре. В данном случае Excel97_10, то есть в формате Office 2010. А Oskar_AAA пытается сохранить в этом формате из Office 2003, на что тот реагирует ошибкой. Надо бы ставить Excel97_03, но тогда при попытке запустить под Office 2000/97 опять ошибка вылезет. Параметр Excel97 более универсален: будет работать с 97 по 2010 включительно.

Oskar_AAA: Excel97_10 - это есть переменная, котора принимает значение 43 или 56 в зависимости от версии MS Excel, прописана в настройках своего ПО. программа вываливается на Exce 2003 ТОЛЬКО при обработке двух XLS отчетов одновременно, т.е . открывает локальный отчет, берет из него данные и ВНОСИТ их в уже ОТКРЫТЫЙ сводный отчет на определенный лист. Далее закрывается локальный отчет и копия oExcel, котрым он был открыт. Далее опять запускается новая копия Excel и открывается другой локальный отчет и опять берет из него данные и ВНОСИТ их в уже ОТКРЫТЫЙ сводный отчет на определенный лист. Попытка открыть Два файла использую одну копию Excel у меня вылетает ошибка. Как открывать два и более файлов, использую одну копию Excel (как определить и различать переменные oExcel, oBook, oSheets, oAs, oRange)? Как записать и закрыть определеный (Документ) файл XLS, при этом не Закрывая само Приложение Excel? пока делаю так: Local oExcel,oSheet,oBook,oAs Local oExcel_S,oSheet_S,oBook_S,oAs_1 // svod XLS Main_File:=Mar10+'Rpt_Azs' oExcel_S:=tOleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Main_File) oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1):Select() oExcel_S:Set("DisplayAlerts",.F.) oExcel_S:Visible := .F. // local XLS 1 File_Ex:='01_Table' Xls_Copy:=Mar12+File_Ex oExcel :=tOleAuto():New("Excel.Application") oExcel :Workbooks:Open(Xls_Copy) oExcel :Set("DisplayAlerts",.F.) oExcel :CutCopyMode := .F. oAs:= oExcel:ActiveSheet() oRange :=oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column /// /// oExcel_S:CutCopyMode :=.F. oExcel:Quit() oAs:=Nil oExcel:=Nil oRange:=Nil oBook :=Nil // local XLS 2 File_Ex:='02_table' Xls_Copy:=Mar12+File_Ex oExcel :=tOleAuto():New("Excel.Application") oExcel :Workbooks:Open(Xls_Copy) oExcel :Visible := .F. oExcel :Set("DisplayAlerts",.F.) oExcel :CutCopyMode :=.F. oExcel :Visible := .F. oAs:= oExcel:ActiveSheet() oRange :=oExcel:ActiveCell:SpecialCells(xlLastCell) cRecno :=oRange:Row cColumn:=oRange:Column oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Select() oAs:Range(oAs:Cells(2,2),oAs:Cells(cRecno,cColumn)):Copy() oExcel :Visible := .F. oExcel_S:Visible := .F. /// /// oExcel:Quit() oAs:=Nil oExcel:=Nil oRange:=Nil oBook :=Nil

Pasha: Так все-таки, что за ошибка возникает ? И на каком точно операторе, SaveAs ?

Oskar_AAA: Pasha, номер ошибки и строку кода, на которой вылетает сброшу в понедельник. Сейчас под руками нет того ПК. Спасибо

Oskar_AAA: Добрый день всем. Pasha, сообщение об ошибке ----------------------------- xHarbour Error Log ------------------------------ Date...............: 07/10/2011 Time...............: 21:21:55 Available memory...: 690844 Current disk.......: C Current directory..: TEMP.BL1 Free disk space....: 17157193728 Operating system...: Windows XP Professional 5.01.2600 Service Pack 3 xHarbour version...: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6476) xHarbour built on..: Jun 11 2009 09:38:24 C/C++ compiler.....: Borland C++ 5.5.1 (32 bit) Multi Threading....: NO VM Optimization....: 2 -------------------- Internal Error Handling Information --------------------- Subsystem Call ....: Excel.Application:ACTIVESHEET System Code .......: 3 Default Status ....: .F. Description .......: DISP_E_MEMBERNOTFOUND Operation .........: SAVEAS Arguments .........: [ 1] = Type: C Val: C:\PROBA.ALL\FILES.EXP\20110907Day [ 2] = Type: N Val: 43 Involved File .....: Dos Error Code ....: 0 Trace Through: ---------------- TOLEAUTO:SAVEAS : 0 in Module: source\rtl\win32ole.prg EXCEL_DAY1 : 1,835 in Module: COMM_004.prg EXPORT_DATA : 474 in Module: MAIN_000.prg MAIN : 184 in Module: MAIN_000.prg

Pasha: Oskar_AAA пишет: -------------------- Internal Error Handling Information --------------------- Subsystem Call ....: Excel.Application:ACTIVESHEET System Code .......: 3 Default Status ....: .F. Description .......: DISP_E_MEMBERNOTFOUND Operation .........: SAVEAS Метод SaveAs надо применять не к листу, а к книге, т.е. к oBook. Лист ведь отдельно не сохраняется. Сохраняется вся книга.

Oskar_AAA: Pasha, т.е надо записать oWorbook_S:SaveAs(Day_Excel,Excel97_10) вместо oAs_S:SaveAs(Day_Excel,Excel97_10) я правильно понял?

Pasha: Oskar_AAA пишет: Pasha, т.е надо записать oWorbook_S:SaveAs(Day_Excel,Excel97_10) вместо oAs_S:SaveAs(Day_Excel,Excel97_10) я правильно понял? В вашем коде же нет переменной oWorbook_S. И из воздуха она сама по себе не возникнет. Надо использовать ту переменную, в которую зенесено значение ActiveWorkbook, или какой-либо другой книги, которую надо сохранить.

Oskar_AAA: попробую на другом ПК, это вечером. А как сделать так чтобы: в процессе работы активировался Excel, пользователь внес необходимые данные, затем прошла запись данных в файл XLS и переход обратно в xHarbour. Другими словами: ввод данных в дилоговом режиме, активируется Excel, пользователь вносит данные в таблицу Excel, записывает Excel файл и управление обратно переходт в программу xHarbour. У меня gпользователи привыкли к вводу в Excel...

Pasha: Дык.. как Очень даже просто как Пользователю надо клацнуть на полочке панели задач на харбор-программу, и она получит фокус.

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

Pasha: Боюсь, что это невозможно. Во всяком случае, я не знаю, как это сделать. Программа как-то должна отследить, что Excel закрыт. Но Excel остается в памяти, пока висит программа. Есть у ms такая фича. Но зачем все это ? Когда excel закроется, windows и сама передаст фокус на предыдущее окно, т.е харбор-программу.

Andrey: Oskar_AAA пишет: записывает файл и закрыает Приложение Excel и переходит обратно в прграмму... Нельзя наверно. Как Эксель узнает что нужно вернуть фокус обратно в задачу ? Хотя наверно можно в своей задаче опрашивать в цикле каждую минуту на наличие окна Экселя, и если его нет, то переключить(распахнуть) окно своей задачи.

Oskar_AAA: Andrey пишет: наверно можно в своей задаче опрашивать в цикле каждую минуту на наличие окна Экселя, но в памяти может быть загружен Excel совсем не относящийся к моей программе. Pasha, в том то и дело, что активируется Excel в фоновом режиме и висит в своем окне, а программа продолжает идти дальше по тексту кода, т.е. читает данные из файла XLS и пишет в БД. Хотя Пользователь не ввел необходимые данные....

Andrey: Oskar_AAA пишет: но в памяти может быть загружен Excel совсем не относящийся к моей программе. Тогда бери и определяй окно Excel с заголовком ТВОЕГО файла.... Список процессов можешь получить вот с помощью такой программульки... http://files.mail.ru/OX6T20 А там дальше делай с ним что хочешь....

Andrey: Опять проблема с разными версиями Экселя. Создаю Dbf в кодировке RU866. Открываю в экселе и записываю файл в формате XLS. На версии 2003 работает а на новой 2010 вылетает с такой ошибкой: Вот код:[pre2] cFileDbf := "E:\РУССКИЕ-БУКВЫ\тест-эксель.dbf" cFileXls := ChangeFileExt( cFileDbf, '.xls' ) BEGIN SEQUENCE WITH {|e| Break( e )} oExcel := GetActiveObject( "Excel.Application" ) RECOVER BEGIN SEQUENCE WITH {|e| Break( e )} oExcel := CreateObject( "Excel.Application" ) RECOVER MG_Stop( "ОШИБКА! Excel не доступен. [" + win_oleErrorText() + "]" ) RETURN ( "" ) END END WaitWindow( 'Загрузка Excel ... ' + cFileNoPath(cFileDbf), .T. , 800, 14, NIL, YELLOW, RED) oExcel:Visible := .F. // НЕ Показывать EXCEL oExcel:DisplayAlerts := .F. // не приставать с запросами oExcel:WorkBooks:Add() // для версий EXCEL >= 2010 oExcel:Workbooks:Open( cFileDbf, 0 ) oBook := oExcel:ActiveSheet() IF FILE( cFileXls ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" nErr := DELETEFILE(cFileXls) IF nErr == 0 oBook:SaveAs( cFileXls, xlExcel9795 ) ELSE cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += "Ошибка удаления файла: "+cFileXls+" !; Ошибка: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" MG_Stop( cMsg , "Ошибка!" ) ENDIF ELSE oBook:SaveAs( cFileXls, xlExcel9795 ) ENDIF oExcel:Quit() WaitWindow() [/pre2] Что можно поправить, чтобы не вылетало ? Про то что раньше обсуждали - http://clipper.borda.ru/?1-4-0-00001069-000-10001-0-1637697000 - помню !

Dima: Найди четырёх )))))))))

Oskar_AAA: Добрый день, тоже раньше были проблемы с версиями MS Excel при SaveAs(Name_Xls, версия MS) Попробуйте убрать параметр версии MS Excel замените на SaveAs(Name_Xls)

Haz: Andrey пишет: Что можно поправить, чтобы не вылетало ? А чего сразу то не писать в формате Excel. Есть как минимум 4 способа работы с этим форматом и два из них вообще не требует Excel на компе.. 5 лет одни и те же грабли, может пора с другой стороны к снаряду подойти?

Oskar_AAA: Имя файла MS Excel всегда явно задаю с расширением XLSX и нет проблем ... 2003 сейчас найти трудно. В принципе тип расширения XLS/XLSX можно задать в настройках программы.

Dima: oEx:DefaultSaveFormat

Pasha: Andrey пишет: oBook:SaveAs( cFileXls, xlExcel9795 ) это же Excel версии 95 и 97 Зачем ??? Наверное Excel 2003 поддерживает такой древний формат, а 2010 уже нет

Andrey: Haz пишет: А чего сразу то не писать в формате Excel. Есть как минимум 4 способа работы с этим форматом и два из них вообще не требует Excel на компе.. 5 лет одни и те же грабли, может пора с другой стороны к снаряду подойти? Да по быстрому решил dbf преобразовать в xls, без всяких объектов МиниГуи. Попытка не удалась ! Переделал пути и имя файла в латиницу - тоже такая же ошибка .... Dima пишет: oEx:DefaultSaveFormat Спасибо ! Попробую. Oskar_AAA пишет: замените на SaveAs(Name_Xls) Это тоже попробую. Спасибо ! Pasha пишет: это же Excel версии 95 и 97 Зачем ??? Ну не знал... 2003 работал, думал и 2010 будет...

Haz: Andrey пишет: думал и 2010 будет... Даже в 2016 есть поддержка форматов 95 и 97

Dima: Haz пишет: Даже в 2016 есть поддержка форматов 95 и 97 2021 тоже поддерживает :) линк

Pasha: Haz пишет: Даже в 2016 есть поддержка форматов 95 и 97 У меня как раз 2016. Не поленился, прогнал этот пример. Не работает. Заменил xlExcel9795 на xlExcel8. Работает. Поддержка может она и есть. Теоретически, в доке. Но вот глючит она выходит

Haz: Pasha пишет: У меня как раз 2016. Не поленился, прогнал этот пример. Не работает. Потому что при сохранении в 95/97 Excel раз 5 ругается матом про потерю функционала и совместимость. Но при сохранении через OLE эту ругань не видно, видимо это и приводит ошибке при игноре запросов Excel

Pasha: Ну да, ругается: Для сохранения содержащегося в этом файле проекта VBA в формате Excel 5/0/95 требуется компонент, который в настоящий момент не установлен.... Можно конечно поискать этот компонент, но ЗАЧЕМ???

Andrey: oExcel:DefaultSaveFormat() - не работает. Сделал так:[pre2] oBook:SaveAs( cFileXls, xlWorkbookNormal ) // работает в 2003 и в 2016 !!! DO EVENTS oExcel:Quit() [/pre2]

Dima: Andrey пишет: oExcel:DefaultSaveFormat() - не работает. а скобки зачем притулил ? Dima пишет: oEx:DefaultSaveFormat

Andrey: Dima пишет: а скобки зачем притулил ? Иначе у меня не собирается...

Dima: Andrey пишет: Иначе у меня не собирается... Чекнул , в принципе да , со скобками если , то вернет такой же результат. У меня вернуло 51 а 51 это {"xlOpenXMLWorkbook", "Open XML Workbook", ".xlsx"}

Pasha: Не надо морочить голову, а просто выдать: oBook:SaveAs( cFileXls ) Excel сам найдет свой формат

Roman: Есть готовый макрос https://softclipper.net/ispolzovanie-sql-i-dbf/xls-v-dbf-i-dbf-v-xls-makros-excel.html



полная версия страницы