On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
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 [только новые]


Dima
администратор




Пост N: 5435
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 18:50. Заголовок: Панченко пишет: Мож..


Панченко пишет:

 цитата:
Можешь написать?


Нет я не дружу с СИ

Панченко пишет:

 цитата:
Сегодня специально проверил - весь диапазон заполняется значением первого элемента массива.


Ну это не совсем так.
Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов.
Результат по всех строках был одинаков - первые 10 элементов массива.

Панченко пишет:

 цитата:
А в чем сомнения?


Да просто подумал , что ты вычитал где то в инете а на практике , не проверял.
Значит я ошибся !

Спасибо: 0 
Профиль
Панченко





Пост N: 97
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 19:35. Заголовок: Dima пишет: Ну это ..


Dima пишет:

 цитата:
Ну это не совсем так.
Я спецом тестил. Диапазон был 10 на 10 , 100 ячеек и ему я скормил массив из 100 элементов.
Результат по всех строках был одинаков - первые 10 элементов массива.


Странно. Мой массив:
11 12
21 22
31 32
Во все ячейки занеслось 11.

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




Пост N: 3384
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.15 20:07. Заголовок: Вопрос не в том, как..


Вопрос не в том, как передать массив по ссылке, или как это сделать на С. В харборе массивы и так передаются по ссылке.
Вопрос в том, как заполнить диапазон ячеек в 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 ?

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




Пост N: 5436
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 22:32. Заголовок: И у меня так же loc..


И у меня так же
 
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




http://shot.qip.ru/00Pp9x-5Ha2NU8N7/

Спасибо: 0 
Профиль
Панченко





Пост N: 98
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 26.12.15 23:20. Заголовок: Pasha пишет: В харб..


Pasha пишет:

 цитата:
В харборе массивы и так передаются по ссылке.


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

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




Пост N: 5438
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.12.15 23:40. Заголовок: Панченко пишет: r -..


Панченко пишет:

 цитата:
r - это имя переменной, хранящей адрес первого элемента массива


Примерчик выше проверь .

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




Пост N: 5439
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 09:47. Заголовок: А вот такой макрос з..


А вот такой макрос заполнит столбец в диапазоне
 
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



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




Пост N: 5440
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 10:02. Заголовок: Фокус покус Sub Fi..


Фокус покус

 
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




Сырец тут
http://www.studfiles.ru/preview/3568974/page:2/
Листинг 2.27.Заполнение диапазона

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




Пост N: 734
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.12.15 11:12. Заголовок: Dima пишет: rgRange..


Dima пишет:

 цитата:
rgRange.Value = alngValues


Дима, в VB это работает и полно примеров присвоения двумерного массива. Если это все перенести в Harbour
то не работает. Просто назначается всему диапазону первая строка массива

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




Пост N: 5441
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 11:21. Заголовок: Haz Да , пытался пр..


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

Спасибо: 0 
Профиль
Панченко





Пост N: 99
Зарегистрирован: 13.06.12
ссылка на сообщение  Отправлено: 27.12.15 12:13. Заголовок: Панченко пишет: С и..


Панченко пишет:

 цитата:
С интерпретацией этого значения в харборе вопросов не возникает.


Тоже не совсем так. Имеем массив 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 пишет:

 цитата:
В харборе массивы и так передаются по ссылке.




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




Пост N: 3385
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.12.15 20:48. Заголовок: По-видимому, причина..


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

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




Пост N: 3386
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.12.15 20:54. Заголовок: Панченко пишет: Тож..


Панченко пишет:

 цитата:
Тоже не совсем так. Имеем массив 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, то вызывающей функции будет доступен новый массив.

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




Пост N: 5442
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.15 21:17. Заголовок: Pasha пишет: Вот в..


Pasha пишет:

 цитата:
Вот в харборе заполнение и не работает.


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

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




Пост N: 735
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.12.15 22:41. Заголовок: Dima пишет: есть ко..


Dima пишет:

 цитата:
есть костыль


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

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




Пост N: 3387
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 07:58. Заголовок: Причем формат буфера..


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

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




Пост N: 736
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.12.15 10:45. Заголовок: Pasha пишет: Надо п..


Pasha пишет:

 цитата:
Надо попробовать у себя такой вариант.


Пробовал , работает и быстрее,
Pasha пишет:

 цитата:
Правда, при этом теряется информация о типе ячеек - все вставляется как строки.


Да, так и есть. Если не доверять Excel самостоятельно определить тип - то можно перед вставкой задать тип на все колонки через ОЛЮ
 
Пример для колонки 1
oSheet:Columns(1):Set( "NumberFormat", "(# ##0,00)" )


В догонку:
Вставка из буфера обмена производится в выделенный диапазон.
К примеру для массива 10 х 10
Можно использовать Range:
 
oSheet:Range( osheet:cells(1,1),osheet:cells(10,10) ):Select()
oSheet:Paste()

Можно ресайсить ячейку
 
oSheet:Cells(1,1):Resize(10,10):Select()
oSheet:Paste()

Результат будет одинаков







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




Пост N: 3388
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 13:22. Заголовок: Excel иногда преподн..


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

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




Пост N: 737
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.12.15 13:43. Заголовок: Pasha пишет: И откл..


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"
все это справедливо и с цифрами.

Аналогично и при вводе с клавиатуры , если задать формат ДО ввода - автопреобразования не происходит




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




Пост N: 3389
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.12.15 14:10. Заголовок: Паша, можно перед за..



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



Конечно, так и поступаю. По другому никак.

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