On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
Dima
администратор




Пост 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 [только новые]


MIKHAIL





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


Andrey пишет:

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



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

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

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




Пост 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 
Профиль
Dima
администратор




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


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

Спасибо: 0 
Профиль
Pasha
Администратор




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


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

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




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


Pasha пишет:

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


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

Спасибо: 0 
Профиль
Pasha
Администратор




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



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



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

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




Пост 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 
Профиль
Pasha
Администратор




Пост 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 
Профиль
Andrey
постоянный участник




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


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

Спасибо: 0 
Профиль
Pasha
Администратор




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


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

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

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




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


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

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

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




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


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

Спасибо: 0 
Профиль
Dima
администратор




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


Andrey пишет:

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


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

Спасибо: 0 
Профиль
LYSK





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


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

Спасибо: 0 
Профиль
Haz
администратор




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


LYSK пишет:

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

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

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




Пост 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 
Профиль
Haz
администратор




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


Andrey пишет:

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


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

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

Спасибо: 0 
Профиль
Dima
администратор




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


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


Спасибо: 0 
Профиль
Oskar_AAA



Пост 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 
Профиль
Andrey
постоянный участник




Пост 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 [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 372
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет