On-line: Andrey, SergKis, гостей 1. Всего: 3 [подробнее..]
АвторСообщение
администратор




Пост N: 2372
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL (продолжение)


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]







Пост N: 272
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 26.07.20 21:39. Заголовок: Andrey пишет: Испра..


Andrey пишет:

 цитата:
Исправления и правка приветствуются !
Как считать со скрытого листа, даже ещё и не знаю и не пробовал ....



макросы скрытые листы могут не видеть, нужно сначала открыть

Sheets("List").Visible = -1 // делаем видимым
Sheets("list").Visible = 2 // 2 -суперскрытый, 0 - обычный скрытый

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




Пост N: 6786
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 12:48. Заголовок: Всем привет ! Опять ..


Всем привет !
Опять беда с этими версиями экселя.
У меня код работает, у других тоже, а у некоторых вылет.
Вот код:
 
// Используем 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" // имя листа изменить

Ошибка вот такая:
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

Как исправить код, чтобы на всех Экселях работало ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7238
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.20 13:44. Заголовок: может как то так oSh..


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3966
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.20 13:55. Заголовок: В параметрах экселя ..


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

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




Пост N: 6787
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 14:35. Заголовок: Pasha пишет: В пара..


Pasha пишет:

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


У меня на 2003 работает, а на 2016 нет.
Сам смотрел у заказчика - прога падает.
Смотри почту.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3967
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.20 14:43. Заголовок: Как исправить код, ч..



 цитата:
Как исправить код, чтобы на всех Экселях работало ?



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

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




Пост N: 6788
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 14:47. Заголовок: Dima пишет: может к..


Dima пишет:

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


Поставил у себя, работает.
Жалко что заказчик отключился и нет Экселя 2016 чтобы проверит.
Спасибо Dima !

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3968
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.20 16:49. Заголовок: Смотрю доку по VBA E..


Смотрю доку по 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 ]
Они либо оба сработают, либо оба не сработают

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




Пост N: 6789
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 16:58. Заголовок: Нашёл 2016 эксел. Не..


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3969
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.20 17:25. Заголовок: Файл - Параметры - О..


Файл - Параметры - Общие - При создании новых книг - Число листов - ...

Но таки да, похоже в 2016 по умолчанию стоит 1, а не 3, как в предыдущих версиях. Но походу это значение меняется, так что надо проверять Sheets:Count

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




Пост N: 6790
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 17:38. Заголовок: Переход на лист по и..


Переход на лист по индексу:
oSheets:Item(3):Select()            // перейдём на 3 лист

А как переходить по имени листа ?
Лист1, Лист2, ...

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




Пост N: 6791
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.20 19:08. Заголовок: Блин, столько мороки..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7239
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.20 19:16. Заголовок: Andrey пишет: Вынос..


Andrey пишет:

 цитата:
Вынос мозга чтобы на всех версиях работало


Нет ни какого выноса , нужно найти правильный подход , думай

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 87
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 21.09.20 13:24. Заголовок: Здравствуйте, коллег..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1597
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.09.20 13:30. Заголовок: LYSK пишет: Что пос..


LYSK пишет:

 цитата:
Что посоветуете?

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

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




Пост N: 6818
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.09.20 16:10. Заголовок: LYSK пишет: Уверен,..


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. Второй не знаю как сделать.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1598
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.09.20 18:12. Заголовок: Andrey пишет: Кол-в..


Andrey пишет:

 цитата:
Кол-во листов при создании 1. Второй не знаю как сделать.


Все в исходниках
 
oSheet1 := oXml:addSheet( "Sheet1" )
// Если нужно еще , добавляем еще
oSheet2 := oXml:addSheet( "Sheet2" )

Дале запись в нужный шит

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7251
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.10.20 19:20. Заголовок: LYSK Либа LibXL..


LYSK
Либа LibXL
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 132
Зарегистрирован: 09.09.11
ссылка на сообщение  Отправлено: 01.12.20 07:01. Заголовок: Добрый день, коллеги..


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

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




Пост N: 7014
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.08.21 12:59. Заголовок: Нашёл на просторах и..


Нашёл на просторах инета... случайно.
Графики на Экселе
http://mail.hmgforum.com/viewtopic.php?t=6600

Всяко-разное:
******************************************************************************************************* 
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"))

*******************************************************************************************************


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 247
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет