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

Dima: Панченко пишет: Можешь написать? Нет я не дружу с СИ Панченко пишет: Сегодня специально проверил - весь диапазон заполняется значением первого элемента массива. Ну это не совсем так. Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов. Результат по всех строках был одинаков - первые 10 элементов массива. Панченко пишет: А в чем сомнения? Да просто подумал , что ты вычитал где то в инете а на практике , не проверял. Значит я ошибся !

Панченко: Dima пишет: Ну это не совсем так. Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов. Результат по всех строках был одинаков - первые 10 элементов массива. Странно. Мой массив: 11 12 21 22 31 32 Во все ячейки занеслось 11.

Pasha: Вопрос не в том, как передать массив по ссылке, или как это сделать на С. В харборе массивы и так передаются по ссылке. Вопрос в том, как заполнить диапазон ячеек в Excel из массива В книге Excel добавляю такой макрос: Sub Макрос1() ' Dim AStr(1 To 6) As String AStr(1) = "1" AStr(2) = "2" AStr(3) = "3" AStr(4) = "4" AStr(5) = "5" AStr(6) = "6" Range("A1:C2").Value = AStr Range("A1:C2").Select End Sub после его выполнения ячейки заполняются так: 1 2 3 1 2 3 Точно так же делает харбор через механизм OLE. А как можно заполнить диапазон в fox ? Желательно, чтобы это можно было бы воспроизвести через VBA ?


Dima: И у меня так же [pre2] local j:=1 local arr:={} local oExcel := CreateObject( "Excel.Application" ) local oWorkBook := oExcel:WorkBooks:Add() local oSheet := oExcel:ActiveSheet() for j=1 to 100 aadd(arr,j) next oExcel:Visible := .t. oSheet:Range(osheet:cells(1,1),osheet:cells(10,10)):Value:=arr [/pre2] http://shot.qip.ru/00Pp9x-5Ha2NU8N7/

Панченко: Pasha пишет: В харборе массивы и так передаются по ссылке. Я выше уже писал, что фоксовский трюк работает только напрямую, без промежуточного присвоения адреса. Вся разница в том, в терминах харбор @r - это число, а r - это имя переменной, хранящей адрес первого элемента массива. С интерпретацией этого значения в харборе вопросов не возникает. А при передаче в Excel желаемого эффекта не происходит. Поэтому я и хотел попробовать передать в Excel именно число.

Dima: Панченко пишет: r - это имя переменной, хранящей адрес первого элемента массива Примерчик выше проверь .

Dima: А вот такой макрос заполнит столбец в диапазоне [pre2] Sub Macros1() Dim a(1 To 10, 1 To 1) For i = 1 To 10 a(i, 1) = i Next Worksheets("Лист1").Range(Cells(1, 1), Cells(10, 1)).Value = a End Sub [/pre2]

Dima: Фокус покус [pre2] Sub FillCellRect1() Dim lngRows As Long, intCols As Integer Dim lngRow As Long, intCol As Integer Dim lngStep As Long, lngVal As Long Dim alngValues() As Long Dim rgRange As Range lngVal = 1 lngStep = 1 lngRows = Val(InputBox("Количество ячеек в высоту")) intCols = Val(InputBox("Количество ячеек в ширину")) ReDim alngValues(1 To lngRows, 1 To intCols) Set rgRange = ActiveCell.Range(Cells(1, 1), Cells(lngRows, intCols)) For lngRow = 1 To lngRows For intCol = 1 To intCols alngValues(lngRow, intCol) = lngVal lngVal = lngVal + lngStep Next intCol Next lngRow ' Перенос значений из массива в таблицу rgRange.Value = alngValues End Sub [/pre2] Сырец тут http://www.studfiles.ru/preview/3568974/page:2/ Листинг 2.27.Заполнение диапазона

Haz: Dima пишет: rgRange.Value = alngValues Дима, в VB это работает и полно примеров присвоения двумерного массива. Если это все перенести в Harbour то не работает. Просто назначается всему диапазону первая строка массива

Dima: Haz Да , пытался преобразовать в Harbour , не получилось

Панченко: Панченко пишет: С интерпретацией этого значения в харборе вопросов не возникает. Тоже не совсем так. Имеем массив r := { 1, 2, 3, 4, 5 } и функции [pre2]function fun1( arr ) arr[ 5 ] := 9 return nil function fun2( arr ) arr := { 7, 8, 9 } return nil[/pre2] Если fun1( r ) и fun1( @r ) дают одинаковый результат, то fun2( r ) и fun2( @r ) - разный. Несмотря на то, что Pasha пишет: В харборе массивы и так передаются по ссылке.

Pasha: По-видимому, причина того, что в харборе не работает заполнение диапазона ячеек, следующая: Для типа VARIANT двумерный массив можно представить и как одномерный массив, каждый элемент которого является массивом, и как двумерный вариантный массив. Харбор, что естественно, использует первый вариант. А для заполнения диапазона ячеек нужен второй вариант. Вот в харборе заполнение и не работает.

Pasha: Панченко пишет: Тоже не совсем так. Имеем массив r := { 1, 2, 3, 4, 5 } и функции function fun1( arr ) arr[ 5 ] := 9 return nil function fun2( arr ) arr := { 7, 8, 9 } return nil Если fun1( r ) и fun1( @r ) дают одинаковый результат, то fun2( r ) и fun2( @r ) - разный. Несмотря на то, что Pasha пишет: цитата: В харборе массивы и так передаются по ссылке. В харборе массивы передаются всегда по ссылке. Благодаря этому функция, которая получает массив в качестве параметра, может изменять значение массива, а так же изменять его размерность. Когда в такой функции выполняется присвоение вида: arr := {...} первоначальный массив arr уничтожается, вернее, уменьшается на единицу счетчик его использования, и, если он будет равен нулю, при последующей сборке мусора эти элементы будут уничтожены. А переменной arr присваивается новый массив. Если же переменная arr передана функции по ссылке: как @arr, то вызывающей функции будет доступен новый массив.

Dima: Pasha пишет: Вот в харборе заполнение и не работает. В принципе есть костыль для этого (идея не моя). Массив "правильно" сложить в буффер обмена а затем сделать вставку в Excel.

Haz: Dima пишет: есть костыль Этот костыль успешно прижился в методе :Excel() из класса TsBrowse в Minigui

Pasha: Причем формат буфера обмена там предельно простой: разделитель столбцов по строке - табуляция Chr(9), а разделитель строк - Chr(13). Надо попробовать у себя такой вариант. Все-таки будет быстрее работать, причем гораздо. Правда, при этом теряется информация о типе ячеек - все вставляется как строки. Но такая информация не очень - то и нужна, Excel сам преобразовывает типы данных. Правда, иногда так преобразовывает, что лучше бы не преобразовывал. Но это уже другой вопрос.

Haz: Pasha пишет: Надо попробовать у себя такой вариант. Пробовал , работает и быстрее, Pasha пишет: Правда, при этом теряется информация о типе ячеек - все вставляется как строки. Да, так и есть. Если не доверять Excel самостоятельно определить тип - то можно перед вставкой задать тип на все колонки через ОЛЮ [pre2] Пример для колонки 1 oSheet:Columns(1):Set( "NumberFormat", "(# ##0,00)" ) [/pre2] В догонку: Вставка из буфера обмена производится в выделенный диапазон. К примеру для массива 10 х 10 Можно использовать Range: [pre2] oSheet:Range( osheet:cells(1,1),osheet:cells(10,10) ):Select() oSheet:Paste() [/pre2] Можно ресайсить ячейку [pre2] oSheet:Cells(1,1):Resize(10,10):Select() oSheet:Paste() [/pre2] Результат будет одинаков

Pasha: Excel иногда преподносит сюрпризы. Скажем, обычная строка вида 03/07 или 07/13 неожиданно становится "03 июля" или "июль 2013" Такой же фокус может случиться с числом. Причем фокус-покус происходит, если просто вводить такие данные с клавиатуры. И отключить автоматическое преобразование типов в Excel никак нельзя.

Haz: Pasha пишет: И отключить автоматическое преобразование типов в Excel никак нельзя. Паша, можно перед записью в ячейку указать формат. Можно указать формат всей строки, всей колонки , любого диапазона ячеек или одной ячейки Если попытаться через ОЛЮ записать в ячейку (1:1) строку вида вида 03/07 то Excel преобразует ее к дате и получим бред "03 июля" т.е. простое oSheet:Cells(1,1):Value := "03/07" выдаст "03 июля" Если перед записью указать формат oSheet:Columns(1):Set( "NumberFormat", "@" ) // Вся первая колонка листа назначается символьного формата oSheet:Cells(1,1):Value := "03/07" выдаст правильную строку в ячейке "03/07" все это справедливо и с цифрами. Аналогично и при вводе с клавиатуры , если задать формат ДО ввода - автопреобразования не происходит

Pasha: Паша, можно перед записью в ячейку указать формат Конечно, так и поступаю. По другому никак.



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