Форум » [x]Harbour » Снова EXCEL (продолжение) » Ответить

Снова EXCEL (продолжение)

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

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

MIKHAIL: Andrey пишет: Исправления и правка приветствуются ! Как считать со скрытого листа, даже ещё и не знаю и не пробовал .... макросы скрытые листы могут не видеть, нужно сначала открыть Sheets("List").Visible = -1 // делаем видимым Sheets("list").Visible = 2 // 2 -суперскрытый, 0 - обычный скрытый

Andrey: Всем привет ! Опять беда с этими версиями экселя. У меня код работает, у других тоже, а у некоторых вылет. Вот код:[pre2] // Используем Ole из HBWIN.lib IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL ..... ENDIF oExcel:WorkBooks:Add() oBook := oExcel:ActiveWorkBook oSheet := oExcel:ActiveSheet .... // вызов допольнительного внешнего блока дообработки таблицы Tuning2Xls(hProgress, oSheet, oExcel) ... FUNCTION Tuning2Xls(hProgress, oSheet, oExcel) oBook := oExcel:ActiveWorkBook oSheet := oExcel:ActiveSheet() oSheet := oBook:Sheets(2) // вот здесь вылетает oSheet:name := "my_formuls" // имя листа изменить[/pre2] Ошибка вот такая: Error WINOLE/1007 (0x8002000B): SHEETS (DOS Error -2147352567) Args: [1] = N 2 --------------------------------- Stack Trace --------------------------------- Called from WIN_OLEAUTO:SHEETS(0) Called from TUNING2XLS(160) in module: Source\table_f5dogTsbD40export.prg Called from (b)TOEXCEL7(129) in module: Source\table_f5dogTsbD40export.prg Called from BRW7XLSOLE(408) in module: Source\Tsb7xlsOle.prg Как исправить код, чтобы на всех Экселях работало ?

Dima: может как то так oSheets := oWorkBook:Sheets oSheets:Item(2):Select() oSheet := oExcel:ActiveSheet


Pasha: В параметрах экселя можно задать количество листов при создании новой книги. Может там 2-го листа вообще нет ?

Andrey: Pasha пишет: В параметрах экселя можно задать количество листов при создании новой книги. Может там 2-го листа вообще нет ? У меня на 2003 работает, а на 2016 нет. Сам смотрел у заказчика - прога падает. Смотри почту.

Pasha: Как исправить код, чтобы на всех Экселях работало ? Судя по моему опыту - никак. Эксель непредсказуем, хочет - работает, не хочет - нет. Тут вопрос или элементарный - надо проверить количество листов в книге, или включается режим "бешеного экселя", как я его называю, когда чудо-продукт либо совсем отказывается открывать книгу, либо сваливается на элементарных командах, вроде Sheets(2) 2003 еще стабильно работает, а начиная с 2007 начинаются чудеса.

Andrey: Dima пишет: может как то так oSheets := oWorkBook:Sheets oSheets:Item(2):Select() oSheet := oExcel:ActiveSheet Поставил у себя, работает. Жалко что заказчик отключился и нет Экселя 2016 чтобы проверит. Спасибо Dima !

Pasha: Смотрю доку по VBA Excel: Worksheets.Item Property (Excel) Item is the default member for a collection. For example, the following two lines of code are equivalent. ActiveWorkbook.Worksheets.Item(1) ActiveWorkbook.Worksheets(1) То есть, обращение oBook:Sheets(2) и oBook:Sheets:Item(2) эквивалентны, и работать будут одинаково. Это все равно, что сравнивать на харборе выражения aItem[i, j] и aItem[ i ][ j ] Они либо оба сработают, либо оба не сработают

Andrey: Нашёл 2016 эксел. Не пашет... Нашёл в чём дело. Оказывается в 2016 экселе при создании файла создаётся только ОДИН лист. Паша оказался прав !!!

