Форум » [x]Harbour » Связать две таблицы Excel и заполнить поле » Ответить

Связать две таблицы Excel и заполнить поле

ort: Всем привет! На Харборе программирую недавно. Но тут возникла одна задача на Excel. Есть две таблицы - нужно пройтись по записям одной, найти ключевое значение во второй и заполнить в первой. То есть нужно сделать что-то типа SET RELATION + REPLACE. Начал разбираться в командах Excel - идет слишком туго! Помогите, может у кого есть работающий кусок кода такого типа. Пожалуйста, очень нужно! Сроки поджимают, а у меня ничего не выходит!

Ответов - 7

ort: Я открываю два файла: oExcel:workbooks:Open("Base1.xlsx",0) oExcel:workbooks:Open("Base2.xlsx",0) Не могу понять, как между ними переключаться?

alkresin: Я, правда, вордами и экзелями никогда не занимался, но, думаю, здесь надо oDoc1 := oExcel:workbooks:Open("Base1.xlsx",0) oDoc2 := oExcel:workbooks:Open("Base2.xlsx",0) ну и работать дальше с этими oDoc1 и oDoc2.

Pasha: workbooks - это коллекция, к элементам которой можно обращаться, в том числе по индексу. Но кроме книг, открытых программой, могут быть другие открытые книги, и можно "промазать" с индексом. Можно обратиться так: oExcel:workbooks:Open("Base1.xlsx",0) oBook1 := oExcel:ActiveWorkBook oExcel:workbooks:Open("Base2.xlsx",0) oBook2 := oExcel:ActiveWorkBook


Pasha: ort пишет: Всем привет! На Харборе программирую недавно. Но тут возникла одна задача на Excel. Есть две таблицы - нужно пройтись по записям одной, найти ключевое значение во второй и заполнить в первой. То есть нужно сделать что-то типа SET RELATION + REPLACE. Меня смутила фраза "задача на Excel". Подумалось - речь идет о VBA А если задача для харбора - то можно сделать так: Сначала цикл по второй книге, выбрать все данные в массив: oSheet2 := oBook2:ActiveSheet for nRow := ... to ... AADD(aRows, {oSheet2:Cells(nRow, 1):Value, oSheet2:Cells(nRow, 2):Value, ...}) next Затем цикл по первой книге, считать значение нужной ячейки, найти элемент по ключу в массиве, и записать в соседнюю ячейку соответствующие данные из массива. Можно даже не открывать одновременно обе книги. Сначала открыть одну, выбрать данные, закрыть. Затем открыть вторую.

Dima: Pasha пишет: Можно даже не открывать одновременно обе книги. Сначала открыть одну, выбрать данные, закрыть. Затем открыть вторую. +1

ort: Pasha пишет: Сначала цикл по второй книге, выбрать все данные в массив: Затем цикл по первой книге, считать значение нужной ячейки, найти элемент по ключу в массиве, и записать в соседнюю ячейку соответствующие данные из массива. Можно даже не открывать одновременно обе книги. Сначала открыть одну, выбрать данные, закрыть. Затем открыть вторую. Паша, спасибо за наводку! Сам к этому решению только что пришел!

Pasha: alkresin пишет: Я, правда, вордами и экзелями никогда не занимался, но, думаю, здесь надо oDoc1 := oExcel:workbooks:Open("Base1.xlsx",0) oDoc2 := oExcel:workbooks:Open("Base2.xlsx",0) ну и работать дальше с этими oDoc1 и oDoc2. В chm к Excel 2013 для метода Open сказано: Return Value A Workbook object that represents the opened workbook В chm к Excel 2003 ничего о возвращаемом значении не говорится. Так что непонятно, возвращает ли в ранних версиях Office этот метод объект WorkBook, и начиная с какой версии возвращает.



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