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

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

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

Ответов - 57, стр: 1 2 3 All

Dima: Что то не могу найти на форуме , что бы преобразовывать RC формат к ABCD и тд То есть имею точные координаты строка и колонка (числа) , нужно преобразовать к формату не RC Ткните носом плиз PS Имею цифры в колонках 1 2 и 3 и в 4 нужно подбить сумму , как это сделать имея лишь номера колонок и столбцов через СУММ ?

SergKis: Dima пишет То есть имею точные координаты строка и колонка (числа) , нужно преобразовать к формату не RC http://clipper.borda.ru/?1-4-0-00000749-000-180-0 пост 3305

Dima: SergKis Спасибо


Pasha: Имеется числовая колонка, в ячейках которой может стоять разный формат, например 00000001 или 0000000001 если выбирать oCell:Value, то результат будет одинаковый: 1.00 Можно ли выбрать символьное преставление ячейки, или надо самому выбирать oCell:NumberFormat и дальше его анализировать и самому преобразовывать ?

Pasha: ага, есть еще свойство Text, там как раз то, что нужно Жаль, нельзя выбрать Text для Range, как Value, а там надо выбирать тысячи строк, будет мееедленноооо

Dima: Range......:NumberFormat:="@" не то ?

Pasha: Там в столбце 8700 ячеек, с разными комбинациями NumberFormat есть 00000000 есть 0000000000 и еще много чего есть и строковые. Это грубо говоря код предприятия для налогового отчета. Там и физлица, и юрлица, и паспортные данные встречаются, это будут строки, а не числа Да я уже опрашиваю свойство Text, по скорости намного медленнее будет, но переживут, по другому никак. Ни NumberFormat, ни Text для Range не возвращает массив как Value

SergKis: Pasha пишет по другому никак. "&nbsp;"+"000000000" // т.е. непрерывный пробел добавляем или "000000000"+"&nbsp;" PS можно repl("&nbsp;", 10)+<значение строковое> <значение строковое 1>+repl("&nbsp;", 10)+<значение строковое 2>

Pasha: У меня противоположная задача, не сформировать таблицу в Excel, а выбрать данные из сформированной сторонним ПО, или просто заполненной. А там формат ячеек может быть каким угодно

SergKis: Можно формировать xml файл из excel (делает быстро) и читать его, то же быстро и форматы данных от базы, т.е. свои

Pasha: Передаю объект TBrowse в Excel, имеется колонка типа дата Делаю: oCell:Value := d или oRange:Value := {...} где в массиве ячейки этого столбца имеют тип Date NumberFormat не устанавливаю В это случае Excel сам ставит формат ячейки Дата, и правильно передает и отображает значение Но у одного заказчика после недавно переустановленного Excel 2010 формат ячейки остается Общий, и значение отображается неправильно - там целое число Может в Excel есть какая-то настройка, чтобы он устанавливал формат ? С наверное сотнями пользователей с разными версиями Excel от 2003 до 2019 за десятки лет такой проблемы не было, с одним возникло Может дело в региональных стандартах ? Смотрю в Excel Параметры - Дополнительно - Использовать системные разделители - Галочка стоит. Непонятно

Haz: Проверьте что установлено в стилях ячеек у этого пользователя. Вкладка главная -> стили -> стили ячеек-> обычный-> правый клик-> изменить. Ps Однозначно решает вопрос предварительная установка numberformat в ячейки. Для себя отказался от заполнения через ole, гоню выгрузку сначала в XML, а через ole дорисовываю красоту. Продукты микрософт очень любят подсунуть нежданчик на ровном месте.

Pasha: мозги сломал, когда искал, почему oSheet:Columns(nCol):NumberFormat := "m/d/yyyy" не работает, хотя запись макросов дает такой именно это. надо так: oSheet:Columns(nCol):NumberFormat := "ДД.ММ.ГГГГ"

Dima: Pasha пишет: oSheet:Columns(nCol):NumberFormat := "m/d/yyyy" а я забил на фиг на такой формат и пишу так oSheet:Columns(nCol):NumberFormat :="@" oSheet:Cells( j, a ):Value:=" "+hb_dtoc(i,"DD.MM.YYYY")

Dima: Порча какая то с Excel Было [pre2] oSheet:Range(osheet:cells(j,1),osheet:cells(j,4)):NumberFormat:={"@","@", "# ##0.00","# ##0.00"} Работает [/pre2] Решил отрицательные числа сделать красным и не пашет , падает Excel [pre2] oSheet:Range(osheet:cells(j,1),osheet:cells(j,4)):NumberFormat:={"@","@", "# ##0.00;[Red]# ##0.00","# ##0.00;[Red]# ##0.00"} [/pre2] Как решить вопрос ?

Andrey: Я в 2015 году делал вот так. [pre2] // создаём окно ожидания с потоком WaitThreadCreate( 'Расчёт и вызов Excel ...' ) // Область с заполненными данными oRange := oExcel:ActiveCell:SpecialCells( 11 /*xlLastCell*/ ) nRowXls := oRange:Row // Последняя строка nColXls := oRange:Column // Последний столбец oSheet:Columns( 1 ):Autofit() oSheet:Cells[ 1, nRowXls + 1 ]:HorizontalAlignment := 4 // Выравнивание по правому краю ячейки oSheet:Cells[ 1, nRowXls + 1 ]:Font:ColorIndex := 3 // Шрифт красный oSheet:Cells[ 1, nRowXls + 1 ] := 'Итого сумма с минусом' oSheet:Cells[ 1, nRowXls + 2 ]:HorizontalAlignment := 4 oSheet:Cells[ 1, nRowXls + 2 ]:Font:ColorIndex := 5 // Шрифт синий oSheet:Cells[ 1, nRowXls + 2 ] := 'Итого сумма с плюсом' oSheet:Cells[ 1, nRowXls + 3 ]:HorizontalAlignment := 4 oSheet:Cells[ 1, nRowXls + 3 ] := 'Итого сумма' FOR nCol := 2 TO nColXls xValue := oSheet:Cells( 1, nCol ):Value IF 'OSTAT' $ xValue .OR. 'DOLG' $ xValue oSheet:Cells[ nCol, nRowXls + 1 ] := '=СУММЕСЛИ( R[-' + AllTrim( Str( nRowXls-1, 8) ) + ']C:R[-1]C; "<0" )' oSheet:Cells[ nCol, nRowXls + 1 ]:NumberFormat := '# ##0,00' oSheet:Cells[ nCol, nRowXls + 1 ]:Font:ColorIndex := 3 // Шрифт красный oSheet:Cells[ nCol, nRowXls + 2 ] := '=СУММЕСЛИ( R[-' + AllTrim( Str( nRowXls, 8) ) + ']C:R[-2]C; ">0" )' oSheet:Cells[ nCol, nRowXls + 2 ]:NumberFormat := '# ##0,00' oSheet:Cells[ nCol, nRowXls + 2 ]:Font:ColorIndex := 5 // Шрифт синий oSheet:Cells[ nCol, nRowXls + 3 ] := '=СУММ( R[-' + AllTrim( Str( nRowXls+1, 8) ) + ']C:R[-3]C)' oSheet:Cells[ nCol, nRowXls + 3 ]:NumberFormat := '# ##0,00' ENDIF IF 'DATE' $ xValue oSheet:Columns( nCol ):Autofit() ENDIF NEXT oSheet:Cells[ 2, nRowXls + 4 ]:Select() oExcel:Visible := .T. WaitThreadClose() // закрыть окно "ожидания" hWnd := oExcel:hWnd ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd )[/pre2]

Dima: Andrey Это понятно что и так можно сделать , так и сделал. Не понятно почему Excel выдав в своем же макросе NumberFormat "# ##0.00;[Red]# ##0.00" , отказывается с ним работать через олю в Harbour

PSP: Вот тут https://support.microsoft.com/en-us/office/number-format-codes-5026bbd6-04bc-48cd-bf33-80f18b4eae68 говорят, что надо как-то так: To indicate that a number format will be applied only if the number meets a condition that you have specified, enclose the condition in square brackets. The condition consists of a comparison operator and a value. For example, the following number format will display numbers that are less than or equal to 100 in a red font and numbers that are greater than 100 in a blue font. [Red][<=100];[Blue][>100]

