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





Пост N: 138
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 24.12.18 21:43. Заголовок: Связать две таблицы Excel и заполнить поле


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]







Пост N: 139
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 25.12.18 21:03. Заголовок: Я открываю два файла..


Я открываю два файла:
oExcel:workbooks:Open("Base1.xlsx",0)
oExcel:workbooks:Open("Base2.xlsx",0)

Не могу понять, как между ними переключаться?

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1139
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.12.18 21:47. Заголовок: Я, правда, вордами и..


Я, правда, вордами и экзелями никогда не занимался, но, думаю, здесь надо

oDoc1 := oExcel:workbooks:Open("Base1.xlsx",0)
oDoc2 := oExcel:workbooks:Open("Base2.xlsx",0)

ну и работать дальше с этими oDoc1 и oDoc2.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3820
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.12.18 22:04. Заголовок: workbooks - это колл..


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3821
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.12.18 22:17. Заголовок: ort пишет: Всем при..


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

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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6992
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.12.18 22:23. Заголовок: Pasha пишет: Можно ..


Pasha пишет:

 цитата:
Можно даже не открывать одновременно обе книги. Сначала открыть одну, выбрать данные, закрыть. Затем открыть вторую.


+1

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 140
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 25.12.18 22:59. Заголовок: Pasha пишет: Сначал..


Pasha пишет:

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


Паша, спасибо за наводку!
Сам к этому решению только что пришел!

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3822
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.18 11:04. Заголовок: alkresin пишет: Я, ..


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, и начиная с какой версии возвращает.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 403
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет