Форум » [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

Andrey: Dima пишет: Sheets("Лист1").Select Sheets("Лист1").Name = "XXX" Спасибо ! Получилось ! Почту свою напомни ?

Andrey: PSP пишет: А если создать без номера версии, прочитать версию, закрыть, а потом создать с нужным номером? Понимаю, что не очень красиво, но, имхо, правильней, чем в реестре рыться. Да не обязательно это делать ! Лист создаётся нормально, только при записи файла вылазит ОКНО-СОВМЕСТИМОСТИ ! Я для себя уже сделал проверку: IF nVerExcel > 11 // Excel 2003 // проверка совместимости на версиях старше 2003 // нельзя записать файл, так как вылазит ОКНО-СОВМЕСТИМОСТИ // из-за этого пускай юзер сам пишет файл lSave := .F. ENDIF

Pasha: Если при заполнении строки листа значениями из массива командой oSheet:Range(oSheet:Cells(nRow, nCol), oSheet:Cells(nRow, nCol2)):Value := aArray внутри строки есть формулы, то эти формулы сносятся, даже если в соответствующей позиции aArray находится значение nil Нет ли какой настройки, чтобы формулы сохранялись ? Или без вариантов ?


Панченко: В Foxpro есть следующая полезная фишка по быстрому заполнению области листа данными из массива с использованием указателя на него: aArray[ nRow, nCol ] - массив данных [pre2]WITH oEcel .WorkBooks.Add .Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=GetPtr("aArray") ENDWITH . . . Function GetPtr(cArrName) Return @&cArrName[/pre2] Очень удобно и быстро. Как добиться аналогичного результата в Harbour?

Dima: Панченко [pre2] oSheet:Range(osheet:cells(i,1),osheet:cells(i,15)):Value:=; {elem[1],elem[2],elem[3],elem[4],elem[5],elem[6],elem[7],; elem[8],elem[9],elem[10],elem[11],elem[12],elem[13],elem[14],dtoc(elem[15])} [/pre2] Выдрал у себя из сырца , думаю понятно. Впрочем можно и через WITH oEcel

Панченко: Dima Может быть я непонятно написал. Речь идет не о применении WITH или заполнении однрй строки. В моем примере заполняется весь прямоугольный диапазон ячеек за один раз за счет передачи в VALUE указателя на массив значений.

Dima: Панченко Смотри в этой теме пост 239 (от fil) и 3304 (от Pasha) Впрочем я показал тот же подход где VALUE присваивается массив

Панченко: Dima Эти сообщения я видел. Везде речь идет о заполнении ОДНОЙ строки. В примере на ФОКСе заполняется НЕСКОЛЬКО строк и колонок, что дает значительное сокращение времени. Т.е.: [pre]oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value = ...[/pre]

Панченко: Задача сводится к получению адреса массива. Кто знает С - подскажите, как должна выглядеть эта функция.

Dima: Панченко пишет: oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value = ... Думаю и тут чудно сработает oSheet:Range( oSheet:Cells(5,5),oSheet:Cells(10,70)):Value: =твой массив

Панченко: Dima пишет: Думаю и тут чудно сработает Увы... Уже проверял - не работает, заполнения всего диапазона не происходит.

Dima: счас подумаем

Pasha: В харборе массив всегда передается по адресу, так что его адрес получать не надо. Надо просто привоить ячейкам значение: <obj>:Value := aArray

Панченко: И в харборе, и в фоксе при присвоении :VALUE = aArray не заполняются 2, 3 и т.д. строки диапазона. В фоксе при присвоении :VALUE = <указатель на массив> все заполняется великолепно. Если же применить промежуточное присвоение типа <переменная> = <указатель на массив> :VALUE = <переменная> то получается заполнение то ли только первой строки, то ли все заполняется первым элементом массива - уже не помню. Кроме того, в функции, возвращающей указатель, массив должен быть виден (например, глобально). Хотел проверить это в харборе, но как получить указатель на массив? В С я "непонимэ".

fil: Считать в массив можно любой ранг из Excel, а вот писать только однострочный массив (по край мере не получилось) но всегда есть ADO..

Панченко: И все-таки, Си-шники, может кто-нибудь набросать функцию, возвращающую указатель на массив по его имени?

Панченко: Может это и бессмысленно, но нужна функция на С, на входе получающая массив (скажем R) и заканчивающаяся return &R. Увы, не знаю синтаксиса С.

Dima: Панченко Хочешь сказать что это ты сам реально проверил ? То есть вот так в Фоксе сработает правильно .Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=GetPtr("aArray") А вот так уже нет .Range(.Cells(x,y), .Cells(x+nRow-1,y+nCol-1)).Value=aArray

Панченко: Dima пишет: Хочешь сказать что это ты сам реально проверил ? А в чем сомнения? Первый вариант работает во многих моих программах, давно и надежно. Что не так со вторым - я писал выше, что уже не помню. Сегодня специально проверил - весь диапазон заполняется значением первого элемента массива.

Панченко: Именно поэтому и потому, что на практике сталкивался с разными "чудесами" в разных языках, я и прошу пример функции на С, которая принимала бы aArray или "aArray" и возвращала бы (без всяких промежуточных присваиваний) &aArray. Хочу проверить в харборе вариант присваивания ...:Value := <имя_этой_фунции>(aArray /или "aArray"/). Можешь написать?



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