Dima: PSP Спасибо , победить не смог На удачу сделал так [pre2] "# ##0.00;[Красный]# ##0.00" [/pre2] Блин , заработало Но так делать стрёмно , если у кого English Excel стоит. PS По идее в Excel должна быть переключалка языка для макросов , вот только где она живет.......надо поискать

Dima: Есть строка в таблице с группировкой , то есть слева от нее крестик , при нажатии на который раскроется еще скажем 20 строк. Группировка в строке делалась примерно так [pre2] oSheet:Range(.........):Select() WITH OBJECT oExcel:Selection :Rows:Group() ENDWITH [/pre2] Задача вот всю эту строку с группировкой надо бы переместить скажем после 3 строки таблицы Excel Не пойму как это сделать. Кто то делал похожее ?

Pasha: Создаю книгу, заполняю строки данными Беру oSheet:HPageBreaks:Count. получаю 4 разделителя страниц Визуально в книге их четыре и есть Затем в цикле их перебираю. От одного до трех все в порядке, получаю адрес и номер строки разделителя А на последний: oSheet:HPageBreaks(4) получаю ошибку: MEMBERNOTFOUND В чем ошибка ? Как получить последний разделитель ?

SergKis: Pasha Может от 0-3 ?

Pasha: Глюк становится еще непонятнее Копаю дальше. Оказывается, неважно сколько получается HPageBreaks, Excel дает только первые три, а с четвертого - ошибка Пересохранил книгу из формата xls в xlsx. Теперь Excel дает только первые два разделителя страниц, а с третьего и дальше - ошибка

Pasha: Может от 0-3 ? Нет, пробовал и так, нумерация всех коллекций в Excel идет с единицы

Pasha: Сбросил пример на файлообменник. Здесь Excel дает только два разделителя страниц, а дальше ошибка https://www.mediafire.com/file/gfo5rok5msncf3y/_pg.7z/file

Dima: Pasha пишет: Копаю дальше. Оказывается, неважно сколько получается HPageBreaks, Excel дает только первые три, а с четвертого - ошибка Пересохранил книгу из формата xls в xlsx. Теперь Excel дает только первые два разделителя страниц, а с третьего и дальше - ошибка у меня на 45-м упало Excel 2010

Pasha: Там всего 7 разделителей страниц

Dima: Pasha пишет: ам всего 7 разделителей страниц

Dima: HPageBreaks Count 211

Pasha: Еще страньше. Я гонял на Excel 2016 и 2007. А предварительный просмотр сколько страниц дает ? Должно быть 8, как раз 7 разделителей

Dima: Да 8

SergKis: PS. Наверно, это не надо (убрал лишнее), смотрим только Sheet2 в примере поставил nCnt := 8 или 10 (строки может надо анализировать) все загрузилось

Dima:

SergKis: Dima Спасибо. Наверно, я Пашу не понял, он про разделитель страниц, а я про Sheet (их тут три) А разве нельзя посчитать nCnt разделители от полученного кол-ва строк Sheet2, пробежав по ним ? Ведь полученное, у меня, HPageBreaks Count 218, явно врет

Pasha: У меня там строки разной высоты, поэтому я и выбираю те разделители, которые Excel поставил. Есть еще и сквозные строки, заголовки на каждой странице. Надо поймать все разделители страниц, и на каждой странице внизу добавить строку - итоги по странице. А разделители собаки такие не работают.

SergKis: Pasha пишет У меня там строки разной высоты, поэтому я и выбираю те разделители, которые Excel поставил. Так я и предлагаю их посчитать, пробежав по всем строкам (получив сначала их кол-во, в LibXL от этого пляшу, Sheet->кол-во строк->...), тут не важно высоты строк. Запомнить номер строки перед символом (получить список) и потом в обратном порядке этого списка добавлять строки итоги на каждый лист Sheet2

Pasha: Поскольку HPageBreaks конкретно глючит, нашел другое решение: В цикле по строкам опрашивать: if oSheet2:Rows(nRow):PageBreak # xlNone значит в этой строке разделитель страницы Медленно будет конечно, но пока по другому не получается