Pasha: Файл - Параметры - Общие - При создании новых книг - Число листов - ... Но таки да, похоже в 2016 по умолчанию стоит 1, а не 3, как в предыдущих версиях. Но походу это значение меняется, так что надо проверять Sheets:Count

Andrey: Переход на лист по индексу: [pre2]oSheets:Item(3):Select() // перейдём на 3 лист[/pre2] А как переходить по имени листа ? Лист1, Лист2, ...

Andrey: Блин, столько мороки с порядком добавления листа. В старых версиях порядок: Лис1,Лист2,Лист3 В 2016 при добавлении становиться наоборот: Лис3,Лист2,Лист1 А ещё на Лист1 уже готовая таблица нарисована. Вынос мозга чтобы на всех версиях работало... Сделал.

Dima: Andrey пишет: Вынос мозга чтобы на всех версиях работало Нет ни какого выноса , нужно найти правильный подход , думай

LYSK: Здравствуйте, коллеги! Есть необходимость сформировать книгу EXCEL с двумя листами программно, причем на компе, где ни EXCEL, ни ОО не установлены. Т.е необходима библиотека, дающая проге на HARBOUR записывать в XLS напрямую, без OLE. Уверен, что такая есть. Что посоветуете?

Haz: LYSK пишет: Что посоветуете? xmlxls. В поиске по форуму и примеры Андрея Tsb_brw2xml ЗЫ правда не XLS готовит а XML который понимается Excel

Andrey: LYSK пишет: Уверен, что такая есть. Что посоветуете? \MiniGUI\SAMPLES\Advanced\Tsb_Export\demo.exe Далее кнопка "Export", далее менюшка "Export to Excel (xls-files)" Используется метод из библиотеки oBrw:Excel2() - запись файла без использования OLE, запись напрямую в файл. Протестируй пример с этим меню, должен работать. Исходник метода \MiniGUI\SOURCE\TsBrowse\h_tbrowse.prg Переделать этот метод под себя я думаю можно. LYSK пишет: Есть необходимость сформировать книгу EXCEL с двумя листами программно, Кол-во листов при создании 1. Второй не знаю как сделать.

Haz: Andrey пишет: Кол-во листов при создании 1. Второй не знаю как сделать. Все в исходниках [pre2] oSheet1 := oXml:addSheet( "Sheet1" ) // Если нужно еще , добавляем еще oSheet2 := oXml:addSheet( "Sheet2" ) [/pre2] Дале запись в нужный шит

Dima: LYSK Либа LibXL libxl_v3.8.3.0_with_sn_dxmod.7z https://mega.nz/#!l5U02CaL!kyyEN1CsQQRrZT9Vtdrs1v49X-CaSlA0JQ97MLOyrtc

Oskar_AAA: Добрый день, коллеги. Вроде как решил проблему с работой в MS Excel. Поставил inkey(inkey_Time) между вызовами MS Excel для обработки.... inkey_Time=0.75 обработка 1 файла с Copy Paste inkey(Inkey_Time) обработка 2 файла Inkey(Inkey_Time)

Andrey: Нашёл на просторах инета... случайно. Графики на Экселе http://mail.hmgforum.com/viewtopic.php?t=6600 Всяко-разное: [pre2]******************************************************************************************************* COMMENTS OldComment := Sheet1:Range("A1"):Comment:Text // GET COMMENT NewComment := OldComment + " Edited comment" Sheet1:Range("A1"):Comment:Delete() // DELETE COMMENT Sheet1:Range("A1"):AddComment (NewComment) // ADD COMMENT ******************************************************************************************************* outline oExcel:Selection:ClearOutline() // disable outline ******************************************************************************************************* Freeze Panes oSheet:cells(2,11):SELECT() oExcel:ActiveWindow:FreezePanes := .T. // Enable oExcel:ActiveWindow:FreezePanes := .F. // Disable ******************************************************************************************************* Auto Filter // AutoFilter (Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown) A. oSheet:Range("A1:U1"):AutoFilter() // ENABLE B. oSheet:Range("A1:U1"):AutoFilter(8,"RED") // ENABLE AND SET Criteria1 ==> (Field, Criteria1) C. oSheet:Range("A1"):AutoFilter(8,"RED",xlOr,"BLUE") //xlOr ==> (Field, Criteria1, Operator, Criteria2) D. oExcel:Worksheets("AOI_DAILY"):Range("A1"):AutoFilter(11,">70",xlAnd, "<320") // xlAnd ==> (Field, Criteria1, Operator, Criteria2) oExcel:Selection:AutoFilter() // Disable ******************************************************************************************************* Sort // SortFields:Add(KEY? SortOn? Order? CustomOrder? DataOption? cRange := "P1" _1st_Range := oExcel:Sheets("AOI_DAILY"):Range( cRange ) // SET RANG of 1ST KEY cRange := "E1:E924" _2nd_Range := oExcel:Sheets("AOI_DAILY"):Range( cRange ) // SET RANG of 2ND KEY cRange := "F1:F924" _3rd_Range := oExcel:Sheets("AOI_DAILY"):Range( cRange ) // SET RANG of 3RD KEY cRange := "J1:J924" _4th_Range := oExcel:Sheets("AOI_DAILY"):Range( cRange ) // SET RANG of 4TH KEY cRange := "A1:U924" SORT_Range := oExcel:Sheets("AOI_DAILY"):Range( cRange ) // SET RANG of SORT Area With OBJECT oExcel:Worksheets("AOI_DAILY"):Sort() :SortFields:Clear() :SortFields:Add(_1st_Range,xlSortOnCellColor,xlDescending,xlSortNormal):SortOnValue:Color:=RGB(255, 255, 0) // BY Cell Color & Descending :SortFields:Add(_2nd_Range,xlSortOnValues,xlAscending,xlSortNormal) :SortFields:Add(_3rd_Range,xlSortOnValues,xlAscending,xlSortTextAsNumbers) // Text As Numbers :SortFields:Add(_4th_Range,xlSortOnFontColor,xlAscending,xlSortNormal):SortOnValue:Color:=RGB(0, 0, 0) // BY FONT Color :SetRange(SORT_Range) :Header := xlYes :MatchCase := .F. :Orientation :=xlTopToBottom :SortMethod := xlPinYin :Apply() EndWith ******************************************************************************************************* Merge CELLS A. oSheet:Range("A1:D1"):Merge() .OR. B. cRange := "A16:B17" oSheet:Range(cRange):Select() oExcel:Application:CutCopyMode:= .F. with OBJECT oExcel:Selection() :HorizontalAlignment := xlCenter :VerticalAlignment := xlCenter :WrapText := .F. :Orientation := 0 :AddIndent := .F. :IndentLevel := 0 :ShrinkToFit := .F. :ReadingOrder := xlContext :MergeCells := .F. EndWith oExcel:Selection:Merge() ******************************************************************************************************* Check if merged If oSheet:Range("A22"):MergeCells // .OR. If oSheet:Range("A22:B22"):MergeCells // .OR. If oSheet:Cells(22, 1):MergeCells oSheet:cells(T,1):SELECT() // SET activecell // .OR. oSheet:Range("A25"):SELECT() // SET activecell MSGINFO(oExcel:Activecell:MergeArea:Rows:Count()) // How many rows are merged? MSGINFO(oExcel:Activecell:MergeArea:Columns:Count()) // How many columns are merged? MSGINFO(oExcel:Activecell:MergeArea:Cells:Count()) // How many cells are merged? MSGINFO(oSheet:Range("A25"):VALUE()) MSGINFO(oExcel:activecell:MergeArea:Address()) // What's the merged range address? EndIf ******************************************************************************************************* MOVE SHEET oExcel:Application:Worksheets("Sheet1"):Move(after:=oExcel:Application:Worksheets("Sheet3")) oExcel:Worksheets("Sheet2"):Move(before:=oExcel:Worksheets("AOI_DAILY")) oExcel:Worksheets("Sheet3"):Move(after:=oExcel:Worksheets(oExcel:Sheets:Count())) oExcel:sheets("Sheet3"):Move(after:=oExcel:sheets(oExcel:Sheets:Count())) ADD SHEET oExcel:Sheets:Add:Name:=oSheet:range("a3"):value() //add a Sheet before the ActiveSheet oExcel:Worksheets:Add(after:=oExcel:Worksheets("Sheet5")):Name:="NewSheet" oExcel:Worksheets:Add(before:=oExcel:Worksheets("Sheet5")):Name:=oSheet:range("a3"):value() oExcel:sheets():Add(after:=oExcel:sheets("Chart2")):Name:="NewSheet" // sheets() CAN BE USED WITH "CHART" OR "SHEET" COPY SHEET oExcel:Worksheets("AOI_DAILY"):Copy(before:=oExcel:Worksheets("Sheet5")) oExcel:Worksheets("AOI_DAILY"):Copy(after:=oExcel:Worksheets(oExcel:Sheets:Count())) oExcel:sheets("AOI_DAILY"):Copy(after:=oExcel:sheets("Sheet3")) oExcel:ActiveSheet:Name:="MySheetName" // ASSIGN NAME ******************************************************************************************************* PasteSpecial // Paste Formulas/Formats oSheet:Range("D2:E2"):COPY() cRange:="D3:E30" oSheet:Range(cRange):Select() oExcel:Selection:PasteSpecial(xlPasteFormulas,xlPasteSpecialOperationNone) // Paste Formulas oExcel:Selection:PasteSpecial(xlPasteFormats,xlPasteSpecialOperationNone) // Paste Formats oExcel:Selection:PasteSpecial(Paste:=xlPasteFormats,Operation:=xlPasteSpecialOperationNone) ******************************************************************************************************* AutoFill A. Define Rang sourceRange := oSheet:Range("I2:I2") fillRange := oSheet:Range("I2:I30") .OR. sourceRange := oExcel:Sheets( "AOI_DAILY" ):Range("I2:I2") fillRange := oExcel:Sheets( "AOI_DAILY" ):Range("I2:I20") B. AutoFill the Rang sourceRange:AutoFill(Destination:=fillRange,TYPE:=xlFillFormats) .OR. oSheet:Range("I2:I2"):AutoFill(fillRange,xlFillFormats) ******************************************************************************************************* GET SHHETs / CHARTs NAME ws:=oExcel:sheets() wc:=oExcel:Charts() A. Returns Only the names of each worksheets MSGINFO(oExcel:Worksheets:Count()) For Each ws In oExcel:Worksheets() MSGINFO(ws:Name()) Next For i = 1 To oExcel:Worksheets:Count() MSGINFO(oExcel:Worksheets(i):Name()) Next i B. Returns the names of each worksheets & Charts MSGINFO(oExcel:Sheets:Count()) For Each ws In oExcel:Sheets MSGINFO(ws:Name()) Next For i = 1 To oExcel:Sheets:Count() MSGINFO(oExcel:sheets(i):Name()) Next i C. Returns Only the names of each Charts MSGINFO(oExcel:Charts:Count()) For Each wc In oExcel:Charts() MSGINFO(wc:Name()) Next For i = 1 To oExcel:Charts:Count() MSGINFO(oExcel:Charts(i):Name()) Next i ******************************************************************************************************* Chart Add, Copy & Move oExcel:Charts:Add(After:=oExcel:Charts("NEW CHART 2")):Name:="NEW CHART 3" oExcel:Charts:Add(before:=oExcel:Worksheets("Sheet3")):Name:=oSheet:range("C3"):value() oExcel:Charts("NEW CHART 2"):Copy(after:=oExcel:sheets("NEW CHART 1")) oExcel:ActiveSheet:Name = "My new Chart" oExcel:Charts("NEW CHART 2"):Move(before:=oExcel:Charts("NEW CHART 1")) *******************************************************************************************************[/pre2]



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