Dima: Паша лови решение oExcel:ActiveWindow:View:= xlPageBreakPreview // 2 nCnt := oSheet2:HPageBreaks:Count() // 7

Dima: Результат [pre2] 1 2 3 4 5 6 7 7: 38 70 102 136 170 202 234 [/pre2]

Pasha: Спасибо, заработало !

alex_II: Как сменить направление текста в ячейке?

Dima: alex_II Если мы про ориентацию то так например oSheet:cells(j,1):Orientation:=90

alex_II: Да, я это и имел в виду, спасибо

Dima: как сделать полноэкранный курсор (каким то цветом) в Excel ? ps я не про мышку

Dima: Проехали поставил FollowCellPointer

Dima: ComboBox кто нибудь делал в Excel средствами Harbour , можно примерчик ?

Andrey: Как в экселе сделать замену ВСЕХ символов ";" на "|" ? И подсчёт кол-ва замены можно сделать ? В Ворде знаю как, а в экселе не делал.

Alex_Cher: Андрей, привет ..... а у меня проблемы с вордом ... как в одной сроке установить разные символы ..? Вариант с поиском и заменой не подходит.

Dima: Andrey гугли )) https://www.excel-vba.ru/forum/index.php?topic=5574.0 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=99894&TITLE_SEO=99894-makros-zamena-zapyatoy-na-tochku

Andrey: Не пойму как макрос Экселя переделать в Харборовский код ? [pre2] oExcel := win_oleCreateObject( "Excel.Application" ) oExcel:Visible := .F. // .T. показать Excel на экране для отладки oExcel:DisplayAlerts := .F. // убрать предупреждения Excel oExcel:Workbooks:Open( cFile, 0 ) oBook := oExcel:ActiveWorkBook() oSheet := oExcel:ActiveSheet() oRange := oExcel:ActiveCell:SpecialCells( xlLastCell ) nXlsRecno := oRange:Row // количество строк таблицы Excel nXlsColumn := oRange:Column // количество колонок Excel - НЕ всегда РАБОТАЕТ НОРМАЛЬНО ! // если 1-я строка объединена, то не работает //nXlsColumn := oSheet:UsedRange:Columns:Count // количество колонок Excel - РАБОТАЕТ .... // макрос экселя Cells.Replace What:=";", Replacement:="|", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False[/pre2]

Pasha: Объект Cells - это oSheet:Cells Я тебе в телегу кидал описание метода Replace: expression.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat) expression Required. An expression that returns a Range object. Вместо ключевых параметров в макросе подставляешь позиционные для харбора

Andrey: Pasha пишет: Вместо ключевых параметров в макросе подставляешь позиционные для харбора Не понимаю как это сделать....

Pasha: Внимательно читаем инструкцию expression.Replace(... expression - это Cells, в макросе - Cells.Replace. Cells - это oSheet:Cells т.е. пишем: oSheet:Cells:Replace далее в инструции: expression.Replace(What, параметр What в макросе - это What:=";" т.е. пишем на харборе: oSheet:Cells:Replace(";", затем таким же макаром подставляем остальные параметры

Andrey: Pasha пишет: oSheet:Cells:Replace(";", Вот это и не знал как сделать ! Спасибо БОЛЬШОЕ ! Работает отлично ! [pre2] oSheet:Cells:Replace(";","|",xlPart,xlByRows,.F.,.F.,.F.)[/pre2] Только кол-во замен нет. Хотя это и не особо важно...

Andrey: Что-то совсем забыл как работать с Экселем.... Нужно удалить целиком первую строку в экселе. Макрос такой: [pre2] Rows("1:1").Select Selection.Delete Shift:=xlUp[/pre2] Как его переделать на Харбор ? Заранее БОЛЬШОЕ СПАСИБО за помощь.

Pasha: смотрим пример из minigui: Tsb4csvOle.prg /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2018 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region */ там в самом конце есть цикл с удалением строки: FOR nI := LEN(aLineDel) TO 1 STEP -1 nLine := aLineDel[nI] oSheet:Cells( nLine, 1 ):Value := nI oExcel:Rows(nLine):Delete() NEXT

Andrey: Pasha СПАСИБО БОЛЬШОЕ ! Памяти уже совсем нет...